问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

vTaskDelay和vTaskDelayUntil的区别

创作时间:
作者:
@小白创作中心

vTaskDelay和vTaskDelayUntil的区别

引用
CSDN
1.
https://m.blog.csdn.net/2301_78981010/article/details/139383368

在FreeRTOS中,vTaskDelay和vTaskDelayUntil都是常用的延时函数,但它们在延时时间的记录方式上存在本质区别。本文通过具体代码示例和逻辑分析仪的波形图,详细解释了这两个函数的工作原理,并展示了它们在实际应用中的不同效果。

二者在如何记录延时时间上存在差异,vTaskDelay延时时间是以该函数调用为始,vTaskDelayUntil则以传入的时间形参为始:

  
/*二者的函数原型*/
void vTaskDelay(const TickType_t xTicksToDelay); 	//此后将要延迟多久
BaseType_t xTaskDelayUntil(TickType_t* const pxPreviousWakeTime, const TickType_t xTimeIncrement);	//以pxPreviousWake Time为基础,在此基础上延迟多久
  

假如有一任务循环执行设置电平为高电平,并用HAL_Delay函数保持其高电平,延时时间不一(即高电平时间不一),之后设置为低电平并分别使用vTaskDelay和vTaskDelayUntil进行100ms延时。(使用vTaskDelayUntil需要传入一个时间为参考,可通过xTaskGetTickCount获得TickType_t类型的时间比变量,这里)
参考:利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(2.2) —— 延时函数

  
while(1){
    TickType_t pre_time = xTaskGetTickCount();
    /*电平高电平*/
    /*延时*/
    /*电平低电平*/
    vTaskDelayUntil(&pre_time, 100/portTICK_PERIOD_MS);
}
  

通过逻辑分析仪获取电平翻转信息,下图(vTaskDelay)可见,延时的100ms是在就是每个低电平持续的时间,说明vTaskDelay的延时是从调用开始到调用结束来计时:

下图(vTaskDelayUntil)的100ms则是以pre_time为始,以此为基础计算100ms,运行到vTaskDelayUntil再延时直至共计100ms(有点类似于周期为100ms)
参考文章:
利用STM32CubeMX和keil模拟器,3天入门FreeRTOS(2.2) —— 延时函数

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号