FreeRTOS 系统启动流程及任务相关函数解析
1. FreeRTOS 系统启动流程
FreeRTOS 的启动流程主要包括硬件初始化、任务创建和调度器启动三个步骤。以下是详细的流程描述:
1.1 硬件初始化
在启动 FreeRTOS 之前,需要先进行硬件初始化。这通常包括:
- 系统时钟初始化: 设置系统时钟频率,以确保 FreeRTOS 的节拍定时器能够正确工作。
- 外设初始化: 初始化与应用相关的外设,如 GPIO、UART、I2C 等。
void SystemInit(void) {
// 设置系统时钟
SystemClock_Config();
// 初始化 GPIO
MX_GPIO_Init();
// 初始化 UART
MX_USART2_UART_Init();
// 其他硬件初始化
}
1.2 创建任务
在硬件初始化完成后,需要创建应用所需的任务。每个任务都需要一个任务函数和一些参数。
xTaskCreate(
TaskFunction_t pvTaskCode, // 任务函数指针
const char * const pcName, // 任务名称
configSTACK_DEPTH_TYPE usStackDepth, // 任务堆栈大小
void *pvParameters, // 传递给任务函数的参数
UBaseType_t uxPriority, // 任务优先级
TaskHandle_t *pxCreatedTask // 任务句柄
);
pvTaskCode
:任务函数指针。pcName
:任务的名称。usStackDepth
:任务堆栈大小,以字为单位。pvParameters
:传递给任务函数的参数。uxPriority
:任务优先级。pxCreatedTask
:任务句柄,用于管理任务。
1.3 启动调度器
所有任务创建完成后,调用 vTaskStartScheduler
启动任务调度器。
void vTaskStartScheduler(void);
此函数不会返回,系统开始运行创建的任务,并根据任务优先级和调度策略切换任务。
int main(void) {
// 硬件初始化
SystemInit();
// 创建任务
xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(vTask2, "Task2", 1000, NULL, 2, NULL);
// 启动调度器
vTaskStartScheduler();
// 永远不会到达这里
for(;;);
}
2. 任务相关函数解析
2.1 创建任务
xTaskCreate
用于创建任务并将其添加到就绪任务列表中。
BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void *pvParameters,
UBaseType_t uxPriority,
TaskHandle_t *pxCreatedTask
);
BaseType_t
:返回值,若任务创建成功返回pdPASS
,否则返回错误代码。
2.2 删除任务
vTaskDelete
用于删除任务。
void vTaskDelete(TaskHandle_t xTaskToDelete);
xTaskToDelete
:要删除的任务句柄。若为NULL
,删除调用该函数的任务。
2.3 任务延迟
vTaskDelay
用于将任务挂起一段时间。
void vTaskDelay(const TickType_t xTicksToDelay);
xTicksToDelay
:挂起的时间,以系统节拍计数。
2.4 获取任务优先级
uxTaskPriorityGet
用于获取指定任务的优先级。
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask);
xTask
:任务句柄。若为NULL
,返回调用该函数任务的优先级。
2.5 设置任务优先级
vTaskPrioritySet
用于设置任务的优先级。
void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority);
xTask
:任务句柄。uxNewPriority
:新优先级。
3. 示例代码
以下是一个简单的 FreeRTOS 示例,展示了系统初始化、任务创建和调度器启动的过程。
#include "FreeRTOS.h"
#include "task.h"
// 任务函数声明
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
int main(void) {
// 硬件初始化
SystemInit();
// 创建任务
xTaskCreate(vTask1, "Task1", 1000, NULL, 1, NULL);
xTaskCreate(vTask2, "Task2", 1000, NULL, 2, NULL);
// 启动调度器
vTaskStartScheduler();
// 永远不会到达这里
for(;;);
}
void vTask1(void *pvParameters) {
for(;;) {
// 任务1的代码
vTaskDelay(pdMS_TO_TICKS(1000)); // 延迟1秒
}
}
void vTask2(void *pvParameters) {
for(;;) {
// 任务2的代码
vTaskDelay(pdMS_TO_TICKS(500)); // 延迟500毫秒
}
}