struct _Timing
{
void(*Timing)(void);
struct _Timing *Next;
};
static struct _Timing * TimingHead = NULL;
//列表函数遍历运行
static void Run_Timing(void)
{
struct _Timing *current = TimingHead;
while(current !=NULL)
{
if(current->Timing)current->Timing();
current = current->Next;
}
}
//函数加入列表
void PushTiming(void(*timing)(void))
{
struct _Timing* new_node = TimingHead;
struct _Timing** head_ref = &TimingHead;
//遍历链表,排除重复函数
while(new_node !=NULL)
{
if(new_node->Timing == timing)return ;
new_node = new_node->Next;
}
#if 1 //空间已经分配好(限制10数量)
static struct _Timing Node[10] = {0}; //函数内部全局变量
static u8 Cnt = 0; //分配数量
new_node = NULL;
if(Cnt<sizeof(Node)/sizeof(Node[0]))
{
new_node = NULL;
new_node = &Node[Cnt++];
//链表头插入函数
new_node->Timing = timing;
new_node->Next = (*head_ref);
*head_ref = new_node;
}else{
COM_Printf("Timing分配空间失败,请增加空间\r\n");
}
#else //空间需要malloc分配
new_node = NULL;
new_node = (struct _Timing*) malloc(sizeof(struct _Timing));
if(new_node!=NULL){
//链表头插入函数
new_node->Timing = timing;
new_node->Next = (*head_ref);
*head_ref = new_node;
}else{
COM_Printf("Timing分配空间失败\r\n");
}
#endif
}
//定时器中断
void TIM2_IRQHandler(void) // TIM3中断//==1ms中断
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //检查TIM3更新中断发生与否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); //清除TIMx更新中断标志
LED_Toggle(); //LED控制
Run_Timing(); //队列定时器回调
} //中断中
}
使用
void Timing1(void)
{
/*code*/
}
在初始化时加入定时器队列
PushTiming(Timing1);