实例对比说明:
-
手机: 点击相机 -> 操作系统 -> 打开摄像头
-
无操作系统: 相机 -> 打开摄像头也能实现,但方式死板、不支持第三方应用
MCU 对比说明:
-
裸机开发: MCU -> 直接控制硬件
-
使用操作系统: MCU -> 操作系统 -> 硬件
定义:操作系统是管理和控制计算机硬件与软件资源的程序,是运行在裸机上的最基本系统软件,其功能是为应用程序提供运行平台。
为什么使用操作系统?
-
提高 CPU 利用效率
-
用更少代码实现更复杂功能
-
屏蔽硬件差异,提高上层软件移植性
1.1.2 常见操作系统分类
-
实时操作系统(RTOS)
-
注重实时性,体积小,适用于嵌入式系统
-
依赖任务优先级进行调度
-
示例:UCOSII/III、FreeRTOS、RT-Thread 等
-
-
分时操作系统
-
任务调度依据时间片轮转
-
示例:Windows 95、Linux 2.6 前版本
-
-
半实时半分时操作系统
-
大型系统的常见选择
-
示例:Windows、HarmonyOS、Linux 2.6+等
-
操作系统选择依据平台而定:
-
嵌入式领域:RTOS
-
高性能芯片平台:大型操作系统
1.2 FreeRTOS 操作系统概述
1.2.1 FreeRTOS 的调度原则
-
RTOS:基于优先级
-
分时系统:基于时间片
1.2.2 FreeRTOS 的程序结构
-
FreeRTOS 中优先级数字越大,优先级越高(与 UCOS 相反)
-
最小/最大优先级保留给空闲/紧急任务
1.2.3 FreeRTOS 的任务结构
-
任务控制块(TCB):系统分配内存记录任务信息
-
任务函数:普通函数,执行任务内容
-
任务优先级:用于调度
-
任务栈:保存任务上下文(寄存器、变量等)
-
任务状态:停止、等待、就绪、运行、中断
1.2.4 系统调度与任务切换
-
任务调度:选择下一个任务(A->B 或 B->B)
-
任务切换:当前任务被切换为其他任务
1.2.5 任务状态说明
-
五种状态:停止、等待、就绪、运行、中断
-
任务切换逻辑:
-
延时 (
vTaskDelay
) 和挂起函数使任务进入挂起态 -
时间到或调用唤醒函数使任务回到就绪态
-
仅就绪态任务可进入运行态
-
1.3 实时操作系统 FreeRTOS
1.3.1 FreeRTOS 概念
-
免费开源轻量级 RTOS
-
支持任务管理、时间管理、信号量、消息队列、定时器等功能
-
优点:源码公开、可移植、可裁剪
1.3.2 实时操作系统要求
-
支持优先级调度和时间片轮转
-
可配置为可剥夺/不可剥夺型内核
-
实现多任务调度、资源管理、任务通信
1.3.3 功能概述
-
任务管理、时间管理、信号量、消息队列、内存管理、定时器、协程等
-
可用于资源受限的 MCU
1.3.4 获取与版本信息
-
官网下载:https://www.freertos.org/a00104.html
-
当前版本:V202112.00
1.3.5 FreeRTOS 移植
-
问题处理:
-
xTaskGetCurrentTaskHandle
:配置宏INCLUDE_xTaskGetCurrentTaskHandle = 1
-
vApplicationStackOverflowHook
:需手动添加钩子函数
-
void vApplicationStackOverflowHook(TaskHandle_t xTask, char *pcTaskName) {
while(1) {}
}
-
配置参数说明(FreeRTOSConfig.h)
#define configCPU_CLOCK_HZ ((unsigned long) 72000000)
#define configTICK_RATE_HZ ((TickType_t) 1000)
#define configMAX_PRIORITIES (5)
#define configMINIMAL_STACK_SIZE ((unsigned short) 128)
1.4 FreeRTOS 下的任务管理与通信
1.4.1 任务创建与管理
任务创建函数原型:
BaseType_t xTaskCreate(
TaskFunction_t pxTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask
);
删除任务:
vTaskDelete(TaskHandle_t xTaskToDelete);
挂起与唤醒:
vTaskSuspend(TaskHandle_t xTaskToSuspend);
vTaskResume(TaskHandle_t xTaskToResume);
1.4.2 队列
-
先进先出(FIFO)
-
创建队列:
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength, UBaseType_t uxItemSize);
-
发送信息:
xQueueSend(QueueHandle_t xQueue, const void * pvItemToQueue, TickType_t xTicksToWait);
后续内容包括信号量、互斥量、定时器、事件组与任务通知等通信机制,可继续扩展完善。