神来之笔, us/os-II的就绪表

2024-01-29 09:48
文章标签 ii os 就绪 us 神来之笔

本文主要是介绍神来之笔, us/os-II的就绪表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

3.0           就绪表(Ready List)
每个任务被赋予不同的优先级等级,从0级到最低优先级OS_LOWEST_PR1O,包括0和OS_LOWEST_PR1O在内(见文件OS_CFG.H)。当μC/OS-Ⅱ初始化的时候,最低优先级OS_LOWEST_PR1O总是被赋给空闲任务idle task。注意,最多任务数目OS_MAX_TASKS和最低优先级数是没有关系的。用户应用程序可以只有10个任务,而仍然可以有32个优先级的级别(如果用户将最低优先级数设为31的话)。
每个任务的就绪态标志都放入就绪表中的,就绪表中有两个变量OSRedyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。就绪表OSRdyTbl[]数组的大小取决于OS_LOWEST_PR1O(见文件OS_CFG.H)。当用户的应用程序中任务数目比较少时,减少OS_LOWEST_PR1O的值可以降低μC/OS-Ⅱ对RAM(数据空间)的需求量。
为确定下次该哪个优先级的任务运行了,内核调度器总是将OS_LOWEST_PR1O在就绪表中相应字节的相应位置1。OSRdyGrp和OSRdyTbl[]之间的关系见图3.3,是按以下规则给出的:
当OSRdyTbl[0]中的任何一位是1时,OSRdyGrp的第0位置1,
当OSRdyTbl[1]中的任何一位是1时,OSRdyGrp的第1位置1,
当OSRdyTbl[2]中的任何一位是1时,OSRdyGrp的第2位置1,
当OSRdyTbl[3]中的任何一位是1时,OSRdyGrp的第3位置1,
当OSRdyTbl[4]中的任何一位是1时,OSRdyGrp的第4位置1,
当OSRdyTbl[5]中的任何一位是1时,OSRdyGrp的第5位置1,
当OSRdyTbl[6]中的任何一位是1时,OSRdyGrp的第6位置1,
当OSRdyTbl[7]中的任何一位是1时,OSRdyGrp的第7位置1,
程序清单3.5中的代码用于将任务放入就绪表。Prio是任务的优先级。
程序清单 L3.5 使任务进入就绪态   (这两行代码简直是神来之笔啊!!!)
/*
这行代码功能是找到列 , 把列上的值置为 1
不妨假设 prio 的值为 13, 即优先级为 13. prio>>3 右移 3 位后值为 1, 可以查表 T3.1 找出 OSMapTbl[1] 的值为 0000 0010. 再用 0000 0010 OSRdyGrp 进行异或运算
*/
OSRdyGrp |= OSMapTbl[prio >> 3];
/*
*/
OSRdyTbl[prio >> 3] |= OSMapTbl[prio & 0x07];
T3.1 OSMapTbl[] 的值
Index
Bit Mask (Binary)
0
00000001
1
00000010
2
00000100
3
00001000
4
00010000
5
00100000
6
01000000
7
10000000
读者可以看出,任务优先级的低三位用于确定任务在总就绪表OSRdyTbl[]中的所在位。接下去的三位用于确定是在OSRdyTbl[]数组的第几个元素。OSMapTbl[]是在ROM中的(见文件OS_CORE.C)屏蔽字,用于限制OSRdyTbl[]数组的元素下标在0到7之间,见表3.1
图3.3μC/OS-Ⅱ就绪表
如果一个任务被删除了,则用程序清单3.6中的代码做求反处理。
程序清单 L3.6 从就绪表中删除一个任务
if ((OSRdyTbl[prio >> 3] &= ~OSMapTbl[prio & 0x07]) == 0)
    OSRdyGrp &= ~OSMapTbl[prio >> 3];
以上代码将就绪任务表数组OSRdyTbl[]中相应元素的相应位清零,而对于OSRdyGrp,只有当被删除任务所在任务组中全组任务一个都没有进入就绪态时,才将相应位清零。也就是说OSRdyTbl[prio>>3]所有的位都是零时,OSRdyGrp的相应位才清零。为了找到那个进入就绪态的优先级最高的任务,并不需要从OSRdyTbl[0]开始扫描整个就绪任务表,只需要查另外一张表,即优先级判定表OSUnMapTbl([256])(见文件OS_CORE.C)。OSRdyTbl[]中每个字节的8位代表这一组的8个任务哪些进入就绪态了,低位的优先级高于高位。利用这个字节为下标来查OSUnMapTbl这张表,返回的字节就是该组任务中就绪态任务中优先级最高的那个任务所在的位置。这个返回值在0到7之间。确定进入就绪态的优先级最高的任务是用以下代码完成的,如程序清单L3.7所示。
程序清单 L3.7 找出进入就绪态的优先级最高的任务
y    = OSUnMapTbl[OSRdyGrp];
x    = OSUnMapTbl[OSRdyTbl[y]];
prio = (y << 3) + x;
    例如,如果 OSRdyGrp 的值为二进制 01101000 ,查 OSUnMapTbl[OSRdyGrp] 得到的值是 3 ,它相应于 OSRdyGrp 中的第 3 bit3 ,这里假设最右边的一位是第 0 bit0 。类似地,如果 OSRdyTbl[3] 的值是二进制 11100100, OSUnMapTbl[OSRdyTbc[3]] 的值是 2 ,即第 2 位。于是任务的优先级 Prio 就等于 26 3*8+2 )。利用这个优先级的值。查任务控制块优先级表 OSTCBPrioTbl[] ,得到指向相应任务的任务控制块 OS_TCB 的工作就完成了。 

这篇关于神来之笔, us/os-II的就绪表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/656517

相关文章

如何在OS中获得SSD的寿命耐久度

这里还是以DELL的机器为例,通常DELL的服务器带有的磁盘会有显示SSD耐久度,当然也不排除SSD更新太快,有部分SSD无法在戴尔的服务器上查看到SSD的耐久度,但实际上本身只要是SSD肯定还是可以有方法查看SSD的耐久度,可以通过OS的方式进行查看,以RHEL7.9为例 首先我们需要下载安装DELL的PERCCLI的阵列卡工具,该工具可以很好的查看DELL服务器上的阵列卡对应的信息,如阵列卡

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

leetcode刷题(39)——反转链表 II

这道题可以说是非常难的,2中解法,迭代和递归,递归更加难想出来 解法1:迭代链接反转 算法 在看具体算法之前,有必要先弄清楚链接反转的原理以及需要哪些指针。举例而言,有一个三个不同结点组成的链表 A → B → C,需要反转结点中的链接成为 A ← B ← C。 假设我们有两个指针,一个指向结点 A,一个指向结点 B。 分别记为 prev 和 cur。则可以用这两个指针简单地实现 A 和 B

leetcode刷题(38)——142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。 说明:不允许修改给定的链表。 示例 1: 输入:head = [3,2,0,-4], pos = 1 输出:tail connects to node index 1

leetcode刷题(93)——213. 打家劫舍 II

你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。 示例 1: 输入: [2,3,2]输出: 3解释:

【数学】100332. 包含所有 1 的最小矩形面积 II

本文涉及知识点 数学 LeetCode100332. 包含所有 1 的最小矩形面积 II 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形,并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值。 注意,这些矩形可以相接。 示例 1: 输入: grid = [[1,0,1],[1,1,1]]

代码随想录算法训练营第四十六天 | 121. 买卖股票的最佳时机、122.买卖股票的最佳时机II、123.买卖股票的最佳时机III

121. 买卖股票的最佳时机 题目链接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ 文档讲解:https://programmercarl.com/0121.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4… 视频讲解:https://www.bil

287 寻找重复数-类似于环形链表II

题目 给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返回 这个重复的数 。 你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。 示例 输入:nums = [1,3,4,2,2] 输出:2 解析 这道题倒是可以读懂,就是找到数

我的OS X系统使用小结

最近硬盘出现了故障,为了恢复确认问题,我的Windows电脑就一直运行坏道检测程序,暂时将工作迁移到我的MacBook Pro(后面简称为MBP)上进行。这里简单总结下自己是如何使用MBP进行做的。 原本计划是用我的小米游戏笔记本,但是不知为何,即便是非游戏模式,风扇偶尔也会狂转,产生很大的噪音。相反,MBP非常安静,就是有点烫手。 我的MBP是17年款,13寸屏幕,蝶式键盘。为了不烫手

QNX OS微内核系统

微内核架构 微内核(Microkernel)架构是一种操作系统架构模式,其核心思想是尽量将操作系统的基本功能压缩在最小的核心中,而将其他服务(如设备驱动、文件系统、网络协议等)放在用户空间中运行,从而增加系统的灵活性和安全性,这种架构有几个主要特点和优势: 最小化核心:微内核仅包括最基本的系统管理功能和最少的抽象层,如进程通信、基本的调度和内存管理。模块化:系统服务和驱动程序作为独立的模块运行