通过链表添加时间片程序,程序执行后依次查询节点时间片判断是否执行节点函数
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个位置的结点指针
//计数,初始为1
uint16_t j = 1;
//头结点指针赋给p
Task_Struct *p_temp = p_head;
if (i == 0)
{
//若i等于0,则返回头结点
return p_temp;
}
if (i < 1)
{
//若 i 无效,则返回 NULL
return 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();
}
}