gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:58:07 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com