FreeRTOS
1.FreeRTOS的概述
1.1嵌入式编程模式对比
(1)前后台系统-------裸机开发
整个程序框架由一个死循环和若干中断组成,可用于控制流程简单,任务固定的嵌入式系统
(2)嵌入式操作系统
是嵌入式处理器上的系统软件具有通用操作系统的基本功能用于功能复杂、任务之间交互频繁的系统
两种编程模式的区别
|
对比维度 |
前后台系统(裸机开发) |
嵌入式操作系统(RTOS) |
|
存储空间 |
不占用额外存储空间 |
需占用部分 RAM 和 ROM |
|
学习曲线 |
无需掌握 OS 接口函数 |
需熟悉 OS 基本操作 |
|
实时性 |
无法确保实时性 |
可保障系统实时性 |
|
系统结构 |
全局变量传参,耦合性高 |
依赖 OS 服务实现任务同步通信 |
|
适用场景 |
小规模、任务固定的系统 |
中大规模、任务交互频繁的系统 |
|
外围电路 |
无需复杂外围电路 |
需复杂外围电路 |
|
扩展组件 |
无需网络协议、文件系统等 |
需搭配网络协议、文件系统等扩展组件 |
|
系统功能 |
简单 |
复杂 |
1.2嵌入式操作系统的基本概念
(1)内核:负责任务调度与任务间交互,支持抢占式调度(按优先级执行)和时间片调度(同优先级轮转)
任务调度示意图

(2)任务上下文
需将正在运行即CPU寄存器,当内核将运行其他程序时,任务的上下文保存在任务自身的任务栈中
(3)任务切换
入栈工作完成后,再将即将运行的任务上下文从其任务栈中调取到CPU寄存器,再开始下一任务的运行
(4)事件
驱动任务执行的具体操作,是 RTOS 中任务编写的核心逻辑。
(5)任务
独立功能的程序模块,不可直接调用或交换数据,支持并行执行(逻辑上各占一个 CPU)独立性:任务间不能直接进行调用和数据交换
并行性:每个任务各自拥有一个CPU,各CPU执行自己的任务
(6)任务状态
运行态:当前正在执行的任务处于运行状态,此时该任务拥有CPU的使用权
就绪态:准备好运行的任务处于就绪状态若当前运行任务被终止或阻塞,下一个优先级更高的就绪任务将成为运行任务
阻塞态:任务在执行过程中等待某一事件的发生或者延时一定的时间
终止态:当任务的功能已经完成,不再需要该任务时,可使任务挂起,处于终止状态

(7)任务的三要素

(8)时钟节拍
时钟节拍是一个周期性的定时中断,其时间间隔一般在1ms~10ms时间节拍可以为操作系统提供延时功能,将任务延时若干整数倍的时钟节拍,以及当任务等待事件发生时,提供超时判断的依据
2.嵌入式实时操作系统
2.1常见RTOS
(1)uC/OS
uC/0S是一个源码公开,可移植、可固定,可裁剪、占先式实时操作系统,其绝大部分源码为C语言编写。自1992年发布后,在世界各地取得了广泛的应用。
(2)RTX
RTX是一个源码公开的实时内核,它由Keil公司开发,配套于业界主流的嵌入式开发软件MDK-ARM使用,可用于ARM7、ARM9和Cortex-M等内核的微控制器。
(3)RT-Thread
RT-Thread是来自国内的开源实时操作系统由国内RT-Thread开发团队进行开发与维护它是一款高效、稳定的实时操作系统,也是一个组件完整丰富、开源简易、安全可靠的物联网操作系统。
(4)FreeRTOS
FreeRTOS是一个小型的实时操作系统,提供了实时操作系统所需的所有功能。它具有源码公开、可移植、可裁减和调度策略灵活,可以方便的移植到各类微控制器上。
2.2任务划分
2.2.1任务划分所需遵守的原则

2.2.2任务函数的结构
(1)单次执行任务:此类任务在创建后只执行一次,结束后自行删除。

(2)周期执行任务:此类任务在创建后将会按照一个固定的周期来执行。

(3)事件执行任务:此类任务创建后,可快速获得CPU使用权在任务执行时,需等待某个事件的发生。

2.2.3任务优先级设置经验总结
(1)中断关联任务是指通过中断服务程序进行触发的任务,为了保证中断的快进快出,我们将处理工作单独剥离出来放在任务里执行,因此这类任务的优先级设置为最高优先级;
(2)输入类后台任务,如按键检测、触摸检测、USB消息处理及串口消息处理等,可设置为高优先级;
(3)输出类的周期性任务,如GUI界面显示,LED数码管显示等不需要实时执行的任务,可以设置为低优先级。
Ps:中断的优先级高于所有任务
2.2.4任务管理接口函数
(1)任务创建函数(osThreadNew)

(2)任务优先级设置函数(osThreadSetPriority)

封装后优先级:

(3)延时函数(osDelay)

3.同步通信机制核心接口
3.1信号量(任务同步 / 资源计数)
信号量是一种非常灵活的同步方式,可以运用在多种场合中,实现任务同步和资源计数等功能;按照信号量的功能,可以分为二值信号量和计数信号量。
二值信号量:二值信号量是取值为0或1的信号量,0表示事件没有发生,1表示事件已经发生。
计数信号量:计数信号量主要用于资源的计数,它的初始值一般为可用资源的数量。
3.1.1信号量常用接口函数
(1)信号量创建函数---该函数用于创建一个新的信号量

(2)信号量获取函数---该函数用于获取一个信号量

(3)信号量释放函数---该函数用于释放一个信号量

3.2事件标志组(多任务协同)
3.2.1详情
(1)事件标志组是多个二值信号量的组合;
(2)事件标志组可以实现多个任务协同控制一个任务;
(3)使用事件标志组同步的任务可以分为独立性同步(OR)和关联性同步(AND)。
时间标志组原理图

3.2.2接口函数
(1)事件标志组创建函数(osEventFlagsNew)

(2)事件标志组设置函数(osEventFlagsSet)

(3)事件标志组等待函数(osEventFlagsWait)

3.3互斥量------->使用同一个资源,同时能保持任务不乱套
在RTOS中,实现临界区的互斥访问一般使用互斥量
接口函数
(1)互斥量创建函数

(2)互斥量获取函数

(3)互斥量释放函数

3.4.消息队列--->除了全局变量,另一种传递信息的方法
3.4.1实现任务间的数据传输的两种方法
全局变量:必须保证每个任务对全局变量的互斥访问。
消息队列:类似于数据缓存区,可以保存有限个、具有确定大小的数据。
3.4.2接口函数
(1)消息队列创建函数(osMessageQueueNew)

(2)消息存入函数(osMessageQueuePut)

(3)消息获取函数(osMessageQueueGet)

总结
本文系统介绍了FreeRTOS实时操作系统的核心知识,包括嵌入式编程模式对比(裸机开发与RTOS)、操作系统基本概念(任务调度、状态管理等)。重点分析了FreeRTOS的任务划分原则(中断关联、输入/输出类任务)与优先级设置经验,详细阐述了四大同步通信机制:信号量(二值/计数)、事件标志组(多任务协同)、互斥量(资源互斥访问)和消息队列(数据传输)。通过总结常用接口函数,为开发者提供了基于项目规模(中大规模优先)和功能需求选择合适RTOS解决方案的实践指导,突出了FreeRTOS轻量灵活的特性优势。
openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐

所有评论(0)