你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】FreeRTOS任务挂起和恢复API

[复制链接]
STMCU小助手 发布时间:2022-3-26 14:00
01. 概述
任务挂起和恢复,当某个任务要停止运行一段时间就可以将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。FreeRTOS的任务挂起和恢复API函数如下表所示:

20201123174926358.png

02. vTaskSuspend函数
  1. void vTaskSuspend( TaskHandle_t xTaskToSuspend )
  2. 功能:
  3.     将某个任务设置为挂起状态,进入挂起状态的任务永远都不会进入运行态。退出挂起状态的唯一的方法就是调用任务恢复函数。

  4. 参数:
  5.     xTaskToSuspend 要挂起的任务句柄。为NULL表示挂起当前任务。

  6. 返回值:
  7.    无
复制代码

温馨提示:

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

应用示例:

  1. void vFunction( void )
  2. {
  3.      xTaskHandlexHandle;
  4.      // 创建任务,保存任务句柄.
  5.      xTaskCreate( vTaskCode, "TASK_NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
  6.      // ...
  7.      // 使用句柄挂起创建的任务.
  8.      vTaskSuspend( xHandle );
  9.      // ...
  10.      // 任务不再运行,除非其它任务调用了vTaskResume(xHandle )
  11.      //...
  12.      // 挂起本任务.
  13.      vTaskSuspend( NULL );
  14.      // 除非另一个任务使用handle调用了vTaskResume,否则永远不会执行到这里
  15. }
复制代码

03. vTaskResume函数
  1. void vTaskResume( TaskHandle_t xTaskToResume )
  2. 功能:
  3.      恢复挂起的任务
  4. 参数:
  5.     xTaskToResume 要恢复运行的任务句柄
  6. 返回值:
  7.     无
复制代码

温馨提示:

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

应用示例:

  1. void vFunction( void )
  2. {
  3.      xTaskHandle xHandle;
  4.      // 创建任务,保存任务句柄
  5.      xTaskCreate( vTaskCode, "TASK_NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );
  6.      // ...
  7.      // 使用句柄挂起创建的任务
  8.      vTaskSuspend( xHandle );
  9.      // ...
  10.      //任务不再运行,除非其它任务调用了vTaskResume(xHandle )   
  11.           //...
  12.      // 恢复挂起的任务.
  13.      vTaskResume( xHandle );
  14.      // 任务再一次得到处理器时间
  15.      // 任务优先级与之前相同
  16. }
复制代码

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

温馨提示:

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

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

应用示例:

  1. xTaskHandle xHandle;               //注意这是一个全局变量

  2. void vAFunction( void )
  3. {
  4.      // 创建任务并保存任务句柄
  5.      xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );

  6.      // ... 剩余代码.
  7. }

  8. void vTaskCode( void *pvParameters )
  9. {
  10.      for( ;; )
  11.      {
  12.          // ... 在这里执行一些其它功能

  13.          // 挂起自己
  14.          vTaskSuspend( NULL );

  15.          //直到ISR恢复它之前,任务会一直挂起
  16.      }
  17. }

  18. void vAnExampleISR( void )
  19. {
  20.      portBASE_TYPExYieldRequired;

  21.      // 恢复被挂起的任务
  22.      xYieldRequired = xTaskResumeFromISR(xHandle );

  23.      if( xYieldRequired == pdTRUE )
  24.      {
  25.          // 我们应该进行一次上下文切换
  26.          // 注:  如何做取决于你具体使用,可查看说明文档和例程
  27.          portYIELD_FROM_ISR();
  28.      }
  29. }
复制代码




收藏 评论0 发布时间:2022-3-26 14:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版