#ifndef _MODEL_SCHEDULE_H_
#define _MODEL_SCHEDULE_H_#define MODEL_SCHEDULE_IDLE 0x00000000
#define MODEL_SCHEDULE_OCCUPY 0x5A555A55#define MODEL_SCHEDULE_NUM 10typedef struct model_schedule_linked_list_unit
{int idleFlag; //资源是否被占用void (*pfun)(void); // 事件内容int timeNode; // 执行时间struct model_schedule_linked_list_unit *next; // 下一个事件
} model_schedule_linked_list_unit;typedef struct
{model_schedule_linked_list_unit *head;model_schedule_linked_list_unit linked_list_space[MODEL_SCHEDULE_NUM]; // 下一个事件
} model_schedule_linked_list;bool model_schedule_push(model_schedule_linked_list *pLinked_list, void (*Pfun)(void), int delayTime);
void model_schedule_check(model_schedule_linked_list *pLinked_list);
#endif#include "main.h"
#include "model_schedule.h"/// @brief 添加事件
/// @param pLinked_list 事件容器
/// @param Pfun 定时事件
/// @param delayTime 定时时间
/// @return
bool model_schedule_push(model_schedule_linked_list *pLinked_list, void (*Pfun)(void), int delayTime)
{int index; //事件下标for(index=0;index<MODEL_SCHEDULE_NUM;index++) //寻找空闲空间{if(pLinked_list->linked_list_space[index].idleFlag!=MODEL_SCHEDULE_OCCUPY) break; //找到空闲空间}if(index>=MODEL_SCHEDULE_NUM) return FALSE; //未找到空闲空间,返回失败pLinked_list->linked_list_space[index].idleFlag = MODEL_SCHEDULE_OCCUPY; //占用资源pLinked_list->linked_list_space[index].pfun = Pfun; //添加事件pLinked_list->linked_list_space[index].timeNode = g_GlobalReferenceClock+delayTime; //添加时间节点model_schedule_linked_list_unit **ppCurrent_unit = &pLinked_list->head; //定义临时变量while(1){if((*ppCurrent_unit)==NULL) //如果链表为空{(*ppCurrent_unit) = &pLinked_list->linked_list_space[index];return TRUE;}if(pLinked_list->linked_list_space[index].timeNode < pLinked_list->head->timeNode) //如果插入值为最小值{pLinked_list->linked_list_space[index].next = (*ppCurrent_unit);(*ppCurrent_unit) = &pLinked_list->linked_list_space[index];return TRUE;}if((*ppCurrent_unit)->next==NULL) //经过比较后遇到链表尾巴{(*ppCurrent_unit)->next = &pLinked_list->linked_list_space[index];return TRUE;}if(pLinked_list->linked_list_space[index].timeNode < (*ppCurrent_unit)->next->timeNode) //插入中间值{pLinked_list->linked_list_space[index].next = (*ppCurrent_unit)->next;(*ppCurrent_unit)->next = &pLinked_list->linked_list_space[index];return TRUE; }ppCurrent_unit = &(*ppCurrent_unit)->next; //指向下一个节点}
}/// @brief 处理事件
void model_schedule_check(model_schedule_linked_list *pLinked_list)
{while (pLinked_list->head!=NULL) //如果表头不为空{if(g_GlobalReferenceClock > pLinked_list->head->timeNode){if(pLinked_list->head->pfun!=NULL) //事件不为空{pLinked_list->head->pfun(); //定时事件执行}model_schedule_linked_list_unit *pCurrent_unit = pLinked_list->head; //保留原有列表地址,pLinked_list->head=pLinked_list->head->next; //指向下一个事件memset(pCurrent_unit, 0, sizeof(model_schedule_linked_list_unit)); //释放资源}}
}void model_schedule_printf_timeNode(model_schedule_linked_list *pLinked_list)
{model_schedule_linked_list_unit *pCurrent_unit = pLinked_list->head;while (pCurrent_unit!=NULL){printf("timeValue:%d\r\n", pCurrent_unit->timeNode-g_GlobalReferenceClock);pCurrent_unit = pCurrent_unit->next;}
}