【问题标题】:Global Timer Interrupt for Time in Microcontroller微控制器中时间的全局定时器中断
【发布时间】:2016-10-31 20:09:12
【问题描述】:

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

我的解决方案是为一个以 1 KHz 触发的 MSP-430 微型计时器创建一个 ISR。它只是为每个 ISR 条目增加一个无符号长整数(因此每个刻度为 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))
    ...

【问题讨论】:

    标签: c timer interrupt msp430


    【解决方案1】:

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

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

    【讨论】:

    • 这听起来是个好主意!你有没有这样的例子?
    • @Russell 这是商业代码。抱歉,没有机会。
    猜你喜欢
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多