这个问题是关于编程没有OS的小型微控制器。特别是,我目前对PICs感兴趣,但问题是一般的。使用定时器保持时间中断嵌入式微控制器
我见过几次的保持时间以下模式:
定时器中断代码(比如定时器触发每秒):
...
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秒定时器也可用于其他目的)。
还有其他想法吗?
有趣的方法,虽然怀疑比禁用中断更清洁。我不知道我需要volatile,因为无论如何编译器优化都是禁用的。 – 2009-05-21 13:08:05
我希望这己技巧被注释掉,当你使用它,因为它要气色好怪异的人谁不立即意识到它的防护安剑铮,卓杰中断改变一个“C指令”中的值。 – Martin 2009-05-22 06:50:03
从多个内存映射寄存器中读取禁用中断不起作用时,它也可以工作。 – Dipstick 2009-05-22 15:53:41