欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【STM32】FreeRTOS任务挂起和恢复API

程序员文章站 2022-07-02 08:29:02
...

00. 目录

01. 概述

任务挂起和恢复,当某个任务要停止运行一段时间就可以将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。FreeRTOS的任务挂起和恢复API函数如下表所示:
【STM32】FreeRTOS任务挂起和恢复API

02. vTaskSuspend函数

void vTaskSuspend( TaskHandle_t xTaskToSuspend )
功能:
    将某个任务设置为挂起状态,进入挂起状态的任务永远都不会进入运行态。退出挂起状态的唯一的方法就是调用任务恢复函数。
    
参数:
    xTaskToSuspend 要挂起的任务句柄。为NULL表示挂起当前任务。
    
返回值:
   无 
    

温馨提示:

调用vTaskSuspend函数是不会累计的:即使多次调用vTaskSuspend ()函数将一个任务挂起,也只需调用一次vTaskResume ()函数就能使挂起的任务解除挂起状态。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须设置成1,此函数才有效。

应用示例:

void vFunction( void )
 {
     xTaskHandlexHandle;
     // 创建任务,保存任务句柄.
     xTaskCreate( vTaskCode, "TASK_NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // 使用句柄挂起创建的任务.
     vTaskSuspend( xHandle );
     // ...
     // 任务不再运行,除非其它任务调用了vTaskResume(xHandle )
     //...
     // 挂起本任务.
     vTaskSuspend( NULL );
     // 除非另一个任务使用handle调用了vTaskResume,否则永远不会执行到这里
 }

03. vTaskResume函数

void vTaskResume( TaskHandle_t xTaskToResume )
功能:
     恢复挂起的任务
参数:
    xTaskToResume 要恢复运行的任务句柄
返回值:
    无
    

温馨提示:

通过调用一次或多次vTaskSuspend()挂起的任务,可以调用一次vTaskResume ()函数来再次恢复运行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必须置1,此函数才有效。

应用示例:

void vFunction( void )
 {
     xTaskHandle xHandle;
     // 创建任务,保存任务句柄
     xTaskCreate( vTaskCode, "TASK_NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
     // ...
     // 使用句柄挂起创建的任务
     vTaskSuspend( xHandle );
     // ...
     //任务不再运行,除非其它任务调用了vTaskResume(xHandle )    
          //...
     // 恢复挂起的任务.
     vTaskResume( xHandle );
     // 任务再一次得到处理器时间
     // 任务优先级与之前相同
 }

04. xTaskResumeFromISR函数

BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume )
功能:
    用于恢复一个挂起的任务,用在ISR中
参数:
    xTaskToResume 要恢复运行的任务句柄
返回值:
    如果恢复任务后需要上下文切换返回pdTRUE,否则返回pdFALSE。由ISR确定是否需要上下文切换。
    

温馨提示:

通过调用一次或多次vTaskSuspend()函数而挂起的任务,只需调用一次xTaskResumeFromISR()函数即可恢复运行。

xTaskResumeFromISR()不可用于任务和中断间的同步,如果中断恰巧在任务被挂起之前到达,这就会导致一次中断丢失(任务还没有挂起,调用xTaskResumeFromISR()函数是没有意义的,只能等下一次中断)。这种情况下,可以使用信号量作为同步机制。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必须设置成1,此函数才有效。

应用示例:

xTaskHandle xHandle;               //注意这是一个全局变量
 
 void vAFunction( void )
 {
     // 创建任务并保存任务句柄
     xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
 
     // ... 剩余代码.
 }
 
 void vTaskCode( void *pvParameters )
 {
     for( ;; )
     {
         // ... 在这里执行一些其它功能
 
         // 挂起自己
         vTaskSuspend( NULL );
 
         //直到ISR恢复它之前,任务会一直挂起
     }
 }
 
 void vAnExampleISR( void )
 {
     portBASE_TYPExYieldRequired;
 
     // 恢复被挂起的任务
     xYieldRequired = xTaskResumeFromISR(xHandle );
 
     if( xYieldRequired == pdTRUE )
     {
         // 我们应该进行一次上下文切换
         // 注:  如何做取决于你具体使用,可查看说明文档和例程
         portYIELD_FROM_ISR();
     }
 }

05. 预留

06. 附录

6.1 【STM32】STM32系列教程汇总

网址:【STM32】STM32系列教程汇总

07. 参考

《FreeRTOS Reference Manual》

《Using the FreeRTOS Real Time Kernel -A Practical Guide》

《The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors,3rd Edition》