毕业论文论文范文课程设计实践报告法律论文英语论文教学论文医学论文农学论文艺术论文行政论文管理论文计算机安全
您现在的位置: 毕业论文 >> 论文 >> 正文

arm嵌入式系统设计论文 第9页

更新时间:2009-4-12:  来源:毕业论文
arm嵌入式系统设计论文 第9页
C/OS-II的调度最大特点之一。μC/OS-II通过独特的查表法,实现了快速找到准备就绪的优先级最高任务。我们来分析其相关的数据结构及其细节。
 
图4.2 μC/OS-II的任务调度
每个就绪的任务都放在就绪表中,就绪表有2个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中任务按优先级分组,8个任务为一组,其8比特位表示8组任务中每一组是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdvTbl[]的相应元素的相应位也置为1。μC/OS-II内核有64个优先级0-63,二进制中可以用6位来表示。尽管μC/OS-II可管理最多64个任务,但μC/OS-II保留了先级为0、l、2、3、OSLOWESWPRIO-3、OSLOWESTPRO-2、OS_LOWEST_PRIO和OS_LOWEST_PRIO这8个任务以便将来使用。因此,用户可以有最多56个应用任务。μC/OS-II不允许两个任务具有相同的优先级,必须给每个任务赋以不同的优先级。如图4-3所示,若每组有任务处于就绪态,则相应的比特置1。优先级的高3位“XXX”用来确定是在OSRdyTbl[]数组中的第几个元素;优先级的低3位“YYY”用于确定在OSRdyTbl[]中对应元素的所在位。例如,通过优先级21(二进制表示为010101),根据其高3位可知任务状态在就绪表数组OSRdyTbl[]的OSRdyTbl[2]中,根据其低3位可知任务就绪状态在OSRdyTbl[2]内第三个比特位表示。OSRdyTbl[]和OSRdyGrp用于管理任务是否就绪的状态,例如要置优先级为21(二进制表示为010101)的任务就绪,则根据高3位值2和低3位值5将OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置l,相应的数学表达式为:
OSRdyGrp[1]|=0x04;
OSRdyTbl[2]|=0x20;
 
图4.4μC/OS-II缓冲区示意图
由以上的计算可知若需将第n位置1,则应与2的n次幂相或。μC/OS-II中,把2的n次幂(n=0-7)的8个值预先存在数组OSMapTbl[]中作掩码使用,如表4-l所示利用OSMapTbl[],通过任务的优先级prio来设置任务在就绪组和就绪表数组中相应状态标志的数学表达式为:
OSRdyGrp|=OSMapTbl[prio>>3];
OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];
因为64个优先级可用6位来表示,所以高3位可用prio>>3得到,低3位通过prio&0x07获得。
表4.1 OSMapTbl[]
 
在μC/OS-II的任务调度中就是利用上面介绍的OSRdyGrp和OSRdyTbl[]来找出优先级最高的就绪任务的。优先级值越小优先级就越高,任务组号越小该组任务的优先级越高,优先级0为最高优先级,任务组0为最高优先级任务组。通过OSRdyGrp和OSRdyTbl[]来确定最高优先级的就绪任务的算法。从右到左扫描位图OSRdyGrp,遇到的第一个非0比特位就停止扫描(因为越靠近右边优先级越高),己经找到当前优先级最高的就绪进程所在的任务组。根据任务组号找到对应OSRdyTbl[]元素从右到左扫描遇到的第一个非0比特位就某当前优先级最高的就绪任务。如下的算法分析:
INT8U findhighprio()
{int n,m,highprio;
n=0;
do{if(OSRdyGrp& )break;n++;}while(m<8)//得到优先级最高的就绪任务组号
m=0;
do{if(OSRdyTb1[n]& )break;m++;}while(m<8)//得到进程组最高优先级就绪任务的组内偏移
highprio=n*8+m;
return highprio;
}
可知,要找到最高优先级就是要计算出m和n的值(m和n分别为最高就绪优先级任务组号和组内偏移),可以看出,用该算法实现不但复杂,花费更多的计算时间,更重要的是循环次数是不确定的,因此其执行时间是不可预测的,这个不符合实时系统的确定性原则。为了找到进入就绪态的优先级最高任务并不需要扫描整个就绪表,在μC/OS-II采用查表的方法实现。把需要由上面程序计算出的m和n的值预先放到表中,因为OSRdyGrp和OSRdyTbl[i]都为8位,所以共有2的N次幂=256种不同的组合,所以这个数组的大小也是256。这个表为数组OSUnMap[255],OSUnMapTbl[]的定义见文献[10]。现在选出优先级最高优先级的就绪任务只需要以下一小段程序就可以实现了,如下所示:
y=OSUnMapTb1[OSRdyGrp] ;
x=OSUnMapTb1[OSRdyTb1[y]] ;
OSPrioHighRdy=(INT8U)((y<<3)+x) ;
OSTCBHighRdy=OSTCBPrioTb1[OSPrioHighRdy] ;
μC/OS-II任务调度采用查表法,分别找到就绪的最高优先级任务在OSRdyTbl[]中的组号y和组内偏移x,就找到了就绪的最高优先级任务。只需要两三句C程序非常简单,同时与应用程序中建立的任务数无关。如上面分析,与Linux的调度相比,μC/OS-II的调度相当简洁,效率也高出许多。其中的原因有以下几个方面:
(1)如果调度的策略并非严格的按优先级调度,而还要考虑其他的因素,那就不止是简单的找到优先级最高的就绪进程就能解决问题了。嵌入式实时操作系统通常都是严格的按优先级调度,而通用操作系统则一般还有考虑时间片以及累计运行时间的问题,所以通用操作系统自然就比较复杂。
(2)如果优先级的使用并非唯一的,因而多个进程可以使用的优先级,那就还有个在具有相同优先级的就绪进程之间怎样调度的问题,这就使得调度的过程复杂化了。μC/OS-II这方面比较特殊,一些商用的RTOS,如PSOS, VXWORKS,QNX等,都允许多个进程具有相同的优先级,所以它们的进程调度也达不到μC/OS-II这样的简单和高效。
(3)严格的按照优先级调度,并且每个优先级只允许有一个进程,是μC/OS-II得以实现简单高效的进程调度的关键原因。当然,μC/OS-II为允许的进程数量规定了一个不大的上限,以及前述包括位图在内的种种数据结构和算法也都起了很好的作用。如上节所述,μC/OS-II的调度程序只需3行C程序就完成,因此调度所需的时间非常短而且与任务数量无关。
4.3 中断时钟与节拍
在μC/OS-II中,中断服务程序一般用汇编语言来写,下面是中断处理程序的一般处理过程的示意代码。
void ucosISR()
{
l.保存全部CPU寄存器;
2.调用OSIntEnter或OSIntNesting直接加1;

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

arm嵌入式系统设计论文 第9页下载如图片无法显示或论文不完整,请联系qq752018766
设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©751com.cn 辣文论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。