嵌入式操作系统-ucos是什么?

2023-05-16

一句话概括ucos系统:一款源代码开放的,抢占式多任务实时操作系统。其在整个嵌入式产品的架构中的角色和主要功能代码如下图所示:ucos 系统建立了用户程序和底层硬件之间沟通的渠道。通过ucos系统的管理和调度,一方面可以很好的对硬件进行驱动;另一方面可以为上层用户软件提供系统级别的软件支撑。

ucos的任务】:

前面我们提到:前后台系统的后台部分,作为软件的核心处理主体,一直处于无限循环状态。同样,ucos的任务和这个后台系统及其他的多任务系统一样,每个任务都是一个独立功能的无限循环。不同的是,ucos支持任务的参数输入

任务如何实现状态变迁】:

世间万物,在其存在期间都有各种各样的生存状态。软件领域里的任务也不例外。在ucos系统中,任务也有着自己的状态表示,同时还可以根据“外界环境”的变化和系统内部提供的指令接口在各个状态之间进行变迁。

任务睡眠状态

睡眠状态下的任务,驻留在内存中,或者可以理解为用户已经在代码实现上完成了coding,但是并没有让ucos接管该任务的管理权。即在这种状态下,ucos系统是不会对这类任务进行调度和处理的。通过ucos系统的指令接口OsTaskCreate和OsTaskDel,实现用户和ucos间对任务管理权的交接。

任务就绪状态

当任务被创建并由ucos接管后,即进入到就绪状态。换句话说,就是等待CPU资源进行任务的运行。但是什么时候能够获取到CPU资源,将由ucos系统调度来决定。

任务运行状态

当任务获取到CPU资源,即进入到运行状态。在该中状态下,任务占用CPU和其他资源按照任务的设定功能执行相关代码,提供相关任务的服务。

任务等待状态

多任务系统中,很多资源都是所有任务共享的。当任务试图获取某项资源失败后,都会进入到等待状态。在等待状态中,该任务会释放CPU资源,进入被等待资源的等待队列中。当被等待资源被释放后,ucos会从等待队列中,找到优先级最高的等待任务恢复到运行状态继续执行。

同时,ucos系统也提供了另一种等待策略:任务延时等待。即运行状态下的任务,可以通过延时等待功能进入到等待状态,此时释放CPU资源。当等待超时后,会重新抢夺CPU资源,至于那个时候能不能抢到,就看超时后调度的时刻是否有优先级更高的任务了。

任务中断状态

中断状态,即任务在执行过程中,被硬件中断处理过程打断执行过程,被迫放弃CPU资源。进入到中断服务函数中。当中断结束后,重新对CPU资源进行抢占。同理,能否抢到CPU资源,就要看任务调度时刻,是否有更高优先级的任务就绪。下图优先级B>C>A。所以当ISR结束后,CPU资源被任务B抢占。

任务信息如何存储】:

现实生活中,每个人都有个人档案用于存放个人的历史和关键信息。同样的,ucos为每个任务专门制作了各自对应的档案,档案对应的数据结构(数据结构体),就被我们称为TCB(Tack Control Block)即任务控制块。有了这些TCB帮助,当任务从切换或者打断中恢复执行,能够保证从被打断点继续执行。具体任务的TCB细节说明,将会在下一个章节的任务管理中,详细介绍。

任务就绪表】:

如上文提到,任务需要进入到就绪状态后,才能够在合适的时间内被ucos系统进行调度。为了便于索引,ucos系统在内部建立了就绪组OsRdyGrp(8个bit单位)和就绪位数组OsRdyTbl[](每个元素为8个bit单位)两个变量,用于和任务的优先级建立索引关系。ucos系统中,共定义0-63,即64个任务优先级。0的优先级最高,63优先级最低。

OsRdyGrp的定义:

OsRdyGrp与OsRdyTbl[]之间的映射图:

:当OsRdyTbl[x]任何一个bit置位,对应的OsRdyGrp的第x位bit也相应置位。x=0-7。

任务如何调度的】:

按照我们前文的介绍,ucos总是让处在就绪状态并且优先级最高的那个任务占用CPU资源运行。那么从64个任务中,如何找到就绪并且优先级最高的任务,就是任务调度器的工作了。部分任务调度器的源码如下:

我们需要重点关注:

  • - 第二个if语句。判断从就绪队列获取的任务最高有限,与当前运行任务的有限级的比较
  • - OS_TASK_SW()的调度:该函数宏定义,用于出发一次任务的调度。

注:在操作系统中,调度总是认为由中断引起。这里很多处理器提供了一种模拟硬中断的机制:软中断语句,让CPU误以为的确发生了中断事件,需要进行任务的调度检查从而进行任务的调度。具体任务的调度细节,如任务现场如何保存,堆栈如何恢复,将会在后面ucos的任务管理里面,重点讲解。

ucos系统的初始化和启动】:

ucos的系统初始化比较简单,直接调用OSInit()即可。需要注意的是:ucos借鉴了模块化的思想,在配置文件OS_CFG.H文件中,定义了一些配置宏定义,可以根据项目的需要进行使能或者去使能。当系统初始化后,我们直接调用OSStart接口,启动ucos系统。调用接口后,调度器将会开始工作,从就绪队列中寻找到优先级最高的那个任务开始执行。

以上内容,仅仅是个人的经验总结,如有疏漏和错误地方,还请各位知友批评指正共同进步。另外如果想对嵌入式操作系统有深入和权威的了解,还可以自行阅读以下书籍。本文章系列仅仅站在答主个人的理解角度,力求用通俗的语言向嵌入式爱好者们普及嵌入式的一些理论和实战知识。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入式操作系统-ucos是什么? 的相关文章

随机推荐

  • CMakeLists笔记

    CMakeLists笔记 一 路径名二 函数三 常用 一 路径名 PROJECT SOURCE DIR xff1a 一般为catkin ws src xff0c 是cmakelists的绝对路径PROJECT BINARY DIR xff1
  • 源码编译安装openvino

    源码编译安装openvino 1 原地升级cmake2 编译opencv4 5 33 下载openvino4 配置usb规则 参考博客 交叉编译方式 1 原地升级cmake 方法一 xff1a 下载3 19 0中的CMake 3 19 0
  • 【ros】读取串口数据

    文章目录 一 自定义 gnrmc msg二 代码三 结果四 注意点 有时候 有的设备是通过串口发送数据 xff0c 想要在 ros 中 xff0c 读取串口数据 xff0c 记录一下操作 xff1a 一 自定义 gnrmc msg 首先需要
  • Android守护进程

    守护进程 守护进程 一直在后台运行的进程 本文主要讲解一些android比较常用的守护进程的方法 实现思想 1 保活 xff0c 通过提高进程优先级 xff0c 降低进程被杀死的概率 2 拉起 xff0c 进程被杀死后 xff0c 进行拉起
  • ros package 由于依赖 msg 导致编译问题解决

    文章目录 1 问题2 解决 1 问题 经常我们会自定义一些 msg 给其他的 package 使用 如果正常写 CmakeLists txt 在编译的时候 就会提示没有找到依赖的 msg 需要先编译 msg 的 package 再编译其他的
  • 使用Docker部署软件运行环境

    什么是docker xff1f Docker是基于Go语言进行开发实现 xff0c 一个开源的应用容器引擎 采用Linux内核的cgroup xff0c namespace xff0c 以及AUFS类的Union FS等技术 xff0c 对
  • 【控制control】四足机器人运动学、动力学模型

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 四足机器人实际模型的物理难点二 四足机器人运动学模型1 方法一 xff1a DH法建
  • 【项目解读】fast_planner工程解读

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 规划系统运行逻辑 业务部分 1 Fast planner node cpp 程序入口
  • IMU方向位姿估计

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 方法一 xff1a IMU方向位姿可以直接从IMU本身提供的专有算法中获得 xff0
  • 【autoware的仿真平台】

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 仿真的必要性及常见的仿真工具介绍二 gazebo仿真插件介绍及源码解析1 gazeb
  • 【机械臂、无人机规控篇】(8)机械臂轨迹规划、跟踪控制方向

    系列文章目录 提示 xff1a 这里可以添加系列文章的所有文章的目录 xff0c 目录需要自己手动添加 TODO 写完再整理 文章目录 系列文章目录前言一 机械臂的规划控制和无人的规划控制的异同点分析1 规划的异同分析2 控制的异同分析 二
  • 微信支付——支付签名验证失败的坑

    只讲几个微信支付开发中的签名问题 xff08 JAVA版的公众号支付 xff09 第一个是获取订单数据时生成 xff0c 然后通过这些数据生成预支付订单 xff08 通过 统一下单 方法取得 xff09 xff0c 微信官方返回一串xml数
  • c++的多重继承

    一 前言 每个类只继承一个父辈 xff0c 在现实世界中事情通常是这样的 xff0c 但是有一些类却代表两个类的合成 例如两用沙发 xff0c 它是一张床 xff0c 也是一个沙发 二 示例代码 xff0c 用作下面提出问题使用 span
  • 学习 STM32之九轴姿态传感器(BWT901CL)串口通信读取数据

    由于个人应用到3轴传感器 xff0c 所以买了直接买了一个9轴的 xff0c 用于学习STM32Core平台串口2连接维特智能串口Normal协议 xff0c 然后通过串口1直接打印数据 xff0c 接收传感器数据和与传感器进行通信 xff
  • 用遗传算法求解旅行商问题

    以下是用遗传算法解决旅行商问题的实验报告 1 问题描述 旅行商问题 xff08 Travelling Salesman Problem 简记TSP xff0c 亦称货郎担问题 xff1a 设有n个城市和距离矩阵D 61 dij xff0c
  • 学习LLC谐振变换电路的工作原理

    五 学习LLC谐振变换电路的工作原理 在具有电阻R 电感L和电容C元件的交流电路中 xff0c 电路两端的电压与其中电流相位一般是不同的 如果调节电路元件 xff08 L或C xff09 的参数或电源频率 xff0c 可以使它们相位相同 x
  • 关于电赛应该了解的事

    2021年1月31日 xff0c 全国大学生电子设计竞赛组委会向各赛区组委会 各有关高校下发 关于组织2021年全国大学生电子设计竞赛的通知 xff0c 正式启动2021年全国竞赛组织工作 电赛越来越近 xff0c 很多大一大二的同学还没有
  • stm32的基本学习路径---新手指南

    心得 xff1a 本人学习STM32的时候有一些跟风的因素 xff0c 自以为学的芯片越多就越厉害 61 61 其实 xff0c 学习嵌入式重要的是整体的工程思想和项目经验积累 xff0c 说到底这些芯片 xff0c 我感觉学习起来都差不多
  • 初学stm32建议的---实用开发板推荐

    STM32编程作为一项实操性很强的技能 xff0c 所以要多实操 初学的话 xff0c 我觉得书籍就暂时先不买吧 xff0c 先考虑入手一块STM32开发板 xff0c 然后跟着开发板的教程走 几年前 xff0c 做STM32的教程有很多家
  • 嵌入式操作系统-ucos是什么?

    一句话概括ucos系统 xff1a 一款源代码开放的 xff0c 抢占式多任务实时操作系统 其在整个嵌入式产品的架构中的角色和主要功能代码如下图所示 xff1a ucos 系统建立了用户程序和底层硬件之间沟通的渠道 通过ucos系统的管理和