RTOS概念介绍

2023-05-16

事件标志组

事件标志组是实现多任务同步的有效机制之一。也许有不理解的初学者会问采用事件标志组多麻烦,搞个全局变量不是更简单,其实不然。在裸机编程时,使用全局变量的确比较方便,但是在加上 RTOS 后就是另一种情况了。使用全局变量相比事件标志组主要有如下三个问题:

 使用事件标志组可以让 RTOS 内核有效的管理任务,全局变量是无法做到的,任务的超时等机制需要用户自己去实现。
 使用了全局变量就要防止多任务的访问冲突,使用事件标志组已经处理好了这个问题。用户无需担心。
 使用事件标志组可以有效的解决中断服务程序和任务之间的同步问题。任务间事件

标志组的实现是指各个任务之间使用事件标志组实现任务的通信或者同步机制。RTX 每个任务创建的时候,会自动创建 16 个事件标志,事件标志被存储到每个任务的任务控制块中。也就是说每个任务支持 16 个事件标志

在这里插入图片描述

运行条件:
 创建 2 个任务 Task1 和 Task2
运行过程描述如下:
 任务 Task1 运行过程中调用函数 os_evt_wait_and,等待事件标志位被设置,任务 Task1 由运行态进
入到挂起态
 任务 Task2 设置了任务 Task1 的事件标志,任务 Task1 由挂起态进入到就绪态,在调度器的作用下
由就绪态又进入到运行态。

实际应用中,中断方式的消息机制切记注意以下四个个问题:
 中断函数的执行时间越短越好,防止其它低于这个中断优先级的异常不能得到及时响应。
 实际应用中,建议不要在中断中实现消息处理,用户可以在中断服务程序里面发送消息通知任务,在任务中实现消息处理,这样可以有效的保证中断服务程序的实时响应。同时此任务也需要设置为高优先级,以便退出中断函数后任务可以得到及时执行。
 中断服务程序中一定要调用专用于中断的事件标志设置函数 isr_evt_set。
 在 RTX 操作系统中实现中断函数跟裸机编程是一样的。
 另外强烈推荐用户将 Cortex-M3 内核的 STM32F103 和 Cortex-M4 内核的 STM32F407 的NVIC 优先级分组设置为 4,即NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。
 用户要在 RTX 多任务开启前就设置好优先级分组,一旦设置好切记不可再修改。

事件标志组API函 数
使用如下 6 个函数可以实现 RTX 的事件标志组:
 os_evt_clr
 os_evt_get
 os_evt_set
 os_evt_wait_and
 os_evt_wait_or
 isr_evt_set

信号量

信号量的作用又该如何体现呢?比如有个 30 人的电脑机房,我们就可以创建信号量的初始化值是 30,表示 30 个可用资源,不理解的初学者表示信号量还有初始值?是的,信号量说白了就是共享资源的数量。另外我们要求一个同学使用一台电脑,这样每有一个同学使用一台电脑,那么信号量的数值就减一,直到 30 台电脑都被占用,此时信号量的数值就是 0。如果此时还有几个同学没有电脑可
以使用,那么这几个同学就得等待,直到有同学离开,有一个同学离开,那么信号量的数值就加 1,有两个就加 2,依次类推。刚才没有电脑用的同学此时就有电脑可以用了,有几个同学用,信号量就减几,直到再次没有电脑可以用,这么一个过程就是使用信号量来管理共享资源的过程。

平时使用信号量主要实现以下两个功能
 两个任务或者中断函数跟任务之间的同步功能,这个和上章节讲解的事件标志组是类似的。其实就是共享资源为 1 的时候。
 多个共享资源的管理
在这里插入图片描述
运行条件:
 创建 2 个任务 Task1 和 Task2。
创建信号量可用资源为 1。
运行过程描述如下:
 任务Task1运行过程中调用函数os_sem_wait获取信号量资源,如果信号量没有被任务Task2占用,Task1 将直接获取资源。如果信号被 Task2 占用,任务 Task1 将由运行态转到挂起状态,等待资源可用。一旦获取了资源并使用完毕后会通过函数 os_sem_send 释放掉资源。
 任务Task2运行过程中调用函数os_sem_wait获取信号量资源,如果信号量没有被任务Task2占用,Task1 将直接获取资源。如果信号被 Task2 占用,任务 Task1 将由运行态转到挂起状态,等待资源可以。一旦获取了资源并使用完毕后会通过函数 os_sem_send 释放掉资源。

信号量API函数
 os_sem_init
 os_sem_send
 isr_sem_send
 os_sem_wait

互斥信号量

互斥信号量就是信号量的一种特殊形式,也就是信号量初始值为 1 的情况。有些 RTOS 中也将信号量初始值设置为 1 的情况称之为二值信号量。为什么叫二值信号量呢?因为信号量资源被获取了,信号量值就是 0,信号量资源被释放,信号量值就是 1,把这种只有 0 和 1 两种情况的信号量称之为二值信号量。
互斥信号量的主要作用就是对资源实现互斥访问。下面举一个通过二值信号量实现资源独享,即互斥访问的例子,让大家有一个形象的认识运行条件:
 让两个任务 Task1 和 Task2 都有运行串口打印 printf,这里我们就对函数 printf 通过二值信号量实
现互斥访问。如果不对函数 printf 进行互斥访问,串口打印容易出现乱码。
 用信号量实现二值信号量只需将信号量的初始值设置为 1 即可。

RTX 互斥信号量的实现
在这里插入图片描述
运行条件:
 创建 2 个任务 Task1 和 Task2,优先级分别为 1 和 3,也就是任务 Task2 的优先级最高
 任务 Task1 和 Task2 互斥访问串口打印 printf。
 使用 RTX 的互斥信号量实现串口打印 printf 的互斥访问。
运行过程描述如下:
 低优先级任务 Task1 执行过程中先获得互斥资源 printf 的执行。此时任务 Task2 抢占了任务 Task1
的执行,任务 Task1 被挂起。任务 Task2 得到执行。
 任务 Task2 执行过程中也需要调用互斥资源,但是发现任务 Task1 正在访问,此时任务 Task1 的优
先级会被提升到跟 Task2 同一个优先级,也就是优先级 3,这个就是所谓的优先级继承(Priority
inheritance),这样就有效的防止了优先级翻转问题。任务 Task2 被挂起,任务 Task1 有新的优先
级继续执行。
 任务 Task1 执行完毕并释放互斥资源后,优先级恢复到原来的水平。由于互斥资源可以使用,任务Task2 获得互斥资源后开始执行。

消息邮箱

RTX 的消息邮箱实际上就是消息队列,通过内核提供的服务,任务或中断服务子程序可以将一个消息(注意,RTX 消息邮箱传递的是消息的地址而不是实际的数据)放入到消息队列。同样,一个或者多个任务可以通过内核服务从消息队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO)。也许有不理解的初学者会问采用消息邮箱多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程
时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。
使用全局数组相比消息邮箱主要有如下四个问题:
 使用消息邮箱可以让 RTOS 内核有效的管理任务,全局数组是无法做到的,任务的超时等机制需要用户自己去实现。
 使用了全局数组就要防止多任务的访问冲突,使用消息邮箱已经处理好了这个问题。用户无需担心。
 使用消息邮箱可以有效的解决中断服务程序跟任务之间消息传递的问题。
 FIFO 机制更有利于数据的处理。

在这里插入图片描述
运行条件:
 创建消息邮箱,可以存放 10 个消息。
 创建 2 个任务 Task1 和 Task2,任务 Task1 向消息邮箱放数据地址,任务 Task2 从消息邮箱取数据地址。
 RTX 的消息读取和存放仅支持 FIFO 方式。
运行过程主要有以下两种情况:
 任务 Task1 向消息邮箱放数据地址,任务 Task2 从消息邮箱取数据地址,如果放数据地址的速度快
于取数据的速度,那么会出现消息邮箱存放满的情况,RTX 的消息存放函数 os_mbx_send 支持超时等待,可以设置超时等待,直到有位置可以存放消息放或者设置时间超时。
 任务 Task1 向消息邮箱放数据地址,任务 Task2 从消息邮箱取数据地址,如果放数据地址的速度慢于取数据的速度,那么会出现消息邮箱为空的情况,RTX 的消息获取函数 os_mbx_wait 支持超时等待,可以设置超时等待,直到消息邮箱中有消息放或者设置时间超时。

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

RTOS概念介绍 的相关文章

  • RTOS任务切换原理与实现

    曾今只是使用过移植好的RTOS进行任务开发 xff0c 对其实现的底层原理一直一知半解 xff0c 正好接触到了李述桐老师的课程以及一些网上的资料 xff0c 让我对实时操作系统的原理有了更深的理解 xff0c 特此把一些原理和思考记录下来
  • RTOS任务调度过程(上下文切换)

    RTOS任务调度过程 xff08 上下文切换 xff09 解析 xff1a RTOS任务调度的机制是基于内核异常机制的 xff0c 即每产生一次调度就会产生一次内核异常 xff0c 那么 xff0c 要了解RTOS的任务调度机制需要先明白内
  • 手写RTOS-PendSV中断

    今天这一篇 xff0c 我们说一下操作系统都要用到的PendSV中断 xff0c 整个操作系统中 xff0c 要自己写的的汇编代码不超过20行 xff0c 全部都在PendSV中断里 以下是 Cotex M3权威指南 里对PendSV的描述
  • CCS v6.1下完成TI-RTOS配置

    TI RTOS 是实时操作系统的TI微控制器 TI RTOS实现更快的发展不再需要开发人员编写和维护的系统软件 xff0c 如调度程序 xff0c 协议栈和驱动程序 它结合了实时多任务内核与其他中间件组件 xff0c 包括TCP IP和US
  • 主流 RTOS 评估

    1 RT Thread RT Thread 是国内出产的一款非常优秀的 RTOS 它和 FreeRTOS uCos 等经典 RTOS 最大的不同是 xff1a 它不仅仅是一个实时内核 xff0c 还具备丰富的中间层组件 它提供了一个完整的软
  • 【RTOS的最通俗理解】行业大佬用一篇文章带你快速理解RTOS

    文章目录 单片机 RTOS 架构 1 RTOS的概念 1 1 用人来类比单片机程序和RTOS 1 1 1 我无法一心多用1 2 2 我可以一心多用 1 2 程序简单示例 2 架构的概念 2 1 用人来类比电子产品2 2 要深入理解RTOS就
  • RTOS关于SysTickHandler()

    我们知道FREERTOS会自动装载PendSV Handler 和SVC Handler 函数 xff0c 这里我们希望自己对其从新定义 xff0c 故做如下处理 include 34 delay h 34 include 34 sys h
  • RTOS消息队列和邮箱区别

    消息队列可以发送多条消息 xff0c 消息队列遵守FIFO特性 xff0c 只能一条一条读和写消息 消息队列是邮箱数组 如果发送者是一对一的方式发送邮件 xff0c 则等待列表中的优先级最高的任务将获取邮件 xff1b 如果是以广播的方式发
  • RTOS 中 Task 之间资源共享示例

    RTOS 中 Task 之间资源共享示例 什么是共享资源 大型项目往往需要创建多个任务 xff0c 任务之间协同合作完成一个大型的功能 在前述的章节中 xff0c 我们讲述了任务间的同步与通信 xff0c 但合作与竞争总是相辅相成的 任务
  • STM32 Free RTOS实战

    FreeRTOS是一个开源的实时操作系统 使用的平台 xff1a 秉火STM32 Cortex M3内核开发板 xff0c Free RTOS v8 2 3 多任务流水灯 span class token builtin class nam
  • RTOS论文笔记(二)

    李在林 韩宏克 嵌入式Linux实时性分析及改造 2010 Linux 的实时性测试 中断延迟测试 在Linux中 xff0c 内核或驱动程序显式地关 开中断 xff0c 一般是通过调用 cli sti 来进行操作的 在调用 cli 时 x
  • 01-RTOS

    对于裸机而言 xff0c 对于RTOS而言 即 xff1a 对于裸机 xff0c 打游戏意味着不能回消息 回消息意味着不能打游戏 对于RTOS 打游戏和裸机的切换只需要一个时间片节拍 1ms 从宏观来看 就是同时进行的两件事 xff08 但
  • RT-Thread uart2串口dma idle接收不断帧

    硬件STM32F407 IDE使用RT Thread Studio uart2串口使用这两个引脚 功能 IO端口 UART2 TX PA2 UART2 RX PA3 UART2 DMA接收配置 先使能DMA接收 RX缓冲区可以稍微调大些 b
  • UCOS2的文件目录

    想着闲着也是闲着 把之前学习ucos2源码的笔记整理一下 复盘一次 总结内容将其写为博客作为学习的输出 一 为什么要学RTOS或者IOTOS 我在大一时 开始进入实验室接触单片机 摸爬滚打的参加了几次比赛 也因此入了嵌入式的坑 大三时开始思
  • RTT-信号量

    RTT 信号量 概念 信号量就是一个标记位 释放信号量就是标记位加一 获取信号量后自动减一 减到0后不能再获取了 信号量 Semaphore 是一种实现线程间通信的机制 实现线程之间同步或临界资源的互斥访问 常用于协助一组相互竞争的线程来访
  • FreeRTOS-创建删除任务

    1 FreeRTOSConfig h文件 FreeRTOSConfig h配置文件作用 对FreeRTOS进行功能配置和裁剪 以及API函数的使能 相关的宏可以分为三大类 INCLUDE 配置FreeRTOS中可选的API函数 config
  • 自己动手写RTOS:02-在M3内核上实现pendsvc

    自己动手写RTOS 自己动手写RTOS 01基础知识和理论部分 自己动手写RTOS 02 在M3内核上实现pendsvc 文章目录 自己动手写RTOS 一 M3内核的相关知识 1 1寄存器 1 2特殊寄存器 1 3堆栈 二 pendSVC实
  • 像 PTLsim 这样的 CAS 模拟器如何实现 x86 硬件的周期精确模拟?

    谁能告诉我 CAS 软件怎么样http www ptlsim org 工作 如果不知道每条指令使用了多少个周期 也不知道 CPU 分支预测逻辑 那么它们如何实现周期精度 或者一切都可以通过保密协议获得吗 我想它们可能可以非常准确地命中或错过
  • RT-Thread 内核基础(五)

    使用static修饰全局变量作用 限制作用域 如果全局变量前面加上 static 关键字 那么该变量的作用域将被限制在声明它的源文件中 即它将成为一个文件作用域的静态变量 其它源文件无法访问这个变量 这对于控制变量的可见性和避免命名冲突是有
  • 小型 ARM 微控制器的 RTOS 内核之间的可量化差异 [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 有许多不同的 RTOS 可用于微控制器 我专门寻找支持 ARM Cortex M 处理器的 RTOS 另外 我对闭源解决方案不感兴趣 试图从网站

随机推荐

  • 我招了个程序员:他什么都好,就是不太会写程序

    我招了个程序员 xff1a 他什么都好 xff0c 就是不太会写程序 多年以后 xff0c ShowMeBug 的创始人李亚飞站在医院产房前 xff0c 依然会想起大学刚毕业时面试的第一家公司 1 当时 xff0c CTO 面试到他 xff
  • 想招到合适的程序员,为什么我建议你一定要笔试

    寒窗苦读十数载 xff0c 毕业之后 xff0c 你还愿意考试吗 xff1f 相信绝大多数人都是不愿意的 但有一种考试 xff0c 却是在招聘过程中不可避免的 xff0c 那就是笔试 笔试 xff0c 说白了就是出一套题 xff0c 打印出
  • 资深 iOS 开发工程师教你5 道题全面考察候选人

    伯乐相 码 专栏三 xff1a 资深 iOS 开发工程师教你5 道题全面考察候选人 hello 大家好 xff0c 本期是我们伯乐相 码 专栏第三期节目 xff0c 今天给大家分享的是一位7年资深的IOS开发工程师如何简单通过5道题来全面考
  • ShowMeBug 荣膺「2021年中国人力资源科技创新产品奖」

    9月10日 xff0c 由中国领先的人力资源科技平台 HRTech China 发起的 2021年中国人力资源科技年度峰会 暨表彰大会在深圳隆重举办 HRTech China 盛大揭晓了2021年度中国人力资源科技大奖 xff0c 从公开征
  • 全球软件案例研究峰会,今日13:30线上开幕,ShowMeBug B站联合直播,赶紧扫码关注占坑位吧

    往期案例分享 案例 加快技术招聘步伐 xff0c 小鹏汽车选择使用ShowMeBug 案例 省去繁琐简历筛选 xff0c 微伴助手 选择 ShowMeBug 在线笔试提高人才精准度 案例丨秋招之下 xff0c 乐言科技如何通过 ShowMe
  • 瞄准程序员招聘痛点,ShowMeBug让面试代码操作可“回放”

    程序员虽然是建设互联网的职业之一 xff0c 但他们的招聘工作的线上化却有不少难题 疫情加速了市场对远程办公 远程面试 远程教学等模式的接受程度 xff0c 但程序员招聘涉及到代码能力测试 xff0c 甚至不同企业有不同的产品代码基础 xf
  • 这些IT行业趋势,将改变2023

    上一周 xff0c 你被 34 AI 34 刷屏了吗 xff1f 打开任何一家科技媒体 xff0c 人工智能都是不变的热门话题 周初大家还在用ChatGPT写论文 查资料 写代码 xff0c 到周末的时候大家已经开始用GPT 4图像识别来做
  • 基于惯性导航的(IMU,MEMS)的室内定位

    大家都知道惯导随着时间误差会不断积累 xff0c 所以这个方法往往不会单独使用 xff0c 而是和其他技术一起进行融合 由其他的绝对定位技术提供校正信息 xff0c 而惯导的信息提供连续的定位和起到对其他位置的平滑作用 针对行人而言 xff
  • 服务器初次跑YOLO数据集总结

    服务器跑模型时候遇见的部分问题 一 Pycharm 1 torch版本号相比于YOLO版本号过高 现象 xff1a Runtime xff1a result type float can t be cast to the desired o
  • 技术招聘漫谈 | Java工程师招聘难?你可能需要这份独家指南

    两周前 xff0c 我们发布了一篇关于怎样招聘前端工程师的文章 xff08 点击此处顾 xff09 在文章中 xff0c 我们分析了前端岗位有哪些必不可少的考察要点 xff0c 以及如何在面试中考核对方是否能写出高质量的代码 xff0c 这
  • 技术招聘演化论:怎样从纸上答题升级到实战编程?

    创新赛道的出现 一些企业或许已经对招聘管理系统 xff08 Applicant Tracking System xff0c 简称 ATS xff09 有一定了解 xff0c ATS 可以帮助企业管理招聘流程 xff0c 其中包括发布招聘信息
  • 一次查找分子级Bug的经历,过程太酸爽了

    Debugging is like trying to find a needle in a haystack except the needle is also made of hay Debug调试就像是在大片的干草堆中找针一样 xff
  • k8s 内部实现服务注册和服务调用

    k8s内部的服务注册主要是依靠几个组件 coreDns service和pod的标签选择器 服务注册的流程 pod创建完以后 xff0c 一般我们都会打算一组标签 xff0c 标签是key value形式的 如下 apiVersion v1
  • 使用Jetson Nano向PX4提供T265位置信息,实现室内定点飞行

    使用的Jetson Nano镜像版本 xff1a 4 6 xff08 2021 08 04发布 xff09 NVIDIA官方镜像下载链接 1 安装 ROS Melodic 参考官网安装教程 设置sources list sudo sh c
  • 结束,也是开始。

    三年时光转眼即逝 xff0c 临到毕业才幡然醒悟 xff0c 自己掌握的专业技能太少 xff0c 最后几个月才养成了几个好习惯 在上班利用空闲时间多学学其他的技术 xff0c 希望自己可以不停的努力 xff0c 充实自己的每一天
  • win10 和ubuntu双系统设置启动顺序和时间

    安装了ubuntu18 04后 xff0c 默认启动项是ubuntu xff0c 如果希望默认启动项是windows xff0c 修改方法如下 xff1a 1 进入Ubuntu系统 xff0c 打开终端 xff0c 输入 sudo gedi
  • 论 "张筱雨"

    当今网络谁最红 xff1f 当今网络谁最裸 xff1f 当今网络谁征服了大多数男人们的眼球 xff1f 当今网络谁最具创新 xff0c 引领时尚潮流 xff0c 当今网络谁敢和日本AV女优叫板 那么她就是 张筱雨 张筱雨 xff01 xff
  • PostgreSQL 性能优化--参数的配置

    nbsp nbsp nbsp PostgreSQL的配置参数作为性能调优的一部分 起着重要的位置 有时候一个简单的配置参数就会觉得应用的性能 因此有必要简单了解下其相关的配置参数 查询Linux服务器配置 在进行性能调优之前 需要清楚知道服
  • EJB指导教程前言

    前言 xff1a 本人将通过EJB tutorialspoint 网站学习EJB相关知识 xff0c 并将一部分知识翻译整理写为博客 xff0c 加入自己的见解 xff0c 供分享和交流 一 EJB指导 企业级Java Beans EJB
  • RTOS概念介绍

    事件标志组 事件标志组是实现多任务同步的有效机制之一 也许有不理解的初学者会问采用事件标志组多麻烦 xff0c 搞个全局变量不是更简单 xff0c 其实不然 在裸机编程时 xff0c 使用全局变量的确比较方便 xff0c 但是在加上 RTO