基于链表的时间片轮询程序结构

来源:互联网 发布:福建工程学院软件学院 编辑:程序博客网 时间:2024/06/05 18:10

通过链表添加时间片程序,程序执行后依次查询节点时间片判断是否执行节点函数

u8 task_add(uint16_t id,uint32_t NeedTime,void *func,u8 En) 添加任务函数,同时通过NeedTime设置轮询时间,u8 En用来使能节点函数是否执行。

void task_TickCut(void)函数放在SysTick 1ms中断内执行时间片递减操作。

void task_run(void) 函数在main函数内轮询判断时间片是否结束,递减到0后执行对应程序并更新时间片

Task_Struct *task_GetNode(uint16_t i)函数用于得到某一结点的指针,方便操作节点参数。


typedef struct Task_Struct{u8 RunTag;uint16_t Id;uint32_t TickTime;volatile uint32_t CurTick;void(*func) (void);struct Task_Struct * p_next;}Task_Struct;extern Task_Struct head;extern Task_Struct *p_head;Task_Struct head;Task_Struct *p_head = &head;  /*0: 添加任务成功    1:失败*/u8 task_add(uint16_t id,uint32_t NeedTime,void *func,u8 En) {Task_Struct *p_Task_Struct = (Task_Struct *)malloc(sizeof(Task_Struct));Task_Struct *p_temp = p_head;if (p_Task_Struct == NULL){return 1;}else{memset(p_Task_Struct, 0x00, sizeof(Task_Struct));}p_Task_Struct->RunTag = En;p_Task_Struct->Id = id;p_Task_Struct->TickTime = NeedTime;p_Task_Struct->CurTick = NeedTime;p_Task_Struct->func = func;p_Task_Struct->p_next = NULL;//链表指针移动到最后节点while (p_temp->p_next){p_temp = p_temp->p_next;}//链表最后加入了新节点p_temp->p_next = p_Task_Struct;return 0;}  /*主程序内 运行时间片任务*/void task_run(void) {Task_Struct *p_temp = p_head;do{//是否使能if (p_temp->RunTag == 1){//时间到if (p_temp->CurTick == 0){//执行节点对应任务p_temp->func();/*func执行完后更新启动时间点 */p_temp->CurTick = p_temp->TickTime;      }}//移动到下一节点p_temp = p_temp->p_next;} while (p_temp);}/*放到中断内进行时间片递减处理*/void task_TickCut(void){Task_Struct *p_temp = p_head;do{if (p_temp->CurTick > 0){p_temp->CurTick--;}p_temp = p_temp->p_next;} while (p_temp);}Task_Struct *task_GetNode(uint16_t i){//本算法取出单链表L(带头结点)中第i个位置的结点指针//计数,初始为1uint16_t j = 1;  //头结点指针赋给pTask_Struct *p_temp = p_head;  if (i == 0){//若i等于0,则返回头结点return p_temp;  }if (i < 1){//若 i 无效,则返回 NULLreturn NULL;  }while((p_temp) && (j < i)){  //从第1个结点开始找,查找第i个结点p_temp = p_temp->p_next;j++;}//返回第i个结点的指针,如果i大于表长,p=NULL,直接返回p即可return p_temp; }

例:

#define task_id1  0

#define task_id2  1

void main(void)

{

task_add(task_id1,10,task_func1,1);

task_add(task_id2,20,task_func2,1);

while(1)

{

task_run();

}

}

 
原创粉丝点击