ucos-iii的任务调度算法研究

ucos-iii的任务调度算法研究

ID:15839850

大小:22.45 KB

页数:10页

时间:2018-08-06

ucos-iii的任务调度算法研究_第1页
ucos-iii的任务调度算法研究_第2页
ucos-iii的任务调度算法研究_第3页
ucos-iii的任务调度算法研究_第4页
ucos-iii的任务调度算法研究_第5页
资源描述:

《ucos-iii的任务调度算法研究》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、uCOS-III的任务调度算法研究uC/OS-III的任务调度算法研究1.就绪列表1.1概述准备好运行的任务被放到就绪列表中,如图1.1。就绪列表是一个数组(OSRdyList[]),它一共有OS_CFG_PRIO_MAX条记录,记录的数据类型为OS_RDY_LIST(见OS.H)。就绪列表中的每条记录都包含了三个变量.Entries、.TailPtr、.HeadPtr。.Entries中该优先级的就绪任务数。当该优先级中没有任务就绪时,.Entries就会被设置为0。.TailPtr和.HeadPtr用于该优先级就绪任务的建立双向列表。.HeadPtr指向

2、列表的头部,.TailPtr指向列表的尾部。表中的记录跟任务的优先级有关。例如,如果一个任务的优先级是5,那么当它就绪时会被放入OSRdyList[5]中。图1.1:任务就绪表1.2调用OSInit()后的就绪列表有多少种优先级,就绪列表中就由多少条记录。每个记录中都有3个变量。Entries为该记录中的任务数。.PrevPtr和.NextPtr用于指向具有相同优先级到TCB组成的双向列表。对于空闲任务,这两个值为NULL。此时任务就绪表如图1.2所示。图1.2:任务初始化后列表1.3添加任务到就绪列表uC/OS-III提供很多服务可以把任务添加到就绪列表中

3、。最明显的服务是OSTaskCreate(),它通常创建准备运行的任务并将任务放入就绪列表中。如图1.3所示,就绪列表中该优先级中已经有两个任务了。OSTaskCreate()就会将这个任务插入到列表的未部。图1.3:添加任务2.优先级2.1uC/OS-III简介uC/OS-III是一个可扩展的,可固化的,抢占式的实时内核,它管理的任务个数不受限制。它是第三代内核,提供了现代实时内核所期望的所有功能包括资源管理、同步、内部任务交流等。uC/OS-III也提供了很多特性是在其他实时内核中所没有的。比如能在运行时测量运行性能,直接得发送信号或消息给任务,任务能同

4、时等待多个信号量和消息队列。以下列出uC/OS-III相对于uC/OS-II来说最大个改变:?时间片轮转调度uC/OS-III允许多个任务拥有相同的优先级。当多个相同优先级的任务就绪时,并且这个优先级是目前最高的。uC/OS-III会分配用户定义的时间片给每个任务去运行。每个任务可以定义不同的时间片。当任务用不完时间片时可以让出CPU给另一个任务。?任务数无限制uC/OS-III对任务数量无限制。实际上,任务的数量限制于处理器能提供的内存大小。每一个任务需要有自己的堆栈空间,uC/OS-III在运行时监控任务堆栈的生长。uC/OS-III对任务的大小无限制?

5、优先级数无限制uC/OS-III对优先级的数量无限制。然而,配置uC/OS-III的优先级在32到256之间已经满足大多数的应用了。2.2uC/OS-III的优先级调度图2-1到2-3显示了优先级的位映像组。它的宽度取决于CPU_DATA的数据类型(见CPU.H),它可以是8位、16位、32位,根据处理器相应地设定。uC/OS-III支持多达OS_CFG_PRIO_MAX种不同的优先级(见OS_CFG.H)。在uC/OS-III中,数值越小优先级越高。因此优先级0是优先级最高的。优先级OS_CFG_PRIO_MAX-1的优先级最低。uC/OS-III将最低优

6、先级唯一地分配给空闲任务,其它任务不允许被设置为这个优先级。当任务准备好运行了,根据任务的优先级,位映像表中相应位就会被设置为1。如果处理器支持位清零指令CLZ,这个指令会加快位映像表的设置过程。OS_PRIO.C中包含了位映像表的设置、清除、查找的相关代码。这些函数都是uC/OS-III的内部函数,可以用汇编语言优化。函数OS_PrioGetHighest()OS_PrioInsert()OS_PrioInsert()功能查找最高优先级设置位映像表中相应的位清除位映像表中相应的位为了确定就绪列表中优先级最高的任务,位映像表会被扫描,通过1)OS_PrioG

7、etHighest()函数扫描OSPrioTbl[]表直到找到非0的记录。这个循环最终会停止,因为总是有非0记录(空闲任务的存)。2)当这个表中全是0记录时,就会从下一个表中查找。优先级"prio"会被增加(如果表长32位,就将prio加上32)。3)当找到第一个非0位时,计算该位之前0位的个数,返回该优先级值。如果CPU提供清零指令,可以通过这个指令优化代码。如果CPU没有这个指令,那么这个指令就只能用C语言模拟了。4)函数CPU_CntLeadZeros()统计了CPU_DATA记录中0的个数(从左边开始,以位计)。例如,假定位映像表长32位,0xF00

8、01234返回的非0位前0位数的个数是0。0x00F

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。