一直在看UCOS,终于今天有所长进,仅仅是一点点,很微不足道的,对于我来说却是很难很难!
操作系统建立任务后任务的优先级便建立了,这个优先级是上下文切换的参照,内核的关键在于擦看当前任务的优先级并总是执行优先级最高的任务,ucos不支持时间片轮转调度,所以内部的任务必须各不相同,也是内核切换的核心,但是内核又是有什么依据来调度任务的呢,ucos里的调度是靠建立任务就绪表作为参照,所以这个任务就绪表是个重点,就绪的任务都在表里,内核只要查表就可以知道哪些任务或者说哪些优先级搞的任务已经准备好了,内核就取出优先级最高的任务开始执行,是怎样做的呢?
首先就绪任务写入就绪表:
OSRdyGrp |=OSMapTbl[prio>>3];
OSRdyTab[prio>>3] |=OSMapTbl[prio&0x07];
在CORE.C文件中定义
INT8U const DT_XDATA OSMapTbl[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
就构成了写入就绪表算法,
例如:任务优先级=10,则首先计算组=OSMapTbl[prio>>3]=OSMapTbl[10>>3]=OSMapTbl[1]=0x02;
计算位=OSRdyTab[1] =OSMapTbl[10&0x07]=OSMapTbl[2]=0x04;
这事位于矩阵上的10个单元置1,他的坐标分别是(4,2)点。就绪表就写入了,
至此优先级为10的任务完成了优先级的写就绪表。
其次删除就绪表中的就绪任务:
if((OSRdyTab[prio>>3] )&=~OSMapTbl[prio&0x07])==0)
OSRdyGrp&=~OSMapTbl[prio>>3] ;
例如:任务优先级=10;删除就绪表操作
if(OSRdyTab[1]&=~0x04==0)保证OSRdyTab[1]=0;表示没有任务进入就绪列表才可以执行下面的操作,
OSRdyGrp&=~0x04;
即矩阵的(4,2)点的值变为0;也就清了就绪表
最后是找到优先级最高的任务:
牵扯到另一个数组也在CORE.C中定义为:
INT8U const DT_XDATA OSUnMapTbl[] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
计算矩阵坐标
y=OSUnMapTbl[OSRdyGrp] ;
x=OSUnMapTbl[OSRdyTab[y]];
prio=(y<<3)+x;
例如:OSRdyGrp=0x06;OSRdyTab[1]=0x03;
y=OSUnMapTbl[OSRdyGrp] =1;
x=OSUnMapTbl[OSRdyTab[1]]=OSUnMapTbl[3]=0;
最高级任务=8+0=8;
表示:在就绪表组=6,表示行1和行2都有任务就绪,单是查表得行优先级最高的是1,所以令Y=1,而在这第一行里又有3个任务就绪了,在在他们里面找到优先级最高的就是第0位,所以X=0,这时候就可以找到优先级最高的点坐标(1,0)其他的都比他低,比他高的没有就绪,所以当让就是娶她的值为8,内核就知道了原来这么多就绪的任务当中就绪的是你小子啊,找出来了!
|