这个问题是关于在没有操作系统的情况下对小型微 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/