基于链表的时间片轮询程序结构
来源:互联网 发布:福建工程学院软件学院 编辑:程序博客网 时间: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();
}
}
阅读全文
0 0
- 基于链表的时间片轮询程序结构
- 基于分布式对象的网游程序结构设计(2)
- 基于分布式对象的网游程序结构设计(1)
- 开发宝典:基于分布式对象的网游程序结构设计
- 开发宝典:基于分布式对象的网游程序结构设计
- [转]基于XCode开发的Iphone APP程序结构
- 更清晰的DirectX程序结构(基于DirectInput实验)
- 更清晰的DirectX程序结构(基于DirectInput实验)
- ASP程序结构的风格
- C#的程序结构
- MIDlet的基本程序结构
- 六、C#的程序结构
- C语言的程序结构
- 总结学习的程序结构
- 基本的Direct3D程序结构
- PyQt4的程序结构
- Qt的程序结构
- Object Passal的程序结构
- ios 实现android 中的DrawerLayout菜单
- Python标准模块——__future__
- 欢迎使用CSDN-markdown编辑器
- 反向传播算法入门资源索引
- CQOI珠宝
- 基于链表的时间片轮询程序结构
- 前序 中序 -》 后序 (字符型数组)
- Clion 2016.3.5 破解
- C#基础篇——线程(一)
- Machine Learning第九讲[异常检测] --(三)多元高斯分布(选学)
- DiscuzX3.3 隐藏主导航栏和顶部导航栏
- Neo4j实战-使用python语言操作neo4j数据库
- POJ3279_Fliptile_反转问题-2
- 1127 接水问题