freeRTOS使用教学
一、前言
esp-idf是基于freeRTOS的框架,里面用到的组件,以及我们的应用程序都是基于freeRTOS来开发的,因此我们必须掌握freeRTOS的用法。如果我们不深究原理,只关注于freeRTOS的接口使用,我们很快就能掌握。另外,因为freeRTOS开源免费的特性,目前大部分芯片产商做的SDK都是基于freeRTOS系统开发的,因此我们就更有理由要学习RTOS了。
二、为什么要使用RTOS?
在低端设备中,程序基本分为裸机和RTOS,针对简单的程序,我们用裸机程序完全可以满足,一旦功能复杂,程序模块众多,裸机程序往往很难满足我们的需求。因此我们就要用到RTOS系统。一个最简单的例子如下:

对于裸机程序,我们需要把所有的功能模块代码写在一个大循环里面,可以想象,其中一个功能模块发生阻塞需要延时等待时,其他功能模块均要延时等待,大家可能说可以用状态机来避免这个问题,状态机编程复杂不说,程序可读性也差。
右边是RTOS程序,RTOS程序可以新建多个任务处理不同模块的功能。当模块A需要阻塞等待时,它可以放弃自己的执行时间片,把时间片让给其他任务,这样整体程序就可以高效的运行,当然RTOS还意味着很多东西,这里只是举一个最直观的例子。
三、freeRTOS任务概述
使用 FreeRTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 RTOS 调度器本身。
任务分为四个状态:运行、准备就绪、阻塞、挂起,状态转换如下

运行:
当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
准备就绪:
准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态),但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。
阻塞:
如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态),直到延迟结束-一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量事件。处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞,即使该任务所等待的事件没有发生。“阻塞”状态下的任务不使用任何处理时间,不能被选择进入运行状态。
挂起:
与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务没有超时。相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。
优先级:每个任务均被分配了从 0 到 ( configMAX_PRIORITIES - 1 ) 的优先级,其中的 configMAX_PRIORITIES 在 FreeRTOSConfig.h 中定义,低优先级数字表示低优先级任务。 空闲任务的优先级为零。
关于任务,有几个最常见的API函数
//任务创建
BaseType_t xTaskCreatePinnedToCore(
TaskFunction_t pvTaskCode, //任务函数指针,原型是void fun(void *param)
const char *constpcName, //任务的名称,打印调试可能会有用
&nb

最低0.47元/天 解锁文章
965






