我目前正在研究C中的微控制器项目,该项目需要进行多个定时功能.我使用硬件定时器每毫秒产生一个中断,变量作为计数器产生适当的时间间隔.硬件细节并不重要.
例如,对于特定函数,将在1ms计数器的每个滴答上执行以下代码,从而导致每10ms调用一次Function().
if (count < 10)
{
count++;
}
else
{
Function();
count = 0;
}
Run Code Online (Sandbox Code Playgroud)
我想实现一个包装函数,以避免为每个不同的时间间隔重写计数器代码,即:
TimerWrapper(required interval 1, Function 1 pointer)
TimerWrapper(required interval 2, Function 2 pointer)
Run Code Online (Sandbox Code Playgroud)
并在计时器的每个刻度上调用它.为了实现这一点,包装器调用的每个不同函数都需要有一个单独的计数变量,需要在TimerWrapper()的调用之间保持不变.我想将所有实现细节与我的主程序分开,并尽可能少地将变量引入我的主程序.
有可能做我要问的事情,还是有更简单/更好的方法来达到同样的效果?我知道如何用面向对象的语言做到这一点但我的技能缺乏简单的C.
我想根据以下结构:
struct interrupt_responder
{
int count;
int rep_count;
void (*handler)(void);
};
Run Code Online (Sandbox Code Playgroud)
然后创建尽可能多的此类结构,因为您有不同的计数器,已适当初始化:
static struct interrupt_responder c1 = { 0, 10, Function };
Run Code Online (Sandbox Code Playgroud)
您安排与响应者调用函数:
void time_wrapper(struct interrupt_responder *r)
{
if (++r->count >= r->max_count)
{
r->count = 0;
(*r->handler)();
}
}
Run Code Online (Sandbox Code Playgroud)
响应中断调用的函数只需要知道如何time_wrapper每次使用适当的参数调度调用.
void millisecond_interrupt_handler(void)
{
time_wrapper(&c1);
…
}
Run Code Online (Sandbox Code Playgroud)
或者你可以有一个中断响应器数组,毫秒中断处理程序可以遍历数组,调用时间包装器函数.
您将拥有一组中断响应程序的文件范围变量,但它们不需要在文件外可见.如果您需要处理程序函数的不同参数列表,那么生活就会变得棘手 - 如果可能的话,请避免使用它.但是,从评论中可以看出它不会成为问题 - 嵌入式函数指针总是如此void (*handler)(void).
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |