FreeRTOS学习笔记——FreeRTOS 系统启动流程及任务相关函数解析

FreeRTOS 系统启动流程及任务相关函数解析

1. FreeRTOS 系统启动流程

FreeRTOS 的启动流程主要包括硬件初始化、任务创建和调度器启动三个步骤。以下是详细的流程描述:

1.1 硬件初始化

在启动 FreeRTOS 之前,需要先进行硬件初始化。这通常包括:

  1. 系统时钟初始化: 设置系统时钟频率,以确保 FreeRTOS 的节拍定时器能够正确工作。
  2. 外设初始化: 初始化与应用相关的外设,如 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毫秒
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值