一种嵌入式微调度器的实现方法
时间:06-14
来源:电子产品世界
点击:
![]() |
3.2.2 任务调度算法及实现
这种算法已在16位单片机Motorola MC9S12DP256B和8位单片机AT89C52上实现。一些与硬件相关的算法,主要给出在MC9S12DP256B上的算法实现。
①建立任务Os_Task_Create()算法。任务创建函数代码如下:
![]() |
该程序表示了系统建立任务的过程。如上节所述每个任务对应一个优先级,所以任务ID也可表示任务的优先级。建立任务的过程就是,把任务控制块数组的任务人口地址对应ID(即任务优先级)的任务控制块的任务入口地址指向任务函数的地址,并初始化该任务的任务堆栈。
②任务调度算法的功能是找到当前就绪列表中优先级最高的任务,并把这个任务切换到运行状态。在任务控制块列表中使用任务在列表中的相对位置表示优先级的高低,并不需要实际地对任务优先级进行比较。算法流程如图1所示。
图1 任务调度算法状态描述 从任务控制块队列的头部(即任务优先级为0的任务)开始依次检查任务就绪标志(os_tcb.state),如果当前任务标志≠1,表示当前任务为非就绪状态,继续检查下一优先级的任务。如果当前任务标志为1,则找到最高优先级任务退出循环,调用任务调度函数进行任务状态切换。 任务的调度算法如下:
任务级切换函数需要改变程序计数器(PC),所以必须通过软中断实现。在软中断服务函数中改变当前运行任务的TCB指针到最高优先级就绪任务,执行中断返回指令在新的任务堆栈中弹出最高优先级任务的PSW和PC指针,从而完成任务切换。 ③任务状态转换主要是激活任务os_Task_Active()、挂起任务os_Task_Suspend()和延迟任务os_Task_Delay()。挂起任务使任务进入挂起状态,延迟任务使任务进入等待状态,而激活任务函数可以使任务从挂起状态或者等待状态直接进入就绪状态。任务的状态由任务控制块中的任务状态字(os_tcb.state)给出。当os_tcb.state=1时表示任务进入就绪状态;当os_tcb.state=0时表示任务处于挂起状态;当os_tcb.state>1时表示任务等待os_tcb.state-1个系统时钟间隔之后进入就绪状态。任务状态切换示意图如图2所示。
|
- 智能仪表:一种嵌入式微调度器的应用(06-15)