FreeRTOS 介绍
1. 学RTOS的作用
基础的单片机编程通常都是指裸机编程,即不加入任何 RTOS(Real Time Operating System 实时操作系统),但是处理的工作多了后,裸机开发就会很困难,所以需要使用RTOS。
RTOS 通常比通用操作系统体积更小、重量更轻,因此 RTOS 非常适用于 内存、计算和功率受限的设备。
1.1 裸机与RTOS对比
裸机的工作流程如下,在裸机系统中,所有的操作都是在一个无限的大循环里面实现, 支持中断检测,中断发生后会优先处理中断,同时中断也具有优先级,这里默认大家有这个知识基础,不再赘述。
RTOS的工作流程如下。在多任务系统中,根据程序的功能,把这个程序主体分割成一个个独立的,无限循环且不能返回的子程序,称之为任务。每个任务都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理。加入操作系统后,开发人员不需要关注每个功能模块之间的冲突,重心放在子程序的实现。
而任务之间的切换,称为调度
, 调度器是内核中负责决定在特定时间应执行什么任务的部分。大家可以在网上自行查阅。
可以发现,其实两者工作流有相似之处,但是加入RTOS后,开发人员开发更加便捷。
1.2 RTOS构成关键要素
内核:作为RTOS的核心组件,内核负责任务调度、上下文切换以及系统资源的管理。它实现了定时任务处理、优先级调度机制和中断响应等功能,是整个操作系统运行的基础。
任务:在RTOS中,任务是最基本的独立执行单元,通常表现为线程、进程或可并发运行的一段代码。多个任务可以在系统中同时存在,并由内核进行统一调度与管理。
调度算法:调度算法决定了任务的执行顺序和时间,是RTOS实现高效实时响应的关键。常见的调度方式包括基于优先级的抢占式调度和轮转调度(Round Robin)等。
中断处理:中断机制使RTOS能够对外部事件做出快速响应。当发生中断时,系统会暂停当前任务,转而执行对应的中断服务程序。RTOS通常支持中断优先级管理,以确保高优先级事件能够被优先处理。
通信机制:为了协调多个任务之间的操作,RTOS提供了多种任务间通信与同步机制,例如信号量、消息队列、事件标志组以及共享内存等,用于保障数据的一致性与任务间的有序协作。
1.3 RTOS工作示例伪代码
以下RTOS示例代码可以实现LED工作的同时,读取传感器数据。如果使用裸机开发,全部放在while(1)中,你写代码和管理将会十分痛苦。
// LED控制任务
void vTask1(void *pvParameters) {
while(1) {
// 切换LED状态
toggleLED();
// 暂停100毫秒
vTaskDelay(pdMS_TO_TICKS(100));
}
}
// 传感器任务
void vTask2(void *pvParameters) {
while(1) {
// 读取数据
float temperature = readTemperature();
printf("Temperature: %.2f\n", temperature);
// 暂停500毫秒
vTaskDelay(pdMS_TO_TICKS(500));
}
}
int main(void) {
// 创建任务
xTaskCreate(vTask1, "LED Task", 1000, NULL, 1, NULL);
xTaskCreate(vTask2, "Temp Task", 1000, NULL, 2, NULL);
// 开始调度
vTaskStartScheduler();
return 0;
}