分类: LINUX
2012-11-01 10:46:27
书接上回,初始化就绪表及其相关
点击(此处)折叠或打开
就绪表:
每个任务被赋予不同的优先等级,从0级到最低优先级OS_LOWEST_PR10,包括0和OS_LOWEST_PR10在内,当系统初始化的时候,最低优先级总是被赋值给空闲任务idle task。注意多任务数目OS_MAX_TASKS和最低优先级数是没有关系的,用户应用程序可以只有10个任务,仍然可以有32个优先级。
每个任务的就绪态标志都将放在就绪表中,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按照优先级分组,8个任务为一组,OSRdyGrp中的每一位表示8组任务中的每一组是否有进入就绪态的任务,任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素也相应的置位,就绪表OSRdyTbl[]数组的大小取决于OS_lowest_pr10,当用户的应用程序中任务数目比较少时,减少OS_LOWEST_PR10可以降低系统对RAM空间的需求。
为了确定下次哪个优先级的任务开始运行,内核调度器总是将OS_LOWEST_PR10在就绪表中响应的位置置1,
比如说优先级为45,二级制为101101,右移三位取得OSRdyGrp的值为101即5,就把低三位38译码位与OSRdyTbl[5],对OSRdyTbl[5]的45优先级位置1。同样如果一个任务没有进入就绪态,就把该任务的从就绪表中删除。
找出优先级最高的任务使用系统调用OSUnMapTbl(),对OSRdyGrp和OSRdyTbl[]分别使用,综合得到现在就绪的最高优先级的高3位和低3位
例如:OSRdyGrp是01101000 那么得到OSUnMapTbl()得到3,然后OSRdyTbl[3]的值为11100100,得到第一个1的位置为2,那么优先级prio为(3*8+2)== 26。