【ESP32_FreeRTOS篇】

FreeRTOS是一个开源免费的实时操作系统,适用于微控制器。其核心特性包括任务管理、调度器、队列、信号量等。任务具有优先级,高优先级任务可抢占低优先级任务,支持时间片轮转。任务状态包括运行态、就绪态、阻塞态和挂起态。低功耗模式通过空闲任务钩子函数实现,包括睡眠、停止和待机模式,以及Tickless模式。FreeRTOS还提供了内存管理和各种通信机制,如队列、信号量和任务通知。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FreeRTOS 是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议。这里说 到的开源,指的是你可以免费得获取到 FreeRTOS 的源代码,且当你的产品使用了 FreeRTOS 且没有修改 FreeRTOS 内核源码的时候,你的产品的全部代码都可以闭源,不用开源,但是当 你修改了 FreeRTOS 内核源码的时候,就必须将修改的这部分开源,反馈给社区,其它应用部 分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要掏一分钱。


FreeRTOS框架


在这里插入图片描述


FreeRTOS框架介绍


一. 任务

1. 基本属性

1.1 优先级

每个任务分配一个从0~configMAX_PRIORITIES-1的优先级,优先级的数字越低表示任务的优先级越低。

  • 1.高优先级抢占低优先级:
    当一个任务A正在运行,另外一个任务B(优先级高于A)阻塞时间到或者事件触发处于就绪态,那么B会从A那抢占处理器,B开始运行,A停止运行;
  • 2.时间片轮转:
    当宏configUSE_TIME_SLICING定义为1 的时候多个任务可以共用一个优先级,数量不限。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。

FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。


1.2 任务控制块/任务堆栈
  • 1.任务控制块:
    FreeRTOS的每个任务都有一些属性需要存储,FreeRTOS把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块。
    属性:任务名字,优先级,任务堆栈大小,任务句柄等。
  • 2.任务堆栈:
    FreeRTOS之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场 (CPU寄存器值等 )保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场 ,恢复现场以后任务就会接着从上次中断的地方开始运行。

2. 状态

  • 1.运行态:
    当一个任务正在运行时,那么就说这个任务处于运行态, 处于运行态的任务就是当前正在使用处理器的任务。 如果使用的是核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。
  • 2.非运行态:
    • 就绪态:
      处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起 可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!

    • 阻塞态:

      • 如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函数 vTaskDelay()的话就会进入阻塞态, 直到延时周期完成。
      • 任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态 。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!
    • 挂起态:
      像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数 vTaskSuspend()xTaskResume()

在这里插入图片描述

3. 操作

创建相对于删除;挂起相对于恢复


二. 机制

1. 队列

  • 所有的通信和同步机制都是基于队列实现的
  • 队列不但可以传递数组,也可以传递结构体

2. 信号量

信号量是深度为1的队列。

3. 任务通知

任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高。

4. 低功耗

4.1. 低功耗模式:
  • sleep:睡眠
  • stop:停止
  • standby:待机
4.2.空闲任务的钩子函数实现的低功耗
  • 1.钩子函数
    通过空闲任务钩子函数(或称回调,hook, or call-back),可以直接在空闲任务中添加应用程序相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。通常空闲任务钩子函数被用于:
    • 执行低优先级,后台或需要不停处理的功能代码。
    • 测试处系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所
      以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时
      间)。
    • 将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能
      需要处理的时候,系统自动进入省电模式。
  • 2.将处理器设置为低功耗模式
    FreeRTOS是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式(上面4.1提到的三种方式)、关闭其他外设时钟、降低系统主频等等。
4.2. Tickless 模式

FreeRTOS系统提供的低功耗模式,当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时侯处理器才会从低功耗模式中唤醒。


5. 内存管理列表和列表项

列表是FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。


6. 内存管理

内存管理是一个系统基本组成部分,FreeRTOS中大量使用到了内存管理,比如创建任务、信号量、队列等会自动从堆中申请内存。用户应用层代码也可以 FreeRTOS提供的内存管理函数来申请和释放内存。


三. API函数

FreeRTOS API函数及应用详情请阅读下面章节

第零章:ESP32应用程序的启动流程

第一章:任务创建、删除、延时

第二章:任务优先级

第三章:任务状态

第四章:显示任务详细信息

第五章:查看任务堆栈空间

第六章:队列

第七章:软件定时器

第八章:二值信号量

第九章:计数型信号量

第十章:互斥信号量

第十一章:递归互斥量

第十二章:事件标志组


基于 Michael_ee 老师学习 ESP32_FreeRTOS

### 关于 ESP-LVGL 开发工具下载与使用教程 #### 工具与资源概述 ESP32 和 LVGL 的组合是一种流行的嵌入式 GUI 解决方案。为了高效开发基于 ESP32 的 LVGL 应用程序,开发者可以利用多种工具和资源来简化配置、调试以及部署流程。以下是针对 ESP32 和 LVGL 组合的一些常用工具及其获取方式。 --- #### 1. 官方支持的开发框架 ESP-IDF 是 Espressif 提供的官方开发框架,适用于 ESP32 芯片系列的应用开发。LVGL 自 v8.x 版本起已内置支持 ESP-IDF,因此可以直接通过 ESP-IDF 进行集成开发[^1]。 - **下载链接**: https://github.com/espressif/esp-idf - **安装指南**: 参考 ESP-IDF 官方文档中的安装说明,确保正确设置环境变量 `IDF_PATH` 并完成工具链安装。 对于早期版本(如 ESP-IDF 4.2 和 LVGL 7.9),可以通过第三方移植项目进行适配,例如 GitHub 上的 `lv_port_esp32`。 --- #### 2. 第三方移植项目 如果需要兼容特定硬件或旧版软件,则可考虑以下开源项目: ##### (a) lv_port_esp32 这是由 LVGL 社区维护的一个专门用于 ESP32 的移植项目,提供了完整的示例代码和驱动支持。 - **项目地址**: https://github.com/lvgl/lv_port_esp32 - **特点**: - 支持多种显示控制器(如 ST7789, ILI9341)。 - 包含触摸屏校准功能。 - 提供详细的 README 文档指导如何构建 Demo 工程。 ##### (b) lvgl_esp32_drivers 该项目专注于提供 ESP32 的外设驱动接口,便于快速接入不同的显示屏和输入设备。 - **项目地址**: https://gitcode.com/gh_mirrors/lv/lvgl_esp32_drivers[^3] - **适用场景**: - 当现有移植无法满足需求时,可通过此项目自定义扩展。 --- #### 3. IDE 配置与开发环境搭建 除了命令行操作之外,还可以借助现代 IDE 来提升开发效率。 ##### (a) VSCode + PlatformIO 这是一种灵活且易用的开发模式,特别适合初学者入门。 - **优点**: - 插件化管理依赖项。 - 内建终端方便执行编译和上传指令。 - **参考资料**: 《ESP32-Arduino开发》GUI设计 LVGL 开发环境搭建教程(模拟器)[^2]。 ##### (b) Arduino IDE 虽然主要用于 Arduino 编程模型,但也支持部分 LVGL 功能。 - **注意事项**: 性能可能不如原生 ESP-IDF 或 PlatformIO 方案稳定。 --- #### 4. 示例代码片段 以下是一个简单的初始化脚本,展示如何加载 LVGL 到 ESP32 中并启动基本界面渲染循环。 ```c #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "lvgl/lvgl.h" void lv_task_handler(void *pvParameter) { while (true) { lv_task_handler(); // 处理 LVGL 的任务队列 vTaskDelay(pdMS_TO_TICKS(5)); // 延迟时间应根据刷新率调整 } } void app_main() { // 初始化 LVGL lv_init(); // 创建一个任务处理线程 xTaskCreate(lv_task_handler, "lv_task", 4096, NULL, 5, NULL); // 添加其他 UI 元素... } ``` 上述代码展示了多线程架构下 LVGL 的核心逻辑结构。 --- ####
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eiker_3169

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值