FreeRTOS 任务延时函数

发布时间:2023年12月29日

一、vTaskDelay() ?任务延时函数

等待延时时间到继续运行下面的程序。延时单位:系统时钟节拍

#define configTICK_RATE_HZ? ( ( TickType_t ) 1000 )

//时钟节拍频率,设置为1000,周期就是1ms


二、vTaskDelayUntil() ?任务绝对延时函数

任务运行到vTaskDelayUntil需要时间t,vTaskDelayUntil延时时间为T,并不是单纯的等待T时间之后退出阻塞态,他是会保证每次任务的运行时间都是一样的,也就是让将任务以一定的频率进行。延时单位:系统时钟节拍

例如,下图的两个for循环时间在0.4s左右,我用绝对延时函数,那么hello每次打印的时间间隔基本是每2S打印依次,打印函数的时间并不会受for循环时间的影响。但是如果我使用相对时间函数进行延时,那么我hello2的打印时间是任务运行一次的时间+任务延时的时间

任务运行到vTaskDelayUntil需要时间t,vTaskDelayUntil延时时间为T,如果t>T,那么延时函数将不会起到任何作用,他不会进行延时,因为需要保证任务按照一定的频率进行

三、xTaskAbortDelay() ?终止任务延时函数

xTaskAbortDelay()用于终止处于阻塞态任务的阻塞,例如任务需要获取信号量,等待超时时间,此时任务处于阻塞状态,那么xTaskAbortDelay可以终止任务的阻塞。又或者使用vTaskDelay()函数延时,延时时间未到,使用xTaskAbortDelay可以终止任务的阻塞。

xTaskAbortDelay函数里面主要进行以下处理

1. 函数 xTaskAbortDelay()会将阻塞任务从阻塞态任务列表中移除,并将任务添加到就绪态
任务列表中。
2. 因为有任务添加到就绪态任务列表中,因此需要的启用抢占式调度的情况下,判断刚添
加就绪态任务列表中的任务是否为系统中优先级最高的任务,如果是的话,就需要进行任务切
换,这就是抢占式调度的抢占机制。
3. 任务被阻塞可能不仅仅因为是被延时,还有可能是在等待某个事件的发生,如果任务是
因为等待事件而被阻塞,那么中断阻塞的时候,需要将任务从所在事件列表中移除。

文章来源:https://blog.csdn.net/m0_61973119/article/details/135282785
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。