【STM32】FreeRTOS任务挂起和恢复API
00. 目錄
文章目錄
- 00. 目錄
- 01. 概述
- 02. vTaskSuspend函數(shù)
- 03. vTaskResume函數(shù)
- 04. xTaskResumeFromISR函數(shù)
- 05. 預留
- 06. 附錄
- 07. 參考
01. 概述
任務(wù)掛起和恢復,當某個任務(wù)要停止運行一段時間就可以將這個任務(wù)掛起,當要重新運行這個任務(wù)的話就恢復這個任務(wù)的運行。FreeRTOS的任務(wù)掛起和恢復API函數(shù)如下表所示:
02. vTaskSuspend函數(shù)
void vTaskSuspend( TaskHandle_t xTaskToSuspend ) 功能:將某個任務(wù)設(shè)置為掛起狀態(tài),進入掛起狀態(tài)的任務(wù)永遠都不會進入運行態(tài)。退出掛起狀態(tài)的唯一的方法就是調(diào)用任務(wù)恢復函數(shù)。參數(shù):xTaskToSuspend 要掛起的任務(wù)句柄。為NULL表示掛起當前任務(wù)。返回值:無溫馨提示:
調(diào)用vTaskSuspend函數(shù)是不會累計的:即使多次調(diào)用vTaskSuspend ()函數(shù)將一個任務(wù)掛起,也只需調(diào)用一次vTaskResume ()函數(shù)就能使掛起的任務(wù)解除掛起狀態(tài)。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必須設(shè)置成1,此函數(shù)才有效。
應用示例:
void vFunction( void ){xTaskHandlexHandle;// 創(chuàng)建任務(wù),保存任務(wù)句柄.xTaskCreate( vTaskCode, "TASK_NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );// ...// 使用句柄掛起創(chuàng)建的任務(wù).vTaskSuspend( xHandle );// ...// 任務(wù)不再運行,除非其它任務(wù)調(diào)用了vTaskResume(xHandle )//...// 掛起本任務(wù).vTaskSuspend( NULL );// 除非另一個任務(wù)使用handle調(diào)用了vTaskResume,否則永遠不會執(zhí)行到這里}03. vTaskResume函數(shù)
void vTaskResume( TaskHandle_t xTaskToResume ) 功能:恢復掛起的任務(wù) 參數(shù):xTaskToResume 要恢復運行的任務(wù)句柄 返回值:無溫馨提示:
通過調(diào)用一次或多次vTaskSuspend()掛起的任務(wù),可以調(diào)用一次vTaskResume ()函數(shù)來再次恢復運行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必須置1,此函數(shù)才有效。
應用示例:
void vFunction( void ){xTaskHandle xHandle;// 創(chuàng)建任務(wù),保存任務(wù)句柄xTaskCreate( vTaskCode, "TASK_NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );// ...// 使用句柄掛起創(chuàng)建的任務(wù)vTaskSuspend( xHandle );// ...//任務(wù)不再運行,除非其它任務(wù)調(diào)用了vTaskResume(xHandle ) //...// 恢復掛起的任務(wù).vTaskResume( xHandle );// 任務(wù)再一次得到處理器時間// 任務(wù)優(yōu)先級與之前相同}04. xTaskResumeFromISR函數(shù)
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume ) 功能:用于恢復一個掛起的任務(wù),用在ISR中 參數(shù):xTaskToResume 要恢復運行的任務(wù)句柄 返回值:如果恢復任務(wù)后需要上下文切換返回pdTRUE,否則返回pdFALSE。由ISR確定是否需要上下文切換。溫馨提示:
通過調(diào)用一次或多次vTaskSuspend()函數(shù)而掛起的任務(wù),只需調(diào)用一次xTaskResumeFromISR()函數(shù)即可恢復運行。
xTaskResumeFromISR()不可用于任務(wù)和中斷間的同步,如果中斷恰巧在任務(wù)被掛起之前到達,這就會導致一次中斷丟失(任務(wù)還沒有掛起,調(diào)用xTaskResumeFromISR()函數(shù)是沒有意義的,只能等下一次中斷)。這種情況下,可以使用信號量作為同步機制。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必須設(shè)置成1,此函數(shù)才有效。
應用示例:
xTaskHandle xHandle; //注意這是一個全局變量void vAFunction( void ){// 創(chuàng)建任務(wù)并保存任務(wù)句柄xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle );// ... 剩余代碼.}void vTaskCode( void *pvParameters ){for( ;; ){// ... 在這里執(zhí)行一些其它功能// 掛起自己vTaskSuspend( NULL );//直到ISR恢復它之前,任務(wù)會一直掛起}}void vAnExampleISR( void ){portBASE_TYPExYieldRequired;// 恢復被掛起的任務(wù)xYieldRequired = xTaskResumeFromISR(xHandle );if( xYieldRequired == pdTRUE ){// 我們應該進行一次上下文切換// 注: 如何做取決于你具體使用,可查看說明文檔和例程portYIELD_FROM_ISR();}}05. 預留
06. 附錄
6.1 【STM32】STM32系列教程匯總
網(wǎng)址:【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》
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的【STM32】FreeRTOS任务挂起和恢复API的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【STM32】FreeRTOS创建和删除
- 下一篇: 【STM32】FreeRTOS任务挂起和