当前位置: 代码迷 >> 综合 >> FreeRTOS 常用的几个函数
  详细解决方案

FreeRTOS 常用的几个函数

热度:3   发布时间:2024-01-31 11:45:07.0

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 );
// ...
// 这里为任务主体代码

}