本文主要是介绍ucosii学习小记,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
任务就绪列表及任务调度
八位二进制变量OSRdyGrp的每一位对应OSRdyTbl[]的一个元素,而OSRdyTbl[]的每一个元素是一个八位二进制数,每个位对应一个任务的状态,1为就绪,0为非就绪,因此ucosii共有8*8 = 64个任务。对应下图:
可以将优先级别看作是一个6位的二进制数,将高三位指明是OSRdyGrp的第几个元素,低三位指明是OSRdyTbl的第几位,如优先级别为30,二进制为011110,在OSRdyGrp的D3位置置1,在OSRdyTbl[3]处的D6置1.登记该任务时,
prio>>3即取优先级别的高三位,prio&0x07则是取低三位。
那么如何查找所有任务的最高优先级呢,
任务控制块、任务堆栈和任务函数之间是怎么联系的呢
可以看到任务控制块和任务控制块之间以指针的方式联系,OSTCBPrioTbl则专门存放任务的优先级。程序通过调用OSTaskCreate()创建函数(主要是初始化任务堆栈),在OSTaskCreate中又调用了OSSched(),而OSSched()的作用是得到最高优先级任务和任务控制块指针后调用OS_TASK_SW(),OS_TASK_SW()是一个宏,其实是调用OSCtxSW完成。
这里注意压入堆栈的意思,即正在运行的任务被更高优先级的任务打断时,首先要保存正在运行任务的环境,所以弹出寄存器压入堆栈。将被中止任务的环境(即sp)保存在其任务控制块中,此时sp就可以指向新的任务(优先级更高的任务),将新任务的环境从控制块中弹出,进入已经空了的CPU中,又叫出栈,即完成了上下文的切换。
即完成上下文的切换时函数调用顺序:OSTaskCreate - OSSched - OS_TASK_SW - OSCtxSW。
以上插图来自任哲 - 《嵌入式实时操作系统μCOS-II原理及应用》
这篇关于ucosii学习小记的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!