当前位置: 首页 > backend >正文

26-RTOS的基本介绍

一、实时操作系统的基本概述

1.1 基本概念

        RTOS(Real Time OS)即实时操作系统,根据各个任务的要求,进行资源管理、消息管理、任务调度、异常处理等工作。

        此外,RTOS还提供了任务间的同步与通信机制,如信号量、消息队列和事件标志,以确保多个任务能够协调工作。RTOS广泛应用于工业控制、航空航天、汽车电子等领域,满足严格的实时性和可靠性需求。

        实时多任务操作系统,以分时方式运行多个任务,任务之间的切换以优先级为根据。只有优先服务方式的RTOS才是真正的实时操作系统。使用实时操作系统还需要额外的ROM/RAM开销,2~5%的CPU额外负荷,以及内核的费用。

使用实时操作系统的必要性:
  1. 嵌入式实时操作系统提高了系统的可靠性
  2. 提高了开发效率,缩短了开发周期。例如官方甚至提高网络协议栈、文件系统、图形界面(ucGUI、emWin、QT....)的支持。
  3. 嵌入式实时操作系统充分发挥了32位CPU的多任务潜力(提高吞吐量,就是一个负载均衡)。

1.2 开发优势

1并发性

2模块化:高内聚、低耦合的原则

3生态:很多高级软件组件,必须依赖于操作系统来实现

4实时性:功能复杂的情况下,实时性无法保证

5可重用性:软件可重用性差,总是重复造轮子

1.3 种类说明

1.3.1 UCOS(ucos2、ucos3)(商用收费)

网址:https://www.micrium.com/ 

1.3.2 RT-Thread(国产:商用免费)

网址:https://www.rt-thread.org/

1.3.3 FreeRTOS(免费)

网址:FreeRTOS™ - FreeRTOS™

二、RTOS的任务概念和调度策略

1.1 RTOS背景介绍

        实时操作系统 (RTOS) 是一种体积小巧、确定性强的计算机操作系统。RTOS 通常用于需要在严格时间限制内对外部事件做出反应的嵌入式系统,如医疗设备和汽车电子控制单元 (ECU)。

        此外,RTOS 提供了任务调度、中断处理、内存管理和进程间通信等核心功能,确保系统能够在高负载和复杂环境下稳定运行。RTOS 的设计还允许开发人员精确控制任务的执行顺序和时间,从而满足各种实时应用的需求。RTOS 的应用范围将进一步扩大,为更多领域提供高效、稳定的操作系统支持。

1.2 RTOS多任务处理

        内核是操作系统的核心组件,负责管理系统的硬件资源并提供基本的服务。Linux 等通用操作系统采用的内核允许多个用户看似同时访问计算机的处理器,通过时间片轮转和优先级调度等机制实现多任务处理。这些用户可以各自执行多个程序,看起来像是并发运行,每个执行的程序由操作系统控制下的一个或多个线程实现。如果操作系统能够以这种方式执行多个线程,则称为多任务处理。

        像 FreeRTOS 这样的小型 RTOS 通常将线程称为任务,因为它们不支持虚拟内存,因此进程和线程之间没有区别。使用多任务操作系统可以简化原本复杂的软件应用程序的设计:操作系统的多任务处理和任务间通信功能允许将复杂的应用程序划分为一组更小且更易于管理的任务。这种划分可以简化软件测试,确保团队分工明确,并促进代码复用。复杂的时序和排序细节将由 RTOS 内核负责,从而减轻了应用程序代码的负担。

        FreeRTOS任务同时拥有linux进程与线程的特性。任务之间数据通信通过消息队列,任务间同步有信号量、互斥锁、事件标志组。

        在多任务环境中,内核还提供了同步和通信机制,如信号量、消息队列和事件标志,以确保任务之间的协调和数据一致性。这些机制使得开发者能够构建更加模块化和可维护的应用程序,同时减少潜在的错误和复杂性。

1.3 多任务处并发

        常规单核处理器一次只能执行一个任务,但多任务操作系统可以快速切换任务, 使所有任务看起来像是同时在执行。下图展示了 三个任务相对于时间的执行模式。任务名称用不同颜色标示,并写在左侧。时间从左向右移动, 彩色线条显示在特定时间执行的任务。上方展示了所感知的并发执行模式, 下方展示了实际的多任务执行模式。

1.4 RTOS调度策略

        调度器是内核中负责决定在特定时间应执行什么任务的部分。内核可以在任务的生命周期内多次暂停并恢复该任务。如果任务B取代任务A成为当前执行的任务(即任务A暂停,任务B恢复),我们就可以称任务A“换出”,任务B“换入”。调度策略是调度器用来决定何时执行哪个任务的算法。在(非实时)多用户系统中,调度策略通常会确保每个任务获得“公平”的处理器时间。

        只有当调度算法决定执行不同的任务时,任务才会换出。这种切换可能在当前执行的任务不知情的情况下发生,例如调度算法响应外部事件或定时器到期时;还可能发生在执行任务显式调用某个导致其让出、休眠(也称为延迟)或阻塞的API函数时。如果某任务让出,调度算法可能会再次选择同一任务执行。如果某任务休眠,则在指定的延迟时间到期前不可被选择。同样,如果某任务阻塞,则在特定事件发生(例如,数据到达UART)或超时期满之前将不可被选择。操作系统内核负责管理这些任务状态和转换,确保根据调度算法和每个任务的当前状态在给定时间选择适当的任务执行。

        此外,调度器还需要考虑任务的优先级、资源需求和系统负载等因素,以优化整体性能和响应时间。在多核处理器系统中,调度器还需协调多个核心之间的任务分配,以实现负载均衡和最大化并行处理能力。调度器的设计还可能包括对任务间通信和同步机制的支持,以确保任务在共享资源时不会发生冲突或死锁。

1.5 实时调度策略

        实时操作系统 (RTOS) 利用与通用(非实时)系统相同的原理来实现多任务处理, 但两者的目标截然不同。这一差异主要体现在调度策略上。实时嵌入式系统 旨在对现实世界的事件作出及时响应。这些事件通常有截止时间, 实时嵌入式系统必须在此之前响应,RTOS 调度策略必须确保遵守这些截止时间要求。

        为在小型 RTOS(如 FreeRTOS)中实现这一目标,软件工程师必须为每个任务分配优先级。RTOS 的调度策略 就是确保能够执行的最高优先级任务获得处理时间。如果存在多个能够运行的同等最高优先级任务(既没有延迟也没有阻塞),则调度策略可以选择在这些任务之间“公平”地分配处理时间。

        这种基本形式的实时调度并非万能,无法改变时间的快慢,应用程序编写者必须确保设定的时序约束在所选任务优先级安排下是可行的。

        RTOS 会自行创建一个任务,即空闲任务(空闲任务优先级是最低的 IDle Task), 仅当没有其他任务能够执行时,该任务才会执行。RTOS 空闲任务总是处于可以执行的状态。

三、RTOS代码框架设计

1.一个任务管理一个硬件

2.任务与任务或任务与中断涉及到数据传输使用消息队列

3.任务间共享资源访问使用互斥锁

4.任务的同步使用信号量

5.标志位的管理使用事件标志组

6.编写一个专门初始化硬件的任务,该任务可以包含创建任务的功能。

四、FreeRTOS的基本概述

1.1 基本概念

        FreeRTOS(Free Real-Time Operating System)是一个开源的实时操作系统,专门设计用于嵌入式系统和实时应用程序。它提供了一套简单、可移植、可扩展的内核功能,帮助开发者管理任务调度、内存管理、中断处理、通信和同步等操作,以便在资源受限的嵌入式环境下实现可靠的实时任务调度和协作。

        FreeRTOS是RTOS系统的一种,FreeRTOS十分的小巧,可以在资源有限的微控制器中运行,当然,FreeRTOS 不仅局限于在微控制器(MCU)中使用。但从文件数量上来看 FreeRTOS 要比μC/OS-II和μC/OS-III少的多。

        FreeRTOS 最大的优势就是开源免费,商业使用的话不需要用户公开源代码,也不存在任何版权问题,是当前小型嵌入式操作系统市场使用率最高的。

官网
https://www.freertos.org/api函数
https://www.freertos.org/a00106.html

1.2代码结构

其内核代码文件就这几个,非常简洁:
- croutine.c/croutine.h: 协程,在8位/16位平台下效率比较高,在32位平台建议使用任务task。- event_groups.c / event_groups.h:顾名思义,这个是事件组的实现。- heap_x.c:内核堆实现,FreeRTOS提供了heap_1.c ~ heap_5.c 5种堆管理器,
各有优缺点,需要根据应用进行选择,常用heap_4.c。- list.c/list.h:链表实现,主要为调度器提供数据结构算法支持服务。比如任务链表。- port.c/portmacro.h:硬件相关层级可移植抽象,主要包括SysTick中断,上下文切换,
中断管理,具体实现很大程度上取决于平台(单片机体系硬件内核和编译器工具集)。通常以汇编语言实现。- queue.c/queue.h/semphr.h:信号量、互斥体实现。- tasks.c/task.h:任务管理器实现。- timers.c/timers.h:软件定时器实现。- FreeRTOS.h:选编译配置文件,用于汇总所有源文件的编译选择控制。


1.3FreeRTOS的代码规范

        FreeRTOS 核心源码文件的编写遵循 MISRA 代码规则,同时支持各种编译器。但考虑到有些编译器的性能还比较弱,不支持 C 语言的新标准 C99 和 C11 的一些特性和语法,所以 FreeRTOS 的源码中就没有引入 C99 和 C11 的新特性,但是有一个例外,源码中有用到头文件 stdint.h(这个文件是C99标准才引入的)。

变量有严格的前缀标识变量类型属性:
- c – char 字符型变量- s – short 短整型变量- l – long  长整型变量- x – portBASE_TYPE (long)在 portmacro.h 中定义,便于移植的数据类型转定义- u – unsigned 无符号整型- p -  pointer 指针
http://www.xdnf.cn/news/8290.html

相关文章:

  • Vitis 2021.1安装步骤
  • oracle数据库查看当前session会话数、查询最大支持连接数、修改最大支持连接数
  • SDL文字库介绍和RV1126交叉编译SDL文字库
  • 【Java】CompletableFuture.orTimeout在JDK21以下版本有内存泄漏及解决方案
  • 软件设计师“IP协议与子网划分”真题考点分析——求三连
  • Docker安装postgres数据库
  • Vue.js教学第十章:自定义命令的创建使用与应用
  • python——多线程编程(threading)
  • 【工具】Quicker/VBA|PPT 在指定位置添加有颜色的参考线
  • 交叉编译DirectFB报错解决方法
  • Day 28 训练
  • nginx和docker常用指令
  • thinkpad x220降频到0.7Ghz解决办法
  • 遥控器芯片6nm与3nm技术对比!
  • 如何将吉客云奇门数据无缝对接金蝶云星空
  • 远程升级方案(经通讯管理机)
  • 怎么有效降低知网AIGC率?
  • 华为RH1288HV3 BMC忘记用户名密码如何恢复默认
  • 华为仓颉语言如何进行交叉编译
  • 第三十二天打卡
  • 构建基于全面业务数据的大数据与大模型企业护城河战略
  • 【Linux】网络基础3
  • JUC入门(五)
  • 进程、线程和协程切换的比喻
  • 【分治】归并排序:递归版 非递归版
  • IDC机房交换机紧急更换的流程和注意事项
  • torch.gather()和torch.sort
  • 火语言UI组件--控件函数调用
  • 免费开源的图片分割小工具
  • RT-Thread源码阅读(1)——基本框架