ucos-II之就绪表解读
来源:互联网 发布:php参考手册下载 编辑:程序博客网 时间:2024/05/22 06:33
第一次接触ucos实时操作系统,对就绪列表的优先级的查找,一头雾水,感觉完全没必要写的如此复杂,但经过一天的查找资料与思考,哈哈,原来还是我太年轻了,原来通过查表确保了查找最高优先级的实时性(优先级的高低并不影响查表花费的时间,因为查表过程都一样,能够准确知道查表的时间),为了方便以后回顾知识,便整理如理知识框架。
一、初始化过程 (os_core.c)
ptcb->OSTCBY = (INT8U)(prio >> 3u);
ptcb->OSTCBX = (INT8U)(prio & 0x07u);
但以上还不能在就绪表找到对应位置,因为就优先级在绪表的位置是X.Y的交点,而以上:比如优先级31时.
ptcb->OSTCBY =00000110, ptcb->OSTCBX =00000111 这就造成有两个X的对应一个Y,产生混乱,因此必须将00000110转化成一个坐标(坐标只用了三位,扩展至八位即可)即00000011---->00000100 , 00000111--->010000000,看下图。
二、确定优先级具体坐标
可发现,位置都差一位,因此可采取以下措施:
ptcb->OSTCBBitY = (OS_PRIO)(1uL << ptcb->OSTCBY);
ptcb->OSTCBBitX = (OS_PRIO)(1uL << ptcb->OSTCBX);
这个时候正好对应,如上如的31在第四行,第一列。
三、查找最高优先级
首先每次增加一个优先级,就需要或运算:
OSRdyGrp |= ptcb->OSTCBBitY; /* Make task ready to run */
OSRdyTbl[ptcb->OSTCBY] |= ptcb->OSTCBBitX;
OSRdyGrp里面存放所有优先级的组成员, OSRdyTbl[ptcb->OSTCBY]存放所在组的所有成员,
比如优先级为13,14,15,19,20,30,31时,就绪表里就有7个点。
OSRdyGrp=00001110,
OSRdyTbl[1]=11100000,
OSRdyTbl[2]=00011000,
OSRdyTbl[3]=11000000,
可轻易发现最高优先级是13,但单片机不知道啊,我们可以从0开始查找,但就不知道到底花了多久能找到最高优先级,(因为位置不固定)。此时查表法的优势显现出来,
此时 OSRdyGrp里对应的0000010,在OSRdyTbl[1]里对应着00100000,这个坐标可利用如下表查找(查找
0-256里1最右边的位置)
INT8U const OSUnMapTbl[256] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0,
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0
};
将查表后的数据代入下公式的最高优先级为13,
y = OSUnMapTbl[OSRdyGrp];
OSPrioHighRdy = (INT8U)((y << 3u) + OSUnMapTbl[OSRdyTbl[y]]);
剩下的就是系统处理最高优先级的任务了哈哈
- ucos-II之就绪表解读
- uCOS-II学习笔记之就绪表
- uCos II 就绪列表
- uC/OS-II 就绪表解疑
- ucos-II小结----再论就绪表
- ucos-II 任务就绪表学习笔记
- uCOS-II系统中的任务就绪表
- uCos ii的就绪组和就绪表
- uCOS II就绪表(Ready List)分析(转
- 浅谈对ucos-ii任务就绪表的理解
- uCOS II就绪表(Ready List)分析
- ucos-ii 之 OSTimeTick
- uCOS-II之信号量
- uCOS-II之邮箱
- ucos-iii学习之就绪列表以及添加任务到就绪队列
- Ucos II 移植之二
- ucos-ii 之OSTaskDel函数
- ucos-ii 之OSTaskDelReq函数
- java基础知识回顾---List,set,Map 的用法和区别
- 如何定义一个只能在堆上(栈上)生成对象的类?
- MySQL事务处理实现方法步骤
- 关于socket的理解及通信的过程
- 根据前序与中序遍历建树后以后序遍历输出
- ucos-II之就绪表解读
- java反射机制
- Java基础学习总结(30)——Java 内存溢出问题总结
- PHP函数与问题笔记
- Cocoa框架
- bzoj1821(克鲁斯卡尔)
- Rich feature hierarchies for accurate object detection and semantic segmentation 笔记
- CMake 运行错误 could not find CMAKE_ROOT
- springmvc 返回json数据给前台jsp页面展示