《嵌入式实时操作系统µC/OS-II》学习笔记(二)

2023-05-16

  第三章:内核结构

临界段:也就是需要保证原子操作的代码段。由这里的说法,绝大多数或者说所有的( ? )内核都是都是使用开关中断的方式来处理。在 uC/OS-II 中,使用 OS_ENTER_CRITICAL() OS_EXIT_CRITICAL() 两个定义在 OS_CPU.H 中的宏来开关中断。
任务:提到一个概念,说任务销毁时,仅仅是内核不再理会这个任务了,即代码不再运行了,任务绝对不会返回什么。其实如果有返回,又返回给谁呢?
任务控制块: uC/OS-II 使用它来保存一个任务的状态,一个 OS_TCB 数据结构(即任务控制块)记录一个任务的状态。其中包括任务的栈地址、传给任务的消息 ( 任务的消息 ? 和消息队列是什么关系? ) 、任务的延时、优先级、任务状态属性等等。
就绪表: uC/OS-II 最多支持 64 个任务(包括系统任务),使用一个 BYTE OSRdyGrp )和一个最大 ( 与任务数相关 )BYTE[8] 的数组( OSRdyTbl[] )表示它们的就绪状态。 OSRdyGrp 的第 n 位代表第 n 组中是 (1) (0) 存在就绪任务, OSRdyTbl[n] 的第 n 位表示这个任务是 (1) (0) 在就绪态。 uC/OS-II 在这里使用了一个简单的查找表快速的获取任务号,查找表的结构 OSMapTbl[n] 是第 n (0 开始 ) 1 ,其它为 0 BYTE 。如 OSMapTbl[0] = 1 OSMapTbl[1] = 2 OSMapTbl[2] = 4… 这样的表可以方便的由数字得到特定位数为 1 的字节,相当于 1<<n 。同样,可以用一个相反功能的查找表 (OSUnMapTbl) 来得到优先级最高的任务。 OSUnMapTbl[n] 相当于 for (i=0;(n&1)!=1 && n!=0;i++) n >>= 1; OSUnMapTbl[4] = 2 ,当 1 不止一位时,取最低位(因为它代表的优先级最高)。这样便可达到常数时间内查找最高优先级任务的目的。
任务切换:确认要进行任务切换以后,被挂起任务的寄存器入栈,即将运行的任务寄存器恢复。在 uC/OS-II 中,就绪任务的栈结构与刚刚发生中断一致,既寄存器在栈中,所以内核实际上只需要一个中断返回指令。有个问题就是在什么地方做任务的切换(包括判断切换),显然不是中断,因为中断中的切换有独有的函数,在什么情况下切换函数会到前台来?还是说我们直接在被挂函数中调用调度函数(这个函数在等待信号量等函数之中被调用),如果需要挂起再在这个位置保存现场,下次返回的时候,也就是调度函数返回的位置? —— 这个似乎说的过去,不过还需要确认。
空闲任务:在 uC/OS-II 中这个任务总是最低优先级,而且不会被挂起。它仅仅把一个 32 位变量不停的做 +1 操作。不过这个 +1 的过程也是关中断的,因为可能不只一条指令,时间很短,所以也没有太大的影响。另外有一个统计任务优先级稍高,它们与初始化之初的唯一一个高优先任务配合保证一个时钟节拍下空闲任务的完全运行,并由统计任务记录下这个最大的累加,以后便可根据每个时钟节拍下得到的其它累加,计算 CPU 使用率了。这也是多任务启动之初,主任务需要延时的原因。
中断引起的任务切换:进入中断服务程序时,我们在当前栈顶保存了任务的寄存器状态,在中断处理程序中,又调用了任务切换函数 (uC/OS-II 中为 OSIntCtxSw) ( 调用的过程就是压栈的过程 ) 如果需要做任务切换,那么在这个函数中,当前任务就已经被切换到了挂起状态,为了和上面提到的切换方式保持一致,我们需要调整一下栈的指针,保证当前栈顶为进入中断之前存储的寄存器状态,如下图所示。
 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《嵌入式实时操作系统µC/OS-II》学习笔记(二) 的相关文章

随机推荐

  • 重写Qt中的Widget移动事件

    如果您想在Qt中重写Widget的移动事件 xff0c 可以通过以下步骤实现 xff1a 创建自定义Widget并继承QWdget类 重写QWidget的mousePressEvent mouseMoveEvent 和mouseReleas
  • 如何在Qt中实现子控件和父控件的同步移动

    在Qt中 xff0c 可以通过重写子控件的moveEvent 函数来实现子控件和父控件的同步移动 具体步骤如下 xff1a 子控件继承QWidget或其子类 xff0c 并重写moveEvent 函数 在moveEvent 函数中 xff0
  • 如何使用 QToolTip

    QToolTip 是 Qt 框架中的一个类 xff0c 它可以用于在鼠标悬停在控件上时显示提示信息 下面是使用 QToolTip 的步骤 xff1a 在需要显示提示信息的控件上 xff0c 设置 setToolTip 方法 例如 xff1a
  • DbgHelp的使用方法

    DbgHelp是一个Windows平台下的调试器辅助工具 xff0c 它提供了一些函数和数据类型 xff0c 可以帮助开发者在调试时获取更多的信息 以下是DbgHelp的使用方法 xff1a 1 引入DbgHelp库 在代码中使用DbgHe
  • QString转化为char*

    QByteArray temp ip span class token operator 61 span mqtt config span class token punctuation span ip span class token p
  • qt转换Xcode编译

    usr local Cellar qt 6 0 2 bin qmake QTForXcode pro spec macx xcode
  • Java学习路线总结(思维导图篇)

    x1f3c6 作者简介 xff1a 哪吒 xff0c CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 x1f4aa xff0c 专注Java硬核干货分享 xff0c 立志做到Java赛道全网T
  • 刚毕业的表弟年薪40w......程序员薪资天花板?

    前不久 xff0c 腾讯2022校招 应届毕业生年薪 40 万 刷屏了 尽管互联网大厂的薪资高不算什么新鲜事儿 xff0c 但这个热搜仍然让我大受震撼 腾讯校招官网显示 xff0c 2022届腾讯校招开放技术 产品 设计等岗位共计 78 个
  • 运维面试题--Linux系统 启动过程

    简述 xff1a 1 开机BIOS自检 2 MBR引导 3 grub引导菜单 4 加载内核kernel 5 启动init进程 6 读取inittab文件 xff0c 执行rc sysinit rc等脚本 7 启动mingetty xff0c
  • Dockerfile中echo命令不能加 -e 选项

    以换源举例 xff1a span class token builtin class name export span span class token assign left variable CDN span span class to
  • jdbc环境配置及操作步骤

    文章目录 jdbc环境配置jdbc 操作步骤 jdbc 环境配置 jdbc开发 xff0c 需要提前先准备驱动包 下载一个mysql驱动包 xff09 及配置 xff08 项目配置引入这个驱动包 下载链接 xff1a mysql驱动包 注意
  • 在柱状图中找最大矩形——O(n)时间复杂度java实现

    最近在刷leetcode xff0c 又碰到了这道题 xff0c 想起来当时算法有些瑕疵 xff0c 所以将最新的AC代码更新在最上面做个对比 xff0c 具体思路见注释 public class Solution 思路 主要是使用一个栈来
  • 记一次Hive平台清洗数据

    场景 xff08 简化 xff09 现有文章表Article和评论表Comment xff1b 一篇文章可以有多个评论 xff1b 文章表Article主要字段 xff08 articleId xff09 xff1b 评论表Comment主
  • UART协议及串口回环

    UART协议及串口回环 一 异步通信的分类1 UART xff08 通用异步收发器 xff09 2 RS4223 RS4854 Modbus5 接口标准 二 UART协议要求1 空闲状态2 起始位3 数据位4 校验位5 停止位6 波特率7
  • 使用MapReduce实现遗传算法

    摘要 xff1a 遗传算法在大规模问题的求解中得到越来越多的应用 传统的基于MPI的并行遗传算法需要知道机器架构的细节 另一方面 xff0c 由Google提出的MapReduce可用于开发具有扩展性和容错能力的应用 xff0c 是一个强大
  • 2021-03-08

    解决大疆无人机电池电压不平衡出现电池错误提示无法起飞 一个简单的笨办法 xff0c 处理某块电芯偏低 xff0c 而另一块明显偏高 xff0c 经平衡和数据修正后 xff0c 在使用中反复 xff0c 说明各电芯之间容量发生物理不可逆的容量
  • 如何学习编程语言-API学习

    作为一个本科非计算机科班出身编程水平又很菜的我来说 xff0c 很多学习方法都需要我自己去总结摸索 xff0c 我的老师朋友可以帮我解决具体的问题 xff0c 给我提供足够的资源 xff0c 但是最关键的细节把握和吸收消化还是需要我自己去完
  • 49天精通Java,第9天,java final关键字

    nbsp 目录 一 final nbsp 1 修饰引用 nbsp 2 修饰方法 3 修饰类 二 Java中的对象析构与finalize方法
  • 正点原子----Linux设备树详解

    linux设备树 1 什么是设备树2 DTS DTB DTC的关系3 如何编译设备树4 DTS基本结构4 1 语法4 2 设备树在系统中的体现4 3 尝试自己添加节点4 4 尝试对根节点追加信息 5 设备树特殊节点5 1 chosen子节点
  • 《嵌入式实时操作系统µC/OS-II》学习笔记(二)

    第三章 xff1a 内核结构 临界段 xff1a 也就是需要保证原子操作的代码段 由这里的说法 xff0c 绝大多数或者说所有的 xff08 xff09 内核都是都是使用开关中断的方式来处理 在 uC OS II 中 xff0c 使用 OS