数据结构及链表节点项:List ListItem。
实现创建任务函数: TaskCreate Static or Dynamic。
Static:①定义任务栈起始地址及大小;
②定义任务句柄;
③定义任务函数;
实现原理:
传入栈底 栈大小 任务函数 "任务名" 任务控制块。
①获取栈顶;
②向控制块填入"任务名";
③调用栈初始化函数:PC指向任务函数;
设定PC Lr Xpsr 指针,即初始化内核r0-r15寄存器。
④任务句柄指向控制块。
启动任务调度器:TaskStartSched()
①创建空闲任务;
②初始化响应时间最大;系统时间0U;
调度器运行标志。
③开启调度:PortStartSchedular();
④初始化Systick Pendsv中断优先级;
⑤初始化Systick系统时基 1ms;
⑥启动任务 不再返回。
调度器的作用:在Pendsv中寻找当前优先级最高的任务控制块,更新至当前任务控制块,从而在退出后运行当前更新任务运行高级函数,由此实现任务优先级的寻找与切换;
任务的切换:任务总是需要调度和轮番运行,所以不管什么优先级任务都需要交出CPU的使用权;所有任务都需要延时阻塞,否则高优先级任务如若没有延时阻塞将不被切换,导致低优先级任务永远无法获得执行;
任务的延时与阻塞:将Pendsv中断挂起,在Pendsv中断中将任务从就序列表移除并将其添加至延时列表中,切换一次任务(切换任务是在就绪任务列表中寻找,即移除任务在系统调度时不可见)将CPU交给同级或低级任务;
任务的恢复:启动任务调度器后,根据时基在Systick中执行时基更新与恢复等待任务列表;通过