1)vTaskSuspend(TaskHandle_t Task_ID) :挂起指定任务。被挂起的任务绝不会得到CPU的使用权,不管该任务具有什么优先 级。
使用实例
static TaskHandle_t LED_Task_Handle = NULL;/* LED 任务句柄 */
printf("挂起LED任务!\n");vTaskSuspend(LED Task Handle);/*挂起LED任务*/
2) vTaskSuspendAll(void):将所有的任务都挂起。调度器被挂起后则不能进行上下文切换,但是中断还是使能的。当调度器被挂起 时候,如果有中断需要进行上下文切换,那么这个中断将会被挂起,在调度器恢复之后才响应这个中断。
3)vTaskResume(askHandle_t Task_ID) :任务恢复函数。任务恢复就是让挂起的任务重新进入就绪状态,恢复的任务会保留挂起前的状态信息,在恢复的时候根据挂起时的状态继续运行。如果被恢复任务在所有就绪态任务中,处于最高优先级列表的第一位,那么系统将进行任务上下文的切换。
static TaskHandle_t LED_Task_Handle = NULL;/* LED 任务句柄 */
vTaskResume(TaskHandle_t LED_Task_Handle ) ;
4) 任务删除函数vTaskDelete(TaskHandle_t Task_ID):用于删除一个任务。当一个任务删除另外一个任务时,形参为要删除任务创建时返回的任务句柄,如果是删除自身,则形参为NULL。要想使用该函数必须在FreeRTOSConfig.h中把INCLUDEVTaskDelete定义为1,删除的任务将从所有就绪,阻塞,挂起和事件列表中删除.
5)vTaskDelay(const TickType_t xTicksToDelay):相对延时。在我们任务中用得非常之多,每个任务都必须是死循环,并且是必须要有阻塞的情况,否则低优先级的任务就无法被运行了。要想使用FreeRTOS中的VTaskDelay0函数必须在FreeRTOSConfig.h中把INCLUDE_VTaskDelay定义为1来使能。
vTaskDelay()延时是相对性的延时,它指定的延时时间是从调用 vTaskDelay()结束后开
始计算的, 经过指定的时间后延时结束。比如 vTaskDelay(100), 从调用 vTaskDelay()结束
后,任务进入阻塞状态,经过 100 个系统时钟节拍周期后,任务解除阻塞
vTaskDelay()用于阻塞延时,调用该函数后,任务将进入阻塞状态,进入阻塞态的任务将让出CPU资源。延时的时长由形参xTicksToDelay决定,单位为系统节拍周期,比如系统的时钟节拍周期为1ms,那么调用vTaskDelay(1)的延时时间则为1ms。
vTaskDelay()并不适用与周期性执行任务的场合,,此外,其它任务和中断活动, 也会影响到 vTaskDelay()的调用(比如调用前高优先级任务抢占了当前任务),进而影响到任务的下一次执行的时间
6)vTaskDelayUnti(TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement)
在FreeRTOS中,除了相对延时函数,还有绝对延时函数VTaskDelayUntil0,这个绝对延时常用于较精确的周期运行任务,比如我有一个任务,希望它以固定频率定期执行,而不受外部的影响,任务从上一次运行开始到下一次运行开始的时间间隔是绝对的,而不是相对的。
使用例子:
/* 用于保存上次时间。调用后系统自动更新 */
static portTickType PreviousWakeTime;
/* 设置延时时间,将时间转为节拍数 */
const portTickType TimeIncrement = pdMS_TO_TICKS(1000);
/* 获取当前系统时间 */
PreviousWakeTime = xTaskGetTickCount();
while (1){
/* 调用绝对延时函数,任务时间间隔为 1000 个 tick */
vTaskDelayUntil( &PreviousWakeTime, TimeIncrement );
// ...
// 这里为任务主体代码
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)