如何为使用不同参数调用的给定函数实现单独的静态变量
How to implement separate static variables for a given function called with different parameters
我目前正在使用 C 语言开发一个微控制器项目,该项目需要执行多个定时功能。我正在使用硬件计时器每毫秒产生一个中断,并使用变量作为计数器来产生适当的时间间隔。硬件细节并不重要。
例如,对于一个特定的函数,以下代码将在 1 毫秒计数器的每个刻度上执行,导致每 10 毫秒调用一次 Function()。
if (count < 10)
{
count++;
}
else
{
Function();
count = 0;
}
我想实现一个包装函数以避免为每个不同的间隔重写计数器代码,即:
TimerWrapper(required interval 1, Function 1 pointer)
TimerWrapper(required interval 2, Function 2 pointer)
并在计时器的每个滴答声中调用它。为此,包装器调用的每个不同函数都需要有一个单独的计数变量,该变量需要在 TimerWrapper() 的调用之间保持不变。我想将所有实现细节与我的主程序分开,并尽可能少地在我的主程序中引入变量。
是否可以按照我的要求做,或者是否有 simpler/better 方法可以达到同样的效果?我知道如何使用面向对象的语言来做到这一点,但我缺乏纯 C 语言的技能。
我会考虑以下结构:
struct interrupt_responder
{
int count;
int rep_count;
void (*handler)(void);
};
然后你创建尽可能多的这样的结构,因为你有不同的计数器,适当地初始化:
static struct interrupt_responder c1 = { 0, 10, Function };
您安排与响应者调用函数:
void time_wrapper(struct interrupt_responder *r)
{
if (++r->count >= r->max_count)
{
r->count = 0;
(*r->handler)();
}
}
为响应中断而调用的函数只需要知道如何每次使用适当的参数将调用分派给 time_wrapper
。
void millisecond_interrupt_handler(void)
{
time_wrapper(&c1);
…
}
或者你可以有一个中断响应者数组,毫秒中断处理程序可以遍历该数组,调用时间包装函数。
您将拥有一组用于中断响应程序的文件范围变量,但它们不需要在文件外部可见。如果处理函数需要不同的参数列表,那么生活就比较棘手——如果可能的话,请避免这种情况。然而,从评论看来这不会成为问题——嵌入式函数指针将始终是 void (*handler)(void)
.
我目前正在使用 C 语言开发一个微控制器项目,该项目需要执行多个定时功能。我正在使用硬件计时器每毫秒产生一个中断,并使用变量作为计数器来产生适当的时间间隔。硬件细节并不重要。
例如,对于一个特定的函数,以下代码将在 1 毫秒计数器的每个刻度上执行,导致每 10 毫秒调用一次 Function()。
if (count < 10)
{
count++;
}
else
{
Function();
count = 0;
}
我想实现一个包装函数以避免为每个不同的间隔重写计数器代码,即:
TimerWrapper(required interval 1, Function 1 pointer)
TimerWrapper(required interval 2, Function 2 pointer)
并在计时器的每个滴答声中调用它。为此,包装器调用的每个不同函数都需要有一个单独的计数变量,该变量需要在 TimerWrapper() 的调用之间保持不变。我想将所有实现细节与我的主程序分开,并尽可能少地在我的主程序中引入变量。
是否可以按照我的要求做,或者是否有 simpler/better 方法可以达到同样的效果?我知道如何使用面向对象的语言来做到这一点,但我缺乏纯 C 语言的技能。
我会考虑以下结构:
struct interrupt_responder
{
int count;
int rep_count;
void (*handler)(void);
};
然后你创建尽可能多的这样的结构,因为你有不同的计数器,适当地初始化:
static struct interrupt_responder c1 = { 0, 10, Function };
您安排与响应者调用函数:
void time_wrapper(struct interrupt_responder *r)
{
if (++r->count >= r->max_count)
{
r->count = 0;
(*r->handler)();
}
}
为响应中断而调用的函数只需要知道如何每次使用适当的参数将调用分派给 time_wrapper
。
void millisecond_interrupt_handler(void)
{
time_wrapper(&c1);
…
}
或者你可以有一个中断响应者数组,毫秒中断处理程序可以遍历该数组,调用时间包装函数。
您将拥有一组用于中断响应程序的文件范围变量,但它们不需要在文件外部可见。如果处理函数需要不同的参数列表,那么生活就比较棘手——如果可能的话,请避免这种情况。然而,从评论看来这不会成为问题——嵌入式函数指针将始终是 void (*handler)(void)
.