这个问题是关于在没有操作系统的情况下对小型微控制器进行编程。特别是,我目前对图片感兴趣,但问题很笼统。
我已经多次看到以下模式来保持时间:
定时器中断代码(比如定时器每秒触发一次):
...
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 秒触发计时器也可以用于其他目的)。
还有其他想法吗?