RTOS原理和应用总结

RTOS的作用

RTOS一般应用在中低端处理器当中,这里举一个笔者日常开发遇到的案例来说明RTOS的作用。

假设你有一个设备,这个设备的外围硬件很多,假设有LED、一个网口、若干RS232等等。

在没有RTOS的时候,我们用裸机编程来写,那么通常的做法是写一个while(1)循环,在这个循环中执行ES485通讯、LED点亮、网口并采集数据。

但是这样子做,有时候并不能符合当前的应用场景,比如:

  1. 网口的通讯与服务器交互,需要优先处理服务器的指令和向服务器发送状态
  2. LED有很多类型,一些是指示灯,一些是呼吸灯,其优先级不高
  3. RS232数量很多,需要不断查询,其优先级并没有网口这么重要,当时又比LED的等级要高,因为232会与外设进行必要通讯

如果采用了while 1的方式,则每个流程的优先级并不能很好体现,且个别LED或者232如果是受控于网口则有控制关系,采用while 1控制外设,也不能体现出外设的控制关系

如此,为了解决优先级以及外设之间通讯的关系,RTOS便由此诞生了。

RTOS的概念:全称为Real-Time Operating System(实时操作系统),是一种专门设计用于处理实时任务的操作系统。与通用计算机上运行的桌面操作系统(如Windows、Linux)不同,RTOS专注于提供对实时性能和响应时间的支持

这里解释一下这个概念:

  1. 外设间的通讯关系一般操作系统都会提供,比如Linux这种操作系统也提供了很多通讯机制
  2. RTOS与其它类型OS的最大不同点就在于:实时性能和响应时间。比如Linux上执行一个程序的时间往往是不固定的,会受到其它外围硬件的影响。而RTOS提供了优先级的概念,让程序的执行时间可以被预测到。这个后面再细谈何为优先级。
  3. RTOS是一个系统类型的简称,跟偏向一种概念,基于RTOS的概念,市面上的常见RTOS有UCOS、FreeRTOS、RT-Thread等等。

RTOS的实现

RTOS的核心实现主要是分为两点:

  1. 多任务多优先级的实现
  2. 通讯机制的实现
    (TIP:有些类型的RTOS还会带有一些组件或者软件包,比如物联网组件、语言类软件包等等,但是这些都不是RTOS所必要的)

多任务多优先级的实现

多任务也就是一个时间内执行多个任务,比如上文的LED和232,其应该一起进行。但是232的优先级又比LED等级高,遇到232大量的突发任务的时候,232应该被优先执行。

以单核实现为例,我们只需要控制LED和232让其交替进行,在宏观的角度上便认为是同时运行的(实际上微观上就是把一个任务一个任务来进行,只不过每个人任务都执行一段时间后,就执行另外的任务)。因此实现任务的切换是关键的。

关于实现任务的切换,我们要从微观的角度去看,即芯片的执行内容由何种因素去决定的。清楚如何控制芯片的执行内容便可以轻易的去切换芯片去执行自己想要的内容了。

大多数芯片的实现,往往是将R0Rx寄存器与必要的寄存器(比如计数器、状态寄存器等)推到堆栈内,然后取出需要执行的任务的寄存器(也是R0Rx寄存器与必要的寄存器),来实现任务的切换。这点如果不理解的话,建议读者可以学习一下汇编语言,汇编会很接近处理器的处理逻辑。

本文给出另外一个文章进行参考:
https://blog.csdn.net/weixin_47702410/article/details/119751040

而优先级的实现,即让程序设定自己的优先级等级,系统进行判断,当前哪个任务的优先级高便执行高优先级的程序,如果优先级一样高,那就轮转调度(也就是两个任务交替执行)。如果使用了优先级的RTOS,需要注意,高优先级一定要可以主动释放自己的执行权的,不然就会处在一直处理高优先级而低优先级将不会被执行。这种主动释放执行权限的操作往往就是加上不阻塞的休眠,在高优先级处在休眠期间,就不会占用CPU了,如此低优先级的任务便可以被执行了。

通讯机制的实现

通讯机制一般指的是若干个任务之间的通讯方式。任务其实相当于大型系统中的进程的概念,每个进程都会认为自己享有了计算机的所有资源,RTOS中的任务也是如此。但是在实际情况下,任务并不是享有所有的资源的,比如某个232口,有多个任务想发送数据,如果同时一起发送就会导致232时序和内容出现问题,应该依次发送。

另外任务之间也是需要通信的,比如上文的网口需要控制LED,同时又需要被动等待232是否收到消息。

综上,通信机制的特点是:

  1. 主要是用于任务之间的通讯
  2. 主要分为两大类,一类为资源控制类,另一类是消息传递类

本文也给出另外一个文章说明资源控制类的信号量机制是如何实现的:
https://blog.csdn.net/weixin_47702410/article/details/119752649

RTOS常见的通讯机制

资源控制类
  • 信号量:用于同步任务或控制对共享资源的访问。信号量可以是二进制的(用作互斥锁)或计数的(用于管理有限数量的资源)
  • 互斥锁:一种特殊类型的信号量,专门用于提供对共享资源的互斥访问。类似二只信号量,但是一般互斥锁带有避免优先级反转的方案
  • 自旋锁:在多核或支持线程的系统中使用,当一个任务尝试获取锁而锁已被占用时,任务会在一个循环中等待(即“自旋”),直到锁变为可用。自旋锁适用于短时间内的锁定,因为它们在等待时不会使任务进入睡眠状态。
消息传递类
  • 邮箱(Mailbox):允许一个任务发送消息给另一个任务的邮箱。邮箱通常是基于中断的,可以存储固定大小的消息。
  • 事件(Event):用于通知一个或多个任务某些条件已经发生。事件可以是单个标志或一组标志,任务可以等待一个或多个事件的发生。
  • 工作队列(Work Queue):允许任务将工作项排队到一个队列中,这些工作项随后由工作线程以FIFO(先进先出)的顺序处理。
  • 消息队列(Message Queue):允许任务发送和接收消息。消息队列可以存储多个消息,并且可以配置为具有优先级,以便优先处理更重要的消息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/13703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML5 多媒体应用技术

目录 多媒体元素 audio元素video元素多媒体事件与JavaScript交互音频和视频轨道(Track)媒体API MediaElement APIMediaSource Extensions (MSE)Encrypted Media Extensions (EME)Web Audio API

数据库同步软件,天不生PanguSync万古如长夜

在信息时代的海洋中,数据是那永不熄灭的灯塔,照亮了科技发展的航道。然而,随着数据的膨胀和应用场景的多样化,如何确保这些宝贵资源在不同平台、不同设备间实时更新、保持一致性,便成了一道亟待解决的难题。于是&#…

Android File Transfer for mac(强大的安卓文件传输工具) 直装版

Android File Transfer是一款专门为Mac用户设计的软件,它用于在Android设备与Mac之间传输文件。这款软件提供了简单直观的操作界面,使用户能够轻松地在Android设备和Mac之间传输和管理文件。 下载地址:https://www.macz.com/mac/7099.html?i…

使用python实现socket进行消息传输-demo

Socket 是什么 Socket 是一种在计算机网络中用于实现进程间通信的一种机制。它是网络编程中的重要概念,通过它可以在不同的计算机之间进行数据传输和通信。Socket 可以用于实现各种网络应用,包括客户端-服务器模型、P2P 应用等。基本上,Sock…

自动驾驶决策规划算法——二次规划

自动驾驶决策规划算法第二章第二节(中) 参考线算法_哔哩哔哩_bilibili 动态规划开辟的凸空间如下,两条橙色线之间: 黄色的点就意味着L的上下界,物理意义是当轨迹ss1时,L的范围应该是(Lmin1,Lmax1)之间,这个范围就是开辟…

学习日记.1

今天就是配置了droidbot的环境。主要的知识来源是GitHub - xieincz/droidbot: A lightweight test input generator for Android. Similar to Monkey, but with more intelligence and cool features! 看readme,注意只需要platform就好,sdk太大不用下载…

《Ai企业知识库》-模型实践-rasa开源学习框架-基础理论-02

rasa官网 Conversational AI Platform | Superior Customer Experiences Start Here rasa简介: Rasa是一个开源的机器学习框架,专门用于构建自动化的文本和语音对话系统,即聊天机器人。它允许开发者和企业创建定制化的对话体验&#xff0c…

ubuntu设置root开机登录,允许root用户ssh远程登录

ubuntu与centos系统不同,默认root开机不能登录。 1、输入一下命令创建root密码,根据提示输入新密码 sudo passwd root 2、打开gdm-autologin文件,将auth required pam_succeed_if.so user ! root quiet_success这行注释掉,这行就…

el-upload 上传多个视频

<el-form-item label"视频" prop"video_url"><el-uploadclass"upload-demo"ref"uploadRef":multiple"true":on-change"handleChange":before-remove"beforeRemove":before-upload"before…

Flutter 中的 EditableText 小部件:全面指南

Flutter 中的 EditableText 小部件&#xff1a;全面指南 在Flutter中&#xff0c;EditableText是一个低级别的文本编辑组件&#xff0c;它提供了构建自定义文本编辑界面的能力。与TextField和TextFormField不同&#xff0c;EditableText提供了更多的灵活性&#xff0c;允许开发…

【LinuxC语言】链接文件

文章目录 前言一、inode索引节点inode的作用为什么inode重要 二、文件链接的定义文件链接是什么硬链接&#xff08;Hard Link&#xff09;软链接&#xff08;符号链接&#xff0c;Symbolic Link&#xff09;硬链接图示&#xff1a;软链接图示&#xff1a; 硬链接应用场景限制和…

五步定位性能瓶颈

一、着手测试前的准备&#xff1a;优化数据流向与系统架构分析 在进行性能测试或系统优化之前&#xff0c;明确数据流向和系统架构的细节是至关重要的步骤。这不仅能够帮助识别潜在的瓶颈&#xff0c;还能确保测试用例设计的全面性与针对性。以下是关键步骤和方法&#xff1a;…

实现本地访问云主机,以及在云主机搭建FTP站点

前言 云计算是一种基于互联网的计算模式&#xff0c;通过网络提供按需访问的计算资源和服务。核心概念是把计算能力视作一种公共资源&#xff0c;用户可以根据自身需求动态分配和管理这些资源。 云主机 ECS (Elastic Compute Server)是一种按需获取的云端服务器&#xff0c;提…

142.栈和队列:用栈实现队列(力扣)

题目描述 代码解决 class MyQueue { public:stack<int> stIn; // 输入栈&#xff0c;用于push操作stack<int> stOut; // 输出栈&#xff0c;用于pop和peek操作MyQueue() {}void push(int x) {stIn.push(x); // 将元素压入输入栈}int pop() {// 如果输出栈为空&…

虚拟列表 vue-virtual-scroller 的使用

npm 详情&#xff1a;vue-virtual-scroller - npm (npmjs.com) 这里我使用的是RecycleScroller。 App.vue <template><RecycleScrollerclass"scroller":items"items":item-size"54"v-slot"{ item }"><list-item :it…

Flask Response 对象

文章目录 创建 Response 对象设置响应内容设置响应状态码设置响应头完整的示例拓展设置响应的 cookie重定向响应发送文件作为响应 总结 Flask 是一个 Python Web 框架&#xff0c;用于快速开发 Web 应用程序。在 Flask 中&#xff0c;我们使用 Response 对象来构建 HTTP 响应。…

【论文笔记】advPattern

【论文题目】 advPattern: Physical-World Attacks on Deep Person Re-Identification via Adversarially Transformable Patterns Abstract 本文首次尝试对深度reID实施鲁棒的物理世界攻击。提出了一种新颖的攻击算法&#xff0c;称为advPattern&#xff0c;用于在衣服上生成…

文本转语音软件-TTSMaker

一、TTSMaker介绍 TTSMaker&#xff08;马克配音&#xff09;是一款免费的文本转语音工具&#xff0c;提供语音合成服务&#xff0c;支持多种语言&#xff0c;包括中文、英语、日语、韩语、法语、德语、西班牙语、阿拉伯语等50多种语言&#xff0c;以及超过300种语音风格。 可…

C语言指针相关知识(第四篇章)(非常详细版)

文章目录 前言一、什么是回调函数二、qsort函数的介绍(默认升序排序)三、qsort函数的模拟实现&#xff08;通过冒泡排序&#xff09;总结 前言 本文介绍了回调函数&#xff0c;qsort函数的使用&#xff0c;以用冒泡排序来模拟实现qsort函数 提示&#xff1a;以下是本篇文章正文…

持续总结中!2024年面试必问 20 道 Redis面试题(四)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道 Redis面试题&#xff08;三&#xff09;-CSDN博客 七、Redis过期键的删除策略&#xff1f; Redis 过期键的删除策略主要涉及以下几种方式&#xff1a; 1. 定时删除&#xff08;Timed Expiration&#xff…