第一次接触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之就绪表解读相关推荐

  1. ucos II任务管理之一:挂起任务

    Ucos II 任务管理之一 创建好了任务之后,就已经初步跨进了ucos II 的编程了.随着进一步的编程,发现学会创建了任务还是不够的. 在我的项目里,需要实现485通信功能,我创建了任务1用于串口 ...

  2. ucos II任务管理之三:删除任务

    ucos II任务管理之三:删除任务 有了前面的经历之后,mcu21决定全面地学习了任务的管理.这样在项目编程中才能做到"信手拈来". 在ucos II 里,创建一个任务之后,可以 ...

  3. IAR中移植UCOS II系统以及sourceInsight 使用

    ucos 学习笔记 1 sourceInsight 使用 CSDN参考链接 新建工程 第一步:project中new project 第二步:在高亮部分输入工程的地址,工程文件夹与IAR工程文件夹放在 ...

  4. 51单片机中使用ucos ii的优缺点(好文)

    摘要:近年来,在单片机系统中嵌入操作系统已经成为人们越来越关心的一个话题.本文通过对一种源码公开的嵌入式实时操作系统ucos ii的分析,以51系列单片机为例,阐述了在单片机中使用该嵌入式操作系统的优 ...

  5. 用C语言写ucos中断服务程序,在ARM处理器上移植uCOS II的中断处理

    uCOS II是一个源码公开.可移植.可固化.可剪裁和抢占式的实时多任务操作系统,其大部分源码是用ANSI C编写,与处理器硬件相关的部分使用汇编语言编写.总量约200行的汇编语言部分被压缩到最低限度 ...

  6. Oracle-分区表解读

    概述 Oracle-OLAP和OLTP解读 Oracle-index索引解读 Oracle-分区表解读 Oracle-锁解读 Oracle-等待事件解读 Oracle-procedure/cursor ...

  7. μC/OS Ⅱ之任务就绪表的操作_2012.5.31

    任务的登记: 1 OSRdyGrp |= OSMapTbl[prio>>3]; 2 OSRdyTbl[prio>>3] |= OSMapTbl[prio&0x07]; ...

  8. lwip协议栈在linux运行,LwIP协议栈在uCOS II下的实现

    1.概述: LwIP协议栈在设计时就考虑到了将来的移植问题,因此把所有与硬件.OS.编译器相关的部份独立出来,放在ucosii&LwIPsource etlwiparch目录下.因此LwIP在 ...

  9. ucos ii 源代码中文注释详解 : OS_TIME.C

    //BY 简单的元清 //部分内容引用了其他博主的文章,对这些博主表示感谢,时间关系就不一一指出了. //如有转载,请说明,谢谢 /********************************** ...

最新文章

  1. jquery 获取id最大的元素_超全整理!JQuery中的选择器集合
  2. 【Python学习】 - 超详细的零基础Pandas学习(附Python数据分析与应用课本第四章实训答案)
  3. python数据显示为什么只能显示最后一个变量,Python变量和简单数据类型,之,的
  4. 开心的金明(洛谷-P1060)
  5. 《高质量C/C++编程指南》学习笔记
  6. 在Linux中如何使用gdb调试C程序
  7. 插值算法的Python实现方式
  8. 大数据统计分析、驾驶舱页面,拥有20个例子
  9. SJF调度算法(操作系统)短作业优先和最短剩余时间优先
  10. NB-IoT物联网技术
  11. centos7安装Mysql8.0步骤
  12. 美国大学计算机工程专业TOP10
  13. 字节跳动校招提前批前端一面总结
  14. python制作一个计时器_用Python制作一个猫咪小秒表
  15. 软件测试详解17--接口对接
  16. cmd命令行中文显示乱码解决办法
  17. 申请转正自评php开发,PHP开发工程师岗位自我评价怎么写
  18. android 横幅弹出权限,有关 android studio notification 横幅弹出的功能没有反应
  19. 有关meta learning 要读的论文清单
  20. Meta-Classifier in Membership Inference

热门文章

  1. [leetcode] 题型整理之动态规划
  2. 删除数据oracle,oracle删除数据
  3. html简易幻灯片,用html5实现的简单幻灯片实例
  4. ETL 工具的比较:Talend,Kettle,Informatica 等
  5. 转换文档参数_Word、Excel、PDF多格式转换?只需1招全搞定
  6. java array使用_Java_ArrayLit详细用法
  7. 北大先修课 计算机,解读:北大清华大学先修课的那些事
  8. java 8 Optional解决空指针异常问题
  9. 省、市联动的SQL脚本
  10. html用ajax做三级联动,怎样使用JS+AJAX做出三级联动