完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
uc/os任务调度机制
7klc2re9.rar
(7.63 KB, 下载次数: 2
)
uc/OS 任务调度机制 程序: ------------------------------------------------------------ uC/OS下每个任务可以有如下五种状态。 休眠态(dormant):指任务驻留在程序空间中,还没有交给内核管理。把任务交给内核是通过调用OSTaskCreate( )或OSTaskCreatExt( )实现的。 就绪(Ready):当任务一旦建立,这个任务就处于就绪态准备运行。任务可以动态的被另一个程序建立,也可以在系统运行开始之前建立。通过调用OSTaskDel( )使任务返回到休眠态。就绪态的任务都放在就绪列表中。在任务调度时,指针OSTCBHighRdy指向优先级最高的就绪任务,也就是立刻就要运行的任务。 等待或挂起(Pending):正在运行的任务由于调用延时函数OSTimeDly( )或等待事件信号量的来临而将自身挂起,因而处于等待或挂起态。因为等待某事件而被挂起的任务注册在该事件的等待列表中。 中断态(Interrupt):正在运行的任务可以被中断,除非是该任务将中断关闭。被中断的任务进入中断服务程序(ISR)。如果中断服务程序使一个更高优先级的任务准备就绪,这中断服务程序结束后,则更高优先级的任务开始运行程序。 任务被创建后,其状态用8位字节变量OSTCBStat表示,目前只用了低四位如下所示(图4.1)。如果某位置为1,表示任务正在等待该位表示的事件;可以复合使用这些标志,表示任务在同时等待多个事件的发生;如果所有位均为0,表示任务处于就绪状态,一旦符合条件(优先级最高),即可投入运行。 uC/OS下任务的状态转移如下(图4.2)所示。每个任务在被创建的时候,一个称为任务控制块(task control blocks)的数据结构将被赋值。 uC/OS是剥夺型实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。uC/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。函数OSSched(void)进行任务调度。其程序结构如下(程序4.2)。 程序4.2 任务调度原理 如前所述,uC/OS是通过查表法找到准备就绪的优先级最高的任务,下面将说明查表的过程。为了实现就绪任务的快速查找,uC/OS采用了一种奇特的方式。既然uC/OS中每一个任务的优先级是唯一的,不存在相同优先级的两个任务,所以可以根据优先级来唯一的确定任务。uC/OS支持64个任务,也就是由64个优先级0-63,二进制中可以用6位来表示,然后根据高三位将64个任务分为8个准备就绪表数组OSRdyTbl[7],每组又根据低3位包含8个任务,若每组有任务处于就绪态,则相应的比特置1;假设任务3和任务5处于就绪态,则OSRdyTbl[0]=0x28;任务17和任务20处于就绪态,则OSRdyTbl[2]=0x12。 uC/OS还定义了一个8比特字节变量,OSRdyGrp准备就绪组。OSRdyGrp中的每一位表示8组任务中每一组是否有准备就绪的任务,其相互关系见下(图4.4)。 图4.4 uC/OS任务查表原理 假设优先级为12的任务进入就绪状态,12=1 100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为: OSRdyGrp |=0x02; 而优先级为21的任务就绪21=10 101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为: OSRdyGrp |=0x04; 从上面的计算我们可以得到:若第n位置1,则应该与2n 相或。uC/OS中,把2n的n=0-7的8个值 先计算好存在数组OSMapTbl[7]中,也就是: OSMapTbl[7] =27=0x80; 利用OSMapTbl,通过任务的识别号-优先级prio来设置任务在就绪组和就绪表数组中相应位置的数学式为: 下面我们说明如何利用就绪组和就绪表数组来获得优先级最高的就绪任务识别号即优先级数。前面我们把优先级数分解为高三位和低三位,从而决定任务在就绪组和就绪表数组中相应位置,这里我们先想办法先分别求出高三位和低三位即可。假设OSRdyGrp值为0x24=100 100b,表明OSRdyTbl[2]和OSRdyTbl[5]存在准备就绪的任务,根据图4.4,显然OSRdyTbl[2]中的任务优先级比OSRdyTbl[5]要高,所以最高优先级就绪任务的高3位一定是2;再通过OSRdyTbl[2]的值来确定低3位,假设为0x12=010 010b,表明第1个和第4个任务处于就绪态,优先级高的任务是第1个,所以最高优先级就绪任务的低3位一定是1;最后可以得到最高优先级的就绪任务的优先级为010 010b=18。 上面我们通过观察法利用OSRdyGrp和OSRdyTbl值求出最高优先级的就绪任务的优先级,接下来推导一般方法。推导的关键在于这个事实:高优先级有着最小的优先级号,所以不管对于求高3位还是低3位,都是将已知的数展开成8位的二进制数,最低为1的位数即为相应的欲获得的数,即: 1=00000001b->0 (最低为1的位是第0位), 可以用算法这样实现:令n=0,将已知数与2n相与,若不为0,则n即为所求,否则n++,进行下一个循环。程序结构如下(程序4.3): 程序4.3 查找最高优先级的算法 (1 & 20)=1, 最低为1的位是第0位; 显然,用程序实现不但复杂,更重要的是执行时间是不确定的,因为有时只需一个循环即可,而有时需要8个循环,不符合实时系统的确定性原则。所以在uC/OS中,仍然采用查表的方法实现,这个表为数组OSUnMapTbl[255],利用该表,计算最高优先级任务的优先级的算法如下: 程序4.4 计算最高优先级任务的优先级的算法 |
|
相关推荐
5 个讨论
|
|
还没有来得及看看
|
|
|
|
|
|
看看
|
|
|
|
|
|
836 浏览 0 评论
6340 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2836 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
3101 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
33230 浏览 11 评论
73662 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 03:04 , Processed in 1.244968 second(s), Total 51, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号