学习笔记----关于uCOS-ll中就绪状态表的理解 μC/OS_II进行任务调度的思想是 “近似地每时每刻总是让优先级最高的就绪任务处于运行状态” 。为了保证这一点,它在系统或用户任务调用系统函数及执行中断服务程序结束时总是调用调度器,来确定应该运行的任务并运行它。μC/OS_II进行任务调度的依据就是任务就绪表 为了能够使系统清楚地知道,系统中哪些任务已经就绪,哪些还没有就绪,μC/OS_II在RAM中设立了一个记录表,系统中的每个任务都在这个表中占据一个位置,并用这个位置的状态(1或者0)来表示任务是否处于就绪状态,这个表就叫做任务就绪状态表,简称叫任务就绪表 任务就绪表是由N个8位维数组组成(最多64个).一部分为OSRdyTbl[ ],另一部分为OSRdyGrp(无符号8位变量)。 在创建任务后,任务的优先级就确定了,比如13。把64个任务优先级分成8个队,第一队是1---8,第二队是9---17,。。。。如果要查一下13优先级的任务在那个位置,首先看一下大体在那个队,大于8应该在在第二队,那就不看第一队了,看第二队好了,对二队从9开始到17了,大概在第5位置。计算机也是这样工作的,先分组,再定位。 让我们以优先级为13为例子,分析一下先分组再定位的内部机理吧。既然是计算机用的,就写成二进制 0000 1101 把D5、D4、D3、分为一组 001 D2、D1、D0分为一组 101 可见是一组5位。再以一个复杂的优先级63分析一下: 0011 1111 把D5、D4、D3、分为一组 111 D2、D1、D0分为一组 111 可见是第7组第7位。这样看起来很清爽的。 把D5、D4、D3确定的十进制数作为OSRdyGrp的8个位标志,如上面的001和111,分别是OSRdyGrp的第1位和第7位置1,代表第一队和第7队有需要查找的优先级。这样共可以分为8个队。 把D2、D1、D0确定的十进制数作为OSRdyTbl[]的8个位标志,如上面的101和111,分别是OSRdyTbl[1]队和OSRdyTbl[7]队的第1位和第7位置1,代表第一队的第一个位和第7队的第7个位有需要查找的优先级。 对计算机而言,一个任务创建后,就根据二进制把它分解为上述的两个部分。并根据这两个部分分别对相应OSRdyGrp和OSRdyTbl[]的位置1,这样就完成了任务的就绪。
|