ucos操作系统(1)——OSTCBY,OSRdyGrp,OSRdyTbl
OSRdyGrp相当于列,有多少组,是一个变量
OSRdyTbl是一个数组,每个数组元素是8位的,每一位代表一个优先级
转载自https://blog.csdn.net/d521000121/article/details/53678252
关于这三个系统变量,研究了好一阵子,也在网上查了不少资料,感觉挺乱的,就按自己的理解写得详细一点。
希望能让人只看一篇博文就能搞懂这个是怎么用的。
首先给出这三个变量的定义:
INT8U const OSUnMapTbl[256] = {
0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, /* 0x00 to 0x0F /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x10 to 0x1F /
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x20 to 0x2F /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x30 to 0x3F /
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x40 to 0x4F /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x50 to 0x5F /
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x60 to 0x6F /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x70 to 0x7F /
7, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x80 to 0x8F /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0x90 to 0x9F /
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0xA0 to 0xAF /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0xB0 to 0xBF /
6, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0xC0 to 0xCF /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0xD0 to 0xDF /
5, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, / 0xE0 to 0xEF /
4, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0 / 0xF0 to 0xFF */
};
INT8U OSRdyGrp;
INT8U OSRdyTbl[8];
他们3个用的都是INT8U的变量,也就是无符号的8bit变量。
那么现在来一个个解释它们代表的意思:
OSRdyGrp,它将64个优先级分为8组,恰好就是与这个变量的8bit一一对应;
举个例子,假设OSRdyGrp = 00000100B 那么就可以说明第2组存在一个就绪任务,也就是说优先级为16~23中有一个或多个任务已就绪。
OSRdyTbl[8],就是对应的8个分组了;
继续刚刚的例子,在OSRdyGrp = 00000100B 的情况下,我们可以肯定OSRdyTbl[2] 中一定有一位或者多位为1。
那么OSRdyTbl[2]的作用就是记录究竟哪一个优先级的任务已就绪,假设OSRdyTbl[2] = 10000001B ,那么我们就可以知道,应该是这一组第0和7的任务就绪了。
最后就剩下 OSUnMapTbl[256],它其实就是用于查找为1的最低位,他是一个数组,而数组记录的数字是事先写好的,那么它有什么意义呢?
我们继续刚刚的例子,已知OSRdyGrp = 00000100B ,OSRdyTbl[2] = 10000001B ,现在有一段这样的查表代码
y = OSUnMapTbl[OSRdyGrp];
x = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;
y = OSUnMapTbl[OSRdyGrp]; 将 00000100B 转换为十进制后是4,也就是 y = OSUnMapTbl[4] , 即 y = 2;其代表的含义就是 4 转换为二进制后为1的最低位在第二位。
这就告诉了我们,第二组是有就绪任务的组中的最高优先级的组。
然后x = OSUnMapTbl[OSRdyTbl[y]]; , x = OSUnMapTbl[OSRdyTbl[3]], 即 x = OSUnMapTbl[10000001B] ----> x = OSUmMapTbl[129] -----> x = 0
这又告诉了我们,第二组中,就绪的最高优先级任务是第二组的第0个任务。
prio = y << 3 + x 就是 y * 8 + x, 就是我们想要找的所有任务中已就绪的最高优先级任务。
其实归根结底这是一种典型的用空间换取时间的方法,在设置就绪任务时设置一个标记,就能以O(1)的时间查找出已就绪的最高优先级任务,这个方法在这个系统里其他地方还有应用,以切合系统的实时性。
转载自
https://blog.csdn.net/HLYL7923/article/details/79914699
ucos操作系统(1)——OSTCBY,OSRdyGrp,OSRdyTbl相关推荐
- 基于stm32的BMS电池管理系统源代码-带u基于stm32的BMS电池管理系统源代码-带ucos操作系统
企业级基于stm32的BMS电池管理系统源代码-带u基于stm32的BMS电池管理系统源代码-带ucos操作系统,代码整齐规范,企业级别 YID:129652995742054咸鱼的鱼
- STM32学习之ucos操作系统
ucos操作系统是一种实时的嵌入式操作系统,特点是源码公开,可移植,可固化,可裁剪,多任务,任务栈等等,我们想要使用ucos操作系统需要根据自己的芯片内核还有型号来下载不同版本的操作系统源码,并且移植 ...
- UCOS操作系统——信号量与互斥信号量(九)
UCOS操作系统 文章目录 UCOS操作系统 一.信号量简介 1.二进制信号量 2.计数型信号量 二.使用信号量 1.相关API函数 2.OSSemCreate()创建信号量 3.OSSemPend( ...
- UCOS操作系统——事件标志组(十四)
UCOS操作系统 文章目录 UCOS操作系统 前言 一.事件标志组 二.相关函数 1.创建事件标志组 2. 等待事件标志组 3.向事件标志组发布标志 三.事件标志组实验 前言 前面我们提到过可以使用信 ...
- UCOS操作系统基础
文章目录 1.UCOS简介 2.UCOS任务的概念 3.UCOS专业术语 4.任务间的同步与通信 5.UCOS中断.时钟节拍和初始化 6.UCOS代码规约 1.UCOS简介 实时操作系统: 保证在一定 ...
- 初识ucos操作系统-----基于freescale K60硬件平台的ucos-ii的移植
先给自己打个广告,本人的微信公众号正式上线了,搜索:张笑生的地盘,主要关注嵌入式软件开发,股票基金定投,足球等等,希望大家多多关注,有问题可以直接留言给我,一定尽心尽力回答大家的问题,二维码如下: 一 ...
- UCOS 操作系统 安装配置环境
一.下载Borland C++ 4.5或Borland C++ 5.0和Turbo Assembler 5.0(TASM 5.0) 二.安装Borland C++ 4.5/5.0(我的安装在C:/BC ...
- ARM-M架构移植UCOS操作系统
最近准备面试,把本科到现在的一些比赛相关的东西整理一下.那些年在飞思卡尔在K60单片机上的UCOSII移植(哎,心酸...) 一.首先看下UCOSII的文件结构: 一些核心的文件解释: ...
- UCOS源码剖析 (一)
UCOS源码详解 uC/OS-II源码分析(总体思路 一) 首先从main函数开始,下面是uC/OS-II main函数的大致流程: main() { OSInit(); TaskCreat ...
最新文章
- 专属自己的二维游戏引擎【二】
- UNIX再学习 -- 函数 fork 和 vfork
- 穷人的语义处理工具箱之一:语义版Jaccard
- 第三方应用如何在SAP Kyma上进行服务注册
- console.log()不显示结果_RNA结合蛋白与RNA的缠绵故事,教你不做实验发文章
- java删除某些段落word_Java 批量删除Word中的空白段落示例代码
- Unity 导出Supermap exe
- linux给命令起别名命令,alias命令 – 设置命令别名
- 由于找不到Qt5widgets.dll,无法继续执行代码。重新安装程序可能会解决此问题。
- [原创] Wireshark工具培训
- java基础集合_Java基础之:集合——Map
- android pickerview 多行,Android仿ios条件选择器pickerview
- linux 桌面时间,桌面锁屏时钟下载-桌面锁屏时钟appv2.8.1-Linux公社
- IE10,带您走进HTML5时代
- 【PP模块】工艺路线详解(Routing)
- [原创]手把手教你Linux下的多线程设计--Linux下多线程编程详解(一)
- 搜索某个网段内所有在线IP的一串命令
- 物联网毕业设计-选题推荐
- java计算机毕业设计教学互动跟踪系统源码+mysql数据库+系统+lw文档+部署
- java如何模拟抢单_基于jsp的抢单兼职-JavaEE实现抢单兼职 - java项目源码
热门文章
- 朝雨的方向,梦回故里
- numpy.array和python列表的转换
- 霍尼236主机说明书_霍尼韦尔plus-236报警主机
- 非root用户免密ssh登录到linux---防破解!!
- 大数据开发方向分享:春招获蚂蚁金服、拼多多、华为(终端)、远景能源、华泰证券等offer
- Binder源码阅读指南之java层,作为Android开发程序员
- 微软预览word_如何在Microsoft Word中更改语言
- request_threaded_irq及IRQF_ONESHOT的简单研究
- 集体照的拍摄及后期合成
- 自动批量处理人像照片