gpt4 book ai didi

c - 微 Controller 中的全局定时器时间中断

转载 作者:行者123 更新时间:2023-11-30 15:04:17 26 4
gpt4 key购买 nike

我有很多不同的时间来跟踪我的设计,但没有什么是 super 关键的。 10 毫秒 +/- 几毫秒根本不是什么大问题。但是可能有 10 个不同的定时器同时在不同的周期进行计数,显然我没有足够的专用定时器来支持 MSP-430 中每个定时器的独立定时器。

我的解决方案是为以 1 KHz 触发的 MSP-430 微型定时器创建单个 ISR。它只是为每个 ISR 条目增加一个 unsigned long(因此每个时钟周期为 1 毫秒)。然后在我的代码中的其他地方,我可以使用下面的 SET_TIMER 和 EXPIRED 定义调用来检查是否已经过了一定的时间。我的问题是,这是保持“全局”时间的好方法吗?

计时器定义:

typedef unsigned long TIMER;
extern volatile TIMER Tick;
#define SET_TIMER(t,i) ((t)=Tick+(i))
#define EXPIRED(t) ((long)((t)-Tick)<0)

定时器中断服务例程:

void TIMER_B0_ISR(void)
{
Tick++;
}

单个文件中的用法示例:

case DO_SOMETHING:
if (EXPIRED(MyTimer1))
{
StateMachine = DO_SOMETHING_ELSE;
SET_TIMER(MyTimer1, 100);
}
break;

case DO_SOMETHING_ELSE:
if (EXPIRED(MyTimer1))
...

最佳答案

您的方案检查计时器环绕的成本相对较高 - 目前您似乎没有这样做(您需要在检查“时间已过期”的所有地方进行检查 - 这就是为什么您通常会这样做的原因只想要一个这样的地方)。

我通常使用计时器到期条目的排序链表,其中列表头作为最早到期的计时器。然后,ISR 只需检查该单个条目,就可以直接通知该单个订阅者。

关于c - 微 Controller 中的全局定时器时间中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40349805/

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