FreeRTOS 学习笔记(韦东山老师课程)

第一天 :RTOS 基础与 FreeRTOS 入门

1、什么是 FreeRTOS

1.FreeRTOS 是一款开源的实时操作系统(RTOS),其核心目标是实现多任务的并发运行。它具有轻量级、可裁剪的特点,适用于资源受限的嵌入式设备(如单片机),能够高效管理多个任务的调度与执行。

2.为什么使用 RTOS?—— 从裸机模式到多任务系统的演进

1. 裸机程序设计模式

1.0轮询模式

程序通过一个while(1)循环依次执行所有任务,任务按顺序轮流执行,无法优先处理紧急任务。

缺点:若某个任务执行时间长,会导致其他任务响应延迟。

1.1前后台

由 “后台”(while(1)循环中的主程序)和 “前台”(中断服务程序)组成,紧急任务通过中断触发,优先于后台执行。

优点:紧急任务可通过中断快速响应;
缺点:中断处理逻辑复杂时,可能阻塞后台程序,且多个中断之间容易冲突。

1.2定时器驱动

属于前后台模式的扩展,通过定时器按固定频率触发中断,在中断中按时间周期调用不同任务,实现多任务的定时执行。

优点:可按不同周期调度任务;
缺点:任务依赖定时器中断,时间精度有限,且任务执行时间过长会影响定时器周期。

1.3 基于状态机

将复杂任务拆分为多个状态,每次仅执行一个状态的代码,减少单个任务的执行时间,降低对其他任务的阻塞。

喂一口饭” 拆分为 “舀饭→喂饭→舀菜→喂菜”4 个状态,每次执行 1 个状态;

“回一个信息” 拆分为 “查看信息→打字→发送”3 个状态,每次执行 1 个状态。

优点:缩短单次任务执行时间,提高系统响应速度;

缺点:状态拆分和管理复杂,不适合多任务优先级差异大的场景。

2.多任务系统(RTOS 的核心)

RTOS 通过任务调度器实现多任务的 “并发”(宏观上同时运行,微观上按优先级切换),解决了裸机模式的局限性。

2.1 多任务模式:每个任务独立运行,由 RTOS 调度器按优先级分配 CPU 时间;

2.2 互斥操作:解决多个任务对共享资源(如硬件外设)的冲突访问;

2.3 同步操作:实现任务间的协作(如一个任务完成后触发另一个任务)。

3.创建FreeRTOS工程

1. 工程配置步骤

选择芯片型号及 FreeRTOS 版本(如基于 CMSIS V2 接口);

配置核心参数(如任务栈大小、优先级范围、定时器频率等);

添加任务:通过工程配置界面设置任务名称、优先级、栈大小及入口函数。

配置参数

添加任务

优先级:osPriorityNormal 表示正常优先级,数值越高,任务越优先执行;

栈大小:需根据任务实际内存需求设置,避免栈溢出;

分配方式:动态分配由 RTOS 管理内存,静态分配需手动指定内存块。

第二天:FreeRTOS 任务创建与内存管理

1.创建一个多任务程序

1. 任务函数定义

任务函数需遵循 RTOS 的标准格式,即void 任务名

(void *argument),通过while(1)循环使任务持续运行。

void *argument:用于传递任务创建时的参数(此处为 NULL,无参数);

while(1):确保任务不会退出,持续响应调度器的调用。

  1. 任务创建 API:xTaskCreate

FreeRTOS 通过xTaskCreate函数创建任务

任务名称 :“myfirsttask” 用于调试工具识别;

栈大小 :128(单位通常为字节或字,需根据芯片架构确认);

优先级 osPriorityNormal:正常优先级,可根据需求调整为更高或更低;

最后一个参数为 NULL,表示不保存任务句柄(若需后续挂起 / 删除任务,需传入句柄指针)

这样调用是为了让 RTOS 能识别、调度运行 MyTask 任务,实现 LED 操作的持续执行,契合实时系统多任务并发的需求 。

2.了解了什么是堆,栈

 在 RTOS 中,任务的内存管理依赖堆和栈,二者的区别与作用如下:

1.栈(Stack)

也是一个内存空间,cpu的SP寄存器指向它,它可以用来,函数调用,局部变量,多任务系统里保存现场。

2. 堆(Heap)

是一个内存空间,可以从中分配一个小的buffer,用完后再放回去。

假设你有一块 1024 格的方格纸(heap_buf[1024]),用来记录各种信息。每次有人需要写东西时,你要给他分配一些格子。为了知道哪些格子已经被用了,你用一个 标记笔(pos)记录下当前最后一个被占用的格子位置。

当有人说:"我需要 100 个格子写东西!"(my_malloc(100)),你会:

看一下标记笔现在指在哪里(old_pos = pos)。

把标记笔往后移动 100 格(pos += 100)。

告诉对方:"从原来标记的位置开始,往后 100 格都是你的!"

(return &heap_buf[old_pos])

释放空间 ,就是格子用完了,这些格子可以释放了

就是要了100个格子,在一百个格子里装上A-Z

附录

学习资源

韦东山老师课程链接:[具体课程地址]

FreeRTOS 官方文档:https://www.freertos.org/

百问网 FreeRTOS 教程:https://rtos.100ask.net/

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐