微控制器中全局定时器中断的时间

时间:2016-10-31 20:09:13

标签: c timer interrupt msp430

我有很多不同的时间来跟踪我的设计,但没有什么是超级关键的。 10ms +/-几毫秒根本不是什么大问题。但是可能有10个不同的计时器同时计算在不同的时间段,显然我没有足够的专用计时器来支持MSP-430中他们自己的独立计时器中的每一个。

我的解决方案是为MSP-430微型定时器创建一个ISR,以1 KHz的频率发射。它只是为每个ISR条目递增一个无符号长整数(因此每个tick为1 ms)。然后我的代码中的其他地方我可以使用下面的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))
    ...

1 个答案:

答案 0 :(得分:1)

您的方案检查计时器环绕是相对昂贵的 - 您目前似乎没有这样做(您需要在检查“时间已过期”的所有地方检查它 - 这就是您正常的原因只想要一个这样的地方)。

我通常使用已排序的计时器到期条目列表,列表头作为最早到期的计时器。然后,ISR只需检查此单个条目,并可直接通知该单个订户。