基于esp32的 FreeRTOS 系统学习
本文写作意图旨在记录我学习esp32的一些学习到的知识点、我在学习过程中遇到的一些问题和一些解决办法,以便我在后续回顾我所学习到的知识。如果能帮助到同在csdn学习的小伙伴,那更是在好不过了,当然我是小白学习esp32,可能不是有那么多的参考价值。
1. FreeRTOS 操作系统
1.0介绍 FreeRTOS
esp-idf 是基于 FreeRTOS 的框架,里面用到的组件,以及我们的应用程序都是基于 FreeRTOS 来开发的。另外,因为 freeRTOS 开源免费的特性,目前大部分芯片产商做的 SDK 都是基于 freeRTOS 系统开发的,因此我们就更有理由要学习 RTOS 了。
(SDK 是芯片厂商提供的“开发工具箱”,而 FreeRTOS 是其中核心的操作系统。可以理解为SDK是操作机械时的一些工具,要使用这些工具才能去进行操作,而 FreeRTOS 是机械本身吧)
在低端设备中, 程序基本分为裸机和 RTOS, 针对简单的程序, 我们用裸机程序完全可以满足, 一旦功能复杂, 程序模块众多, 裸机程序往往很难满足我们的需求。 因此我们就要用到 RTOS 系统。
如下图,简单理解为普通的裸机开发时只能串行一句一句的执行程序,遇到delay等需要等待的是时候,单片机就卡住,浪费了很大的软件资源。FreeRTOS就是将每个模块的功能分开来,在等待的过程中就可以去执行其他任务的程序,大大提高效率。

当模块 A 需要阻塞等待时, 它可以放弃自己的执行时间片, 把时间片让给其他任务, 这样整体程序就可以高效的运行, 当然 RTOS 还意味着很多东西, 这里只是举一个最直观的例子。
1.1任务
1.1.1任务介绍
使用 FreeRTOS 的实时应用程序可以被构建为一组独立的任务。 每个任务在自己的上下文中执行, 不依赖于系统内的其他任务或 RTOS 调度器本身。
任务分为四个状态: 运行、 准备就绪、 阻塞、 挂起, 状态转换如下

运行:当任务实际执行时, 它被称为处于运行状态。 任务当前正在使用处理器。 如果运行RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
准备就绪:准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态) , 但目前没有执行的任务,因为同等或更高优先级的不同任务已经处于运行状态。
阻塞:如果任务当前正在等待时间或外部事件, 则该任务被认为处于阻塞状态。 例如, 如果一个任务调用 vTaskDelay(), 它将被阻塞(被置于阻塞状态) , 直到延迟结束-一个时间事件。任务也可以通过阻塞来等待队列、 信号量、 事件组、 通知或信号量事件。 处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时, 并被解除阻塞, 即使该任务所等待的事件没有发生。 “阻塞” 状态下的任务不使用任何处理时间, 不能被选择进入运行状态。
挂起:与“阻塞” 状态下的任务一样, “挂起” 状态下的任务不能 被选择进入运行状态, 但处于挂起状态的任务没有超时。 相反, 任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。
优先级: 每个任务均被分配了从 0 到 ( configMAX_PRIORITIES - 1 ) 的优先级, 其中的configMAX_PRIORITIES 在 FreeRTOSConfig.h 中定义, 低优先级数字表示低优先级任务。 空闲任务的优先级为零。(注意:这里与stm32的优先级是相反的)
1.1.2 创建任务
这边重点介绍一下创建任务的函数
//任务创建
BaseType_t xTaskCreatePinnedToCore(
TaskFunction_t pvTaskCode, //任务函数指针, 原型是 void task(void *param)
const char *constpcName, //任务的名称, 打印调试可能会有用
const uint32_t usStackDepth,//指定的任务堆栈空间大小( 字节),一般写2048个字节
void *constpvParameters, //任务参数,没有就填NULL
UBaseType_t uxPriority, // 优 先 级 , 数 字 越 大 , 优 先 级 越 大 , 0 到
(configMAX_PRIORITIES - 1),在esp32里面优先级范围是0到25
TaskHandle_t *constpvCreatedTask, //传回来的任务句柄,没有就填NULL
const BaseType_t xCoreID) //分配在哪个内核上运行,esp32只有两个内核,只能填0或者1
main.c代码
#include <stdio.h>
#include "freertos/FreeRTOS.h" //关于freertos操作系统的两个头文件,第一个是freertos的,第二个是关于任务的
#include "freertos/task.h"
#include "esp_log.h" //引入头文件,发送到监视的一个头文件
void taska(void *arg) //创建一个叫taska的任务,并写在指针arg(地址)里面
{
while (1)
{
ESP_LOGI("Task A", "Task A is running"); //不断发送 "Task A is running"
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void app_main(void)
{
xTaskCreatePinnedToCore(taska, "Task A", 2048, NULL, 1, NULL, 0); // Create Task A on core 0
}
代码结果:不断打印 "Task A is running"

(更新中。。。。。。)
更多推荐


所有评论(0)