vTaskDelay 和 vTaskDelayUntil 的区别

1,有两个任务,一个任务 Task1 是用的 vTaskDelay 延迟,延迟 10ms, 另一个任务 Task2 是用的vTaskDelayUntil 延迟,延迟 10ms。vTaskDelayUntil 是绝对延迟, vTaskDelay 是相对延迟。 

Task1:
 vTaskDelay (pdMS_TO_TICKS(rand() % 500)) + vTaskDelay (pdMS_TO_TICKS(1000))
|----xms(500ms以内 + 1000ms 为一个周期----|
这个就是相对性的含义
◆ Task2:
bsp_KeyScan + vTaskDelayUntil ---------> bsp_KeyScan + vTaskDelayUntil

 vTaskDelay (pdMS_TO_TICKS(rand() % 500)) + vTaskDelayUntil(pdMS_TO_TICKS(1000))
|----xms(500ms以内 + 延时Y ms|= 1000ms

#include "FreeRTOS.h"
#include "task.h"
#include<stdio.h>



void vApplicationMallocFailedHook() {
	while(1);
}

void vApplicationStackOverflowHook(TaskHandle_t xTask, char * pcTaskName ) {
	while(1);
}

#include "semphr.h"

// 用于任务调用的宏定义
#define mainDELAY_LOOP_COUNT    ( 0xffffff )

// 定义任务句柄
TaskHandle_t xTask1Handle = NULL;
TaskHandle_t xTask2Handle = NULL;

// 定义足够大的缓冲区用于存储统计信息
#define RUN_TIME_STATS_BUFFER_SIZE 2048
char runTimeStatsBuffer[RUN_TIME_STATS_BUFFER_SIZE];



#define TASK_PRIORITY   (tskIDLE_PRIORITY + 1)

void vTaskDelayExample(void *pvParameters)
{
    TickType_t xLastWakeTime = xTaskGetTickCount();
    const TickType_t xDelay = pdMS_TO_TICKS(1000); // 延时1000毫秒
	int j = 0;
    for (;;)
    {
        // 打印当前时间
        printf("vTaskDelayExample: Before delay, tick count = %lu\n", xTaskGetTickCount());

         vTaskDelay(pdMS_TO_TICKS(rand() % 500)); // 延时0-500毫秒
		
		// 延时
        vTaskDelay(pdMS_TO_TICKS(1000));

        // 打印延时后的时间
        printf("vTaskDelayExample: After delay, tick count = %lu\n", xTaskGetTickCount());
    }
}

void xTaskDelayUntilExample(void *pvParameters)
{
    const TickType_t xFrequency = pdMS_TO_TICKS(1000); // 任务周期1000毫秒
    TickType_t xLastWakeTime = xTaskGetTickCount();
	int j = 0;

    for (;;)
    {
        // 打印当前时间
        printf("xTaskDelayUntilExample: Before delay, tick count = %lu\n", xTaskGetTickCount());

        // 执行任务代码...
        vTaskDelay(pdMS_TO_TICKS(rand() % 500)); // 延时0-500毫秒

        // 延时直到下一个周期
        xTaskDelayUntil(&xLastWakeTime, pdMS_TO_TICKS(1000));

        // 打印延时后的时间
        printf("xTaskDelayUntilExample: After delay, tick count = %lu\n", xTaskGetTickCount());
    }
}

int main(void)
{
	// 创建任务
	//xTaskCreate(vTaskDelayExample, "TaskDelay", configMINIMAL_STACK_SIZE, NULL, TASK_PRIORITY, NULL);
	xTaskCreate(xTaskDelayUntilExample, "TaskDelayUntil", configMINIMAL_STACK_SIZE, NULL, TASK_PRIORITY, NULL);

	// 启动调度器
	vTaskStartScheduler();

	// 如果调度器启动失败,则不会到达这里
	for (;;);
}

 (1)TaskDelay任务打印tick统计

vTaskDelayExample: Before delay, tick count = 0
vTaskDelayExample: After delay, tick count = 138
vTaskDelayExample: Before delay, tick count = 138
vTaskDelayExample: After delay, tick count = 276
vTaskDelayExample: Before delay, tick count = 276
vTaskDelayExample: After delay, tick count = 403
vTaskDelayExample: Before delay, tick count = 403
vTaskDelayExample: After delay, tick count = 544
vTaskDelayExample: Before delay, tick count = 544
vTaskDelayExample: After delay, tick count = 673
vTaskDelayExample: Before delay, tick count = 673
vTaskDelayExample: After delay, tick count = 806
vTaskDelayExample: Before delay, tick count = 806 

(2) TaskDelayUntil任务打印tick统计

xTaskDelayUntilExample: Before delay, tick count = 0
xTaskDelayUntilExample: After delay, tick count = 100
xTaskDelayUntilExample: Before delay, tick count = 100
xTaskDelayUntilExample: After delay, tick count = 200
xTaskDelayUntilExample: Before delay, tick count = 200
xTaskDelayUntilExample: After delay, tick count = 300
xTaskDelayUntilExample: Before delay, tick count = 300
xTaskDelayUntilExample: After delay, tick count = 400
xTaskDelayUntilExample: Before delay, tick count = 400
xTaskDelayUntilExample: After delay, tick count = 500
xTaskDelayUntilExample: Before delay, tick count = 500
xTaskDelayUntilExample: After delay, tick count = 600
xTaskDelayUntilExample: Before delay, tick count = 600
xTaskDelayUntilExample: After delay, tick count = 700
xTaskDelayUntilExample: Before delay, tick count = 700

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌上花开缓缓归以

你的鼓励将是我创作的最大动力,

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值