ucos-II之就绪表解读
第一次接触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 任务管理之一 创建好了任务之后,就已经初步跨进了ucos II 的编程了.随着进一步的编程,发现学会创建了任务还是不够的. 在我的项目里,需要实现485通信功能,我创建了任务1用于串口 ...
- ucos II任务管理之三:删除任务
ucos II任务管理之三:删除任务 有了前面的经历之后,mcu21决定全面地学习了任务的管理.这样在项目编程中才能做到"信手拈来". 在ucos II 里,创建一个任务之后,可以 ...
- IAR中移植UCOS II系统以及sourceInsight 使用
ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...
- 51单片机中使用ucos ii的优缺点(好文)
摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题.本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优 ...
- 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理
uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...
- Oracle-分区表解读
概述 Oracle-OLAP和OLTP解读 Oracle-index索引解读 Oracle-分区表解读 Oracle-锁解读 Oracle-等待事件解读 Oracle-procedure/cursor ...
- μC/OS Ⅱ之任务就绪表的操作_2012.5.31
任务的登记: 1 OSRdyGrp |= OSMapTbl[prio>>3]; 2 OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; ...
- lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现
1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...
- ucos ii 源代码中文注释详解 : OS_TIME.C
//BY 简单的元清 //部分内容引用了其他博主的文章,对这些博主表示感谢,时间关系就不一一指出了. //如有转载,请说明,谢谢 /********************************** ...
最新文章
- jquery 获取id最大的元素_超全整理!JQuery中的选择器集合
- 【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)
- python数据显示为什么只能显示最后一个变量,Python变量和简单数据类型,之,的
- 开心的金明(洛谷-P1060)
- 《高质量C/C++编程指南》学习笔记
- 在Linux中如何使用gdb调试C程序
- 插值算法的Python实现方式
- 大数据统计分析、驾驶舱页面,拥有20个例子
- SJF调度算法(操作系统)短作业优先和最短剩余时间优先
- NB-IoT物联网技术
- centos7安装Mysql8.0步骤
- 美国大学计算机工程专业TOP10
- 字节跳动校招提前批前端一面总结
- python制作一个计时器_用Python制作一个猫咪小秒表
- 软件测试详解17--接口对接
- cmd命令行中文显示乱码解决办法
- 申请转正自评php开发,PHP开发工程师岗位自我评价怎么写
- android 横幅弹出权限,有关 android studio notification 横幅弹出的功能没有反应
- 有关meta learning 要读的论文清单
- Meta-Classifier in Membership Inference
热门文章
- [leetcode] 题型整理之动态规划
- 删除数据oracle,oracle删除数据
- html简易幻灯片,用html5实现的简单幻灯片实例
- ETL 工具的比较:Talend,Kettle,Informatica 等
- 转换文档参数_Word、Excel、PDF多格式转换?只需1招全搞定
- java array使用_Java_ArrayLit详细用法
- 北大先修课 计算机,解读:北大清华大学先修课的那些事
- java 8 Optional解决空指针异常问题
- 省、市联动的SQL脚本
- html用ajax做三级联动,怎样使用JS+AJAX做出三级联动