embedded - 使用定时器计时会中断嵌入式微 Controller

标签 embedded interrupt microchip pic18

这个问题是关于在没有操作系统的情况下对小型微 Controller 进行编程的。我目前对 PIC 特别感兴趣,但问题很笼统。

我已经多次看到以下计时模式:

定时器中断代码(假设定时器每秒触发一次):

...
if (sec_counter > 0)
  sec_counter--;
...

主线代码(不间断):

sec_counter = 500; // 500 seconds

while (sec_counter)
{
  // .. do stuff
}

主线代码可能会重复,将计数器设置为各种值(不仅仅是秒)等等。

在我看来,当主线代码中对 sec_counter 的分配不是原子的时,这里就存在竞争条件。例如,在 PIC18 中,赋值被转换为 4 个 ASM 语句(当时加载每个字节并在此之前从存储体中选择正确的字节)。如果中断代码出现在中间,则最终值可能会被损坏。

奇怪的是,如果分配的值小于 256,则分配是原子的,因此没有问题。

我对这个问题的看法正确吗? 您使用什么模式来正确实现此类行为?我看到几个选项:

  • 在每次分配给 sec_counter 之前禁用中断并在之后启用 - 这不太好
  • 不要使用中断,而是使用启动然后轮询的单独计时器。这很干净,但是用掉了整个计时器(在前面的情况下,1 秒触发计时器也可以用于其他目的)。

还有其他想法吗?

最佳答案

PIC 架构是最原子的。它确保对内存文件的所有读取-修改-写入操作都是“原子的”。虽然执行整个读取-修改-写入需要 4 个时钟周期,但所有 4 个时钟周期都消耗在一条指令中,并且下一条指令使用下一个 4 个时钟周期。这就是管道的工作方式。在 8 个时钟周期中,有两条指令在管道中。

如果该值大于 8 位,则会出现问题,因为 PIC 是 8 位机器,并且较大的操作数在多个指令中处理。这将引入原子问题。

关于embedded - 使用定时器计时会中断嵌入式微 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/892661/

相关文章:

c - 内核模块 : request_irq() returns -22, 中的中断处理无效参数

c# - 执行阻塞方法时返回数据

linux - 在内核代码中禁用同步中断

c - Pic16f723 尝试通过 rs 232 发送数据 tx 失败,printf 卡住了图片

c - 如何检查整个程序是否在ARM上烧录?

c - C 中的结构、内部结构和大小

CRC字节顺序变换

Contiki时钟时间模块不更新

compiler-construction - Microchip PIC C18 编程文件格式 .COFF 与 .HEX

c - 如何用 C 语言通过 PIC 微 Controller 的 UART 编写十六进制字符串?