登录
|
注册会员
开启辅助访问
设为首页
收藏本站
扫一扫关注官方微信
论坛
BBS
M币充值
M currency prepaid phone
M币获取
附件中心
搜索
search
全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
MCU资讯论坛
»
论坛
›
单片机论坛
›
单片机应用于方案
›
一种μC/OS-II任务调度硬件指令的实现
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版
一种μC/OS-II任务调度硬件指令的实现
[复制链接]
1009
0
ad***
管理员
发表在
嵌入式/ARM
2013-3-20 01:11:59
|
查看全部
|
阅读模式
本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要
登录
才可以下载或查看,没有帐号?
注册会员
x
μC/OS-II 是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息 队列)和内存管理等功能。它可以使各个任务独立工作,互不干涉,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。
1 μC/OS-II的任务调度算法分析
1.1 μC/OS-II任务就绪表的解读
μC/OS操作系统采用优先级至上的任务调度原则,让进入就绪态任务中优先级最高的那个任务,一进入就绪态就能立即运行。μC/OS操作系统实现了一种巧妙的查表算法,利用这种算法能快速实现任务调度原则。如何从任务就绪表中,查找优先级最高的那个任务?归结起来:
两个变量(OSrdyGrp、OSRdyTb1[])和两张表(OSMapTb1[]、OSUnMaTb1[])。
μC/OS操作系统可支持64个任务,每个任务被赋予不同的优先级--从0级到最低优先级OS_LOWEST_PRIO,最末两个为操作系统所用,分别为统计任务和空闲任务的优先级。μC/OS-II任务就绪表如图1所示。判断任务就绪同样根据OSRdyTb1[]和OSRdyGrp两个变量来完成:OSR-dyTb1[]按任务优先级分成8组(即每一组8个任务优先级),当任务处于就绪状态时,对应的位为1,反之则为0;OSRdyTb1口组中任何一位为1时,对应的OSRdyGrp位置1。
图1 μC/OS-II任务就绪表
使任务进入就绪状态和脱离就绪状态,都是通过OSRdyTb1[]和OSRdyGrp这两个变量来查找OSMapTb1[]表完成的:
①进入就绪状态。
任务优先级的低3位用于确定任务在总就绪表OSRdyTb1[]中的位置。紧接着前面的3位用于确定是OSRclyTb1[]数组的第几个元素,两个变量都置1。
②脱离就绪状态。
代码将就绪任务表数组OSRdyTb1[]中相应元素的相应位清0,而只有当这一组中的所有任务都为脱离就绪态时,OSRdyGrp变量才会为0。
1.2 高优先级任务的查找
从任务就绪表中查找最高优先级任务,即从OSRdyTb1[]变量中找到最低为1的位是第几位(对应的就是最高优先级任务)。μC/OS-II采用查表的方式来找出处于就绪态的最高优先级任务,μC/OS-II中有一张256个单元的数据表OSUnMapTb1[],表中按一定规律有128个O,64个1,32个2,16个3,8个4,4个5,2个6,1个7,还有1个0,共256字节。OSUnMapTb1[]的定义如下所示:
找出进入就绪态的最高优先级任务的代码如下:
初看这张表感觉杂乱无章,实际是很有规律的。以“OSUnMapTb1[0]~OSUnMapTb1[15]:0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,/*0x00~0x0F*/”为例说明:
其他依次类推。
下面再以一个实例进行说明:假设变量OSRdyGrp=01011000B,表示变量OSRdyTb1[3]、OSRdyTb1[4]、OSRdyTb1[6]有任务处于就绪状态,任务调度是去查找最高优先级任务(y=OSUnMapTb1[0x58])。由于OSRdyTb1[3]>OSRdyTb1[4]>OSRdyTb1[6],结果y=3。如果OSRdyTb1[3]=1000 0001B,则通过查表x=OS-UnMapTb1[OSRdyTb1[3]],即可得到x=O,表明这组数中第0位为1处于最优状态。这样,prio=(y《3)+x=(3《3)+0=24。再利用这个优先级的值,查找任务控制块优先级表OSTCBPrioTb1[],得到指向任务的任务控制块OS_TCB。
2
Cortex
-M3中μC/OS-II任务调度的硬件实现
Cortex-M3采用精简指令集,采用Thumb-2指令,其中包括基于RTOS的硬件算法指令(CLZ),可以通过这种指令查找处于就绪态的最高优先级任务。μC/OS-II中任务的就绪态是反映在OSRdyTb1[]变量中,共计8字节(64位),对应64个任务。可以将其折分成两个32位的数据,然后分别查找这两个32位的数据中优先级最高的任务。先查找低32位,如果低32位中不为零,则找出其中最高优先级任务;否则查找高32位,找出其中最高优先级任务,高32位的的查找结果应加上数值32。
Cotrex-M3中通过以下两条指令就可完成最高优先级任务的定位:RBIT和CLZ。RBIT的含义是把一个32位数据水平旋转180°;CLZ的含义是计算前导零的个数。
假设在OSRdyTb1[]的低32位数据中,00000000000000000000000000001100B表示优先级为2的任务和优先级为3的任务处于就绪态,现在要通过指令RBIT和CLZ找出优先级为2的任务并调度运行。运行RBIT后数据变为:00110000000000000000000000000000000000。运行CLZ后计算出前导零的个数为2,表明优先级为2的任务处于最高就绪态。
μC/OS-II中的任务调度是通过查两次表完成最高优先级任务的查找,方法如下:
上述代码在MDK4.12软件中测试,系统时钟采用8 MHz,按照此方法进行任务调度可节省0.5μs,同时还减少了用来存放OSUnMapTb1[]的256字节的空间,缩短了代码运行时间,提高了CPU的利用率。此方法在μC/OS-II的任务通信中也同样适用。在此不再赘述。
结语
本文主要对μC/OS-II中的任务调度算法作了分析,特别阐述了OSUnMapTb1[]表是如何构成的,同时介绍了基于
ARM
Cortex-M3处理器平台的μC/OS-II的任务调度硬件实现方法,简化了μC/OS-II的代码,提高了处理器的性能。
举报
回复
返回列表
*
滑块验证:
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
注册会员
本版积分规则
发表回复
回帖后跳转到最后一页
浏览过的版块
外围器件论坛
模电数电论坛
回复
转播
评分
分享
打开支付宝扫一扫,最高立得1212元红包
搜索
本版
帖子
用户
热搜:
传感器
51串口程序
电子管放大器
夾式電表
夾式電流
Mentor论坛
打印机
版块推荐
百宝箱
My 布拉格
无边框Z9
Z9Max
Z9mini
nubia动态
问题 & 建议
资源分享
爱拍
同城会
牛仔生活
查看论坛所有版块>>
每日签到
论坛任务
摄影技巧
跳蚤市场
互助问答
论坛导读
申请内测
红包中心
每日摇一摇
活动中心
网站地图
官方旗舰店
图文热点
VKL144A TSSOP48 点阵式液晶驱动芯片/低功
产品品牌:永嘉微电/VINKA 产品型号:VKL44A 封装形式:TSSOP48 概述 VKL144是
高抗干扰液晶显示驱动/省电液晶驱动IC/LCD
产品品牌:永嘉微电/VINKA 产品型号:VKL128 封装形式:SSOP44 概述 VKL128是一
VK2C23A/B LQFP64/48LCD驱动控制器/高抗干
产品品牌:永嘉微电/VINKA 产品型号:VK2C23A/B 封装形式:LQFP64/48 概述 VK2C
高抗干扰液晶驱动/点阵式液晶显示IC/VK2C21
产品品牌:永嘉微电/VINKA 产品型号:VK2C21D 封装形式:SOP16 概述 VK2C21D是
I2C通信接口段码液晶驱动芯片VK2C21C SOP20
产品品牌:永嘉微电/VINKA 产品型号:VK2C21C 封装形式:SOP20 概述 VK2C21C是
更多
精华推荐
VKL144A TSSOP48 点阵式液晶驱动芯片/低功
高抗干扰液晶显示驱动/省电液晶驱动IC/LCD
VK2C23A/B LQFP64/48LCD驱动控制器/高抗干
高抗干扰液晶驱动/点阵式液晶显示IC/VK2C21
I2C通信接口段码液晶驱动芯片VK2C21C SOP20
VK2C21B SOP24高抗干扰LCD液晶段码驱动芯片
低成本、高性能、带EEPROM了解一下
工控仪表/水电气表LCD驱动/抗干扰液晶段码
更多
社区学堂
VKL144A TSSOP48 点阵式液晶驱动芯片/
高抗干扰液晶显示驱动/省电液晶驱动IC/
VKL144A TSSOP48 点阵式液晶驱动芯片/低功
产品品牌:永嘉微电/VINKA 产品型号:VKL44A 封装形式:TSSOP48 概述 VKL144是
高抗干扰液晶显示驱动/省电液晶驱动IC/LCD
产品品牌:永嘉微电/VINKA 产品型号:VKL128 封装形式:SSOP44 概述 VKL128是一
VK2C23A/B LQFP64/48LCD驱动控制器/高抗干
产品品牌:永嘉微电/VINKA 产品型号:VK2C23A/B 封装形式:LQFP64/48 概述 VK2C
更多
客服中心
QQ:187196467
服务时间:周一至周日 8:30-20:30
在线客服
客服微博
产品咨询
售后中心
关注我们
关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
QQ:187196467
周一到周日 8:30-22:00 (全年无休)
7 x 24小时在线客服
手机版
Powered by
MCUZX!
X3.4 © 2008-2015
MCU资讯论坛
版权所有
京ICP备18035221号-2
客服QQ: 187196467
技术支持:
MCU资讯论坛
|
网站地图
快速回复
返回顶部
返回列表