【STM32】FreeRTOS任务挂起和恢复API
00. 目录
文章目录
01. 概述
任务挂起和恢复,当某个任务要停止运行一段时间就可以将这个任务挂起,当要重新运行这个任务的话就恢复这个任务的运行。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系列教程汇总
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》
上一篇: 代码与页面的分离
下一篇: 党参红枣枸杞汤有哪些功效呢,赶快来看看