第09章 阻塞延时
约 541 字大约 2 分钟
2026-01-19
9.1 核心知识点
相关宏
INCLUDE_vTaskDelay 是否允许使用 vTaskDelay()
INCLUDE_vTaskDelayUntil 是否允许使用 vTaskDelayUntil()相关函数
vTaskDelay() 相对延时,从执行vTaskDelay()函数开始,直到指定延时的时间结束。
xTaskDelayUntil() 绝对延时,将整个任务的运行周期视为一个整体,适用于需要以固定频率定期执行的任务。
xTaskGetTickCount() 返回自调度器启动以来的滴答数
9.2 案例
① 需求
task1:用于展示相对延时函数 vTaskDelay() 的使用。
task2:用于展示绝对延时函数 vTaskDelayUntil() 的使用。② 代码
App_Task.c
#include "App_Task.h"
// 任务1 ------------------------------------
// 任务1函数的原型
void task1_callback(void *pvParameters);
// 任务1名称
#define TASK1_NAME "task1"
// 任务1堆栈大小
#define TASK1_STACK_SIZE 128
// 任务1的优先级
#define TASK1_PRIORITY 2
// 任务1的句柄
TaskHandle_t task1_handle;
// 任务2 ------------------------------------
// 任务2函数的原型
void task2_callback(void *pvParameters);
// 任务2名称
#define TASK2_NAME "task2"
// 任务2堆栈大小
#define TASK2_STACK_SIZE 128
// 任务2的优先级
#define TASK2_PRIORITY 1
// 任务2的句柄
TaskHandle_t task2_handle;
/**
* @brief 启动 FreeRTOS 任务管理
*
*/
void App_Task_Start(void)
{
// 进入临界区
taskENTER_CRITICAL();
// 创建任务1
xTaskCreate(task1_callback, TASK1_NAME, TASK1_STACK_SIZE, NULL, TASK1_PRIORITY, &task1_handle) == pdPASS ? printf("任务1创建成功! \n") : printf("任务1穿件失败! \n");
// 创建任务2
xTaskCreate(task2_callback, TASK2_NAME, TASK2_STACK_SIZE, NULL, TASK2_PRIORITY, &task2_handle) == pdPASS ? printf("任务2创建成功! \n") : printf("任务2穿件失败! \n");
// 退出临界区
taskEXIT_CRITICAL();
// 启动任务调度器 ( vTaskStartScheduler() 后面的代码不会被执行)
printf("任务调度器启动... \n");
vTaskStartScheduler();
}
// 任务1函数的实现
void task1_callback(void *pvParameters)
{
printf("任务1启动... \n");
while (1)
{
// 打印信息
printf("Task1 Running ... \n");
// 切换LED1状态
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
// 普通延时500ms
HAL_Delay(500);
// 阻塞延时1000ms
vTaskDelay(1000);
}
}
// 任务2函数的实现
void task2_callback(void *pvParameters)
{
printf("任务2启动... \n");
// 定义变量xLastWakeTime, 用于记录上一次任务执行的时间
TickType_t xLastWakeTime = xTaskGetTickCount();
while (1)
{
// 打印信息
printf("Task2 Running ... \n");
// 切换LED2状态
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
// 普通延时500ms
HAL_Delay(500);
// 阻塞阻塞延时1000ms
vTaskDelayUntil(&xLastWakeTime, 1000);
}
}