|
|
@@ -11,16 +11,16 @@ created: 2026-07-17
|
|
|
|
|
|
> **用生活理解**:公司招人(创建任务)需要分配工位(栈)和建立档案(TCB);人员可以按编制内(静态)或外聘(动态)两种方式入职;裁员(删除任务)时需清理工位和档案。
|
|
|
|
|
|
-## Concept
|
|
|
+## 概念介绍
|
|
|
|
|
|
-### Basic concept
|
|
|
+### 基本概念
|
|
|
|
|
|
FreeRTOS 中,一个**任务(Task)**包含三要素:
|
|
|
- **任务函数**:用户编写的无限循环函数
|
|
|
- **堆栈(Stack)**:保存任务上下文(寄存器、局部变量)
|
|
|
- **TCB(Task Control Block)**:任务控制块,记录任务状态、优先级等信息
|
|
|
|
|
|
-### Working principle
|
|
|
+### 工作原理
|
|
|
|
|
|
FreeRTOS 创建任务时:
|
|
|
1. 分配栈空间和 TCB 内存
|
|
|
@@ -37,11 +37,11 @@ FreeRTOS 创建任务时:
|
|
|
|
|
|
删除任务时使用 `vTaskDelete()`,任务被删除后不会再次运行,任务占用的资源会被释放。
|
|
|
|
|
|
-### Core API
|
|
|
+### 核心API
|
|
|
|
|
|
#### 动态创建:xTaskCreate
|
|
|
|
|
|
-| Function | Params | Description |
|
|
|
+| 函数 | 参数 | 功能简述 |
|
|
|
|----------|--------|-------------|
|
|
|
| `xTaskCreate` | `pvTaskCode`, `pcName`, `usStackDepth`, `pvParameters`, `uxPriority`, `pxCreatedTask` | 动态创建一个新任务 |
|
|
|
| | `pvTaskCode` | 任务函数指针 |
|
|
|
@@ -55,7 +55,7 @@ FreeRTOS 创建任务时:
|
|
|
|
|
|
#### 静态创建:xTaskCreateStatic
|
|
|
|
|
|
-| Function | Params | Description |
|
|
|
+| 函数 | 参数 | 功能简述 |
|
|
|
|----------|--------|-------------|
|
|
|
| `xTaskCreateStatic` | `pvTaskCode`, `pcName`, `ulStackDepth`, `pvParameters`, `uxPriority`, `puxStackBuffer`, `pxTaskBuffer` | 静态创建一个新任务 |
|
|
|
| | `puxStackBuffer` | 用户预先分配的栈空间 |
|
|
|
@@ -65,7 +65,7 @@ FreeRTOS 创建任务时:
|
|
|
|
|
|
#### 删除任务:vTaskDelete
|
|
|
|
|
|
-| Function | Params | Description |
|
|
|
+| 函数 | 参数 | 功能简述 |
|
|
|
|----------|--------|-------------|
|
|
|
| `vTaskDelete` | `xTask` | 删除指定任务 |
|
|
|
| | `xTask` | 待删除任务句柄;传 NULL 表示删除自身 |
|
|
|
@@ -75,23 +75,23 @@ FreeRTOS 创建任务时:
|
|
|
|
|
|
当 `configSUPPORT_STATIC_ALLOCATION = 1` 时,必须提供以下两个钩子函数:
|
|
|
|
|
|
-| Function | Description |
|
|
|
+| 函数 | 功能简述 |
|
|
|
|----------|-------------|
|
|
|
| `vApplicationGetIdleTaskMemory` | 提供空闲任务的 TCB 和栈缓冲区 |
|
|
|
| `vApplicationGetTimerTaskMemory` | 提供定时器任务的 TCB 和栈缓冲区 |
|
|
|
|
|
|
-## Experiment
|
|
|
+## 实验
|
|
|
|
|
|
-### Requirements
|
|
|
+### 需求描述
|
|
|
|
|
|
- P01:动态创建 3 个任务,task1 翻转 LED1,task2 翻转 LED2,task3 检测按键删除 task1
|
|
|
- P02:使用静态创建实现同样功能,并提供空闲任务和定时器任务的内存
|
|
|
|
|
|
-### Code Implementation
|
|
|
+### 代码实现
|
|
|
|
|
|
#### P01:动态创建
|
|
|
|
|
|
-**File: 01_任务创建与删除_CubeMX/Core/Src/freertos_demo.c**
|
|
|
+**代码来源:**03_代码/01_动态创建任务和删除/Core/Src/freertos_demo.c
|
|
|
|
|
|
```c
|
|
|
#include "freertos_demo.h"
|
|
|
@@ -231,7 +231,7 @@ void task3(void *pvParameters)
|
|
|
|
|
|
#### P02:静态创建
|
|
|
|
|
|
-**File: 02_任务创建与删除_静态创建/Core/Src/freertos_demo.c**
|
|
|
+**代码来源:**03_代码/02_静态创建任务和删除/Core/Src/freertos_demo.c
|
|
|
|
|
|
```c
|
|
|
#include "freertos_demo.h"
|
|
|
@@ -334,7 +334,7 @@ void start_task(void *pvParameters)
|
|
|
/* task1/task2/task3 与动态创建版本相同 */
|
|
|
```
|
|
|
|
|
|
-### Key Config
|
|
|
+### 关键配置
|
|
|
|
|
|
**P01 FreeRTOSConfig.h**(默认配置,无需特殊设置):
|
|
|
|
|
|
@@ -353,9 +353,9 @@ void start_task(void *pvParameters)
|
|
|
#define configTIMER_TASK_STACK_DEPTH 256 // 定时器任务栈大小
|
|
|
```
|
|
|
|
|
|
-## Core API Reference Table
|
|
|
+## 核心函数速查表
|
|
|
|
|
|
-| Function | Parameters | Return | Description |
|
|
|
+| 函数 | 参数 | 返回值 | 功能简述 |
|
|
|
|----------|-----------|--------|-------------|
|
|
|
| `xTaskCreate` | pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask | BaseType_t | 动态创建任务 |
|
|
|
| `xTaskCreateStatic` | pvTaskCode, pcName, ulStackDepth, pvParameters, uxPriority, puxStackBuffer, pxTaskBuffer | TaskHandle_t | 静态创建任务 |
|
|
|
@@ -364,7 +364,7 @@ void start_task(void *pvParameters)
|
|
|
| `vApplicationGetIdleTaskMemory` | ppxIdleTaskTCBBuffer, ppxIdleTaskStackBuffer, pulIdleTaskStackSize | void | 提供空闲任务内存(静态分配时) |
|
|
|
| `vApplicationGetTimerTaskMemory` | ppxTimerTaskTCBBuffer, ppxTimerTaskStackBuffer, pulTimerTaskStackSize | void | 提供定时器任务内存(静态分配时) |
|
|
|
|
|
|
-## Common Issues & Pitfalls
|
|
|
+## 常见问题与避坑
|
|
|
|
|
|
1. **栈溢出**:栈大小设置不当会导致任务异常。调试时可设置 `configCHECK_FOR_STACK_OVERFLOW` 为 1 或 2,并实现 `vApplicationStackOverflowHook()`。
|
|
|
2. **删除后句柄未置空**:删除任务后其句柄仍指向原 TCB 地址,后续误用会导致崩溃。应在删除后立即将句柄置 `NULL`。
|