|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: "ESP32学习记录01" |
| 4 | +subtitle: "核心知识" |
| 5 | +date: 2025-05-27 |
| 6 | +author: "mkk" |
| 7 | +header-style: text |
| 8 | +catalog: true |
| 9 | +tags: |
| 10 | + - 笔记 |
| 11 | +--- |
| 12 | + |
| 13 | +# freeRTOS |
| 14 | +esp-idf是基于freeRTOS的框架,所以是首先要掌握的内容 |
| 15 | + |
| 16 | +## freeRTOS任务概述 |
| 17 | +在低端设备中,程序基本分为裸机和RTOS,针对简单的程序,我们用裸机程序完全可以满足,一旦功能复杂,程序模块众多,裸机程序往往很难满足我们的需求。因此我们就要用到RTOS系统。 |
| 18 | + |
| 19 | +使用 FreeRTOS 的实时应用程序可以被构建为一组独立的任务。每个任务在自己的上下文中执行,不依赖于系统内的其他任务或 RTOS 调度器本身。 |
| 20 | + |
| 21 | +任务分为四个状态:运行、准备就绪、阻塞、挂起 |
| 22 | + |
| 23 | +### 运行 |
| 24 | +当任务实际执行时,它被称为处于运行状态。 任务当前正在使用处理器。 如果运行RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。 |
| 25 | + |
| 26 | +### 准备就绪 |
| 27 | +准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态),但目前没有执行的任务,因为同等或更高优先级的不同任务已经处于运行状态。 |
| 28 | + |
| 29 | +### 阻塞 |
| 30 | +如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态),直到延迟结束-一个时间事件。任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量事件。处于阻塞状态任 |
| 31 | +务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞,即使该任务所等待的事件没有发生。“阻塞”状态下的任务不使用任何处理时间,不能被选择进入运行状态。 |
| 32 | + |
| 33 | +### 挂起 |
| 34 | +与“阻塞”状态下的任务一样,“挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务没有超时。相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume()API 调用明确命令时 才会进入或退出挂起状态。 |
| 35 | + |
| 36 | +### 优先级 |
| 37 | +每个任务均被分配了从 0 到 (configMAX_PRIORITIES-1) 的优先级,其中的configMAX_PRIORITIES 在 FreeRTOSConfig.h 中定义,低优先级数字表示低优先级任务。空闲任务的优先级为零。 |
| 38 | + |
| 39 | +### 任务创建 |
| 40 | + |
| 41 | +``` |
| 42 | +BaseType_t xTaskCreatePinnedToCore( |
| 43 | + TaskFunction_t pvTaskCode, //任务函数指针,原型是 voidfun(void *param) |
| 44 | + const char *constpcName, //任务的名称,打印调试可能会有用 |
| 45 | +const uint32_t usStackDepth,//指定的任务堆栈空间大小(字节) |
| 46 | +void *constpvParameters, //任务参数 |
| 47 | +UBaseType_t uxPriority, |
| 48 | + (configMAX_PRIORITIES- 1) |
| 49 | + // 优 先 级,数字越大,优先级越大,0 到 |
| 50 | +TaskHandle_t *constpvCreatedTask, |
| 51 | + //传回来的任务句柄 |
| 52 | +const BaseType_t xCoreID) //分配在哪个内核上运行 |
| 53 | +``` |
| 54 | + |
| 55 | +### 延迟函数 |
| 56 | + |
| 57 | +``` |
| 58 | +// 阻塞指定的时间,单位为系统时钟节拍数 |
| 59 | +void vTaskDelay( const TickType_t xTicksToDelay ) |
| 60 | +//用于在指定的时间点之前阻塞任务,直到时间到达。 |
| 61 | +void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement) |
| 62 | +``` |
| 63 | + |
| 64 | +### 示例 |
| 65 | +``` |
| 66 | +#include <stdio.h> |
| 67 | +#include "freertos/FreeRTOS.h" |
| 68 | +#include "freertos/task.h" |
| 69 | +#include "esp_log.h" |
| 70 | +
|
| 71 | +void TASK1(void *pvParameters){ |
| 72 | + while(1){ |
| 73 | + printf("TASK 1\n"); |
| 74 | + vTaskDelay(pdMS_TO_TICKS(500)); |
| 75 | + } |
| 76 | +} |
| 77 | +void app_main(void) |
| 78 | +{ |
| 79 | + xTaskCreatePinnedToCore(TASK1, "TASK1", 2048, NULL, 1, NULL, 0); |
| 80 | + |
| 81 | +} |
| 82 | +``` |
| 83 | + |
0 commit comments