網站首頁 編程語言 正文
1.相對延時
1.1函數描述
void vTaskDelay( portTickTypexTicksToDelay )
調用vTaskDelay()函數后,任務會進入阻塞狀態,持續時間由vTaskDelay()函數的參數xTicksToDelay指定,單位是系統節拍時鐘周期。常量portTICK_RATE_MS 用來輔助計算真實時間,此值是系統節拍時鐘中斷的周期,單位是毫秒。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelay 必須設置成1,此函數才能有效。
vTaskDelay()指定的延時時間是從調用vTaskDelay()后開始計算的相對時間。比如vTaskDelay(100),那么從調用vTaskDelay()后,任務進入阻塞狀態,經過100個系統時鐘節拍周期,任務解除阻塞。因此,vTaskDelay()并不適用與周期性執行任務的場合。此外,其它任務和中斷活動,會影響到vTaskDelay()的調用(比如調用前高優先級任務搶占了當前任務),因此會影響任務下一次執行的時間。API函數vTaskDelayUntil()可用于固定頻率的延時,它用來延時一個絕對時間。
1.2參數描述
xTicksToDelay:延時時間總數,單位是系統時鐘節拍周期。
1.3用法舉例
voidvTaskFunction( void * pvParameters ) { /* 阻塞500ms. */ constportTickType xDelay = 500 / portTICK_RATE_MS; for( ;; ) { /* 每隔500ms觸發一次LED, 觸發后進入阻塞狀態 */ vToggleLED(); vTaskDelay( xDelay ); } }
2.絕對延時
2.1函數描述
void vTaskDelayUntil( TickType_t *pxPreviousWakeTime,const TickType_txTimeIncrement );
任務延時一個指定的時間。周期性任務可以使用此函數,以確保一個恒定的頻率執行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskDelayUntil 必須設置成1,此函數才有效。
這個函數不同于vTaskDelay()函數的一個重要之處在于:vTaskDelay()指定的延時時間是從調用vTaskDelay()之后(執行完該函數)開始算起的,但是vTaskDelayUntil()指定的延時時間是一個絕對時間。
調用vTaskDelay()函數后,任務會進入阻塞狀態,持續時間由vTaskDelay()函數的參數指定,單位是系統節拍時鐘周期。因此vTaskDelay()并不適用于周期性執行任務的場合。因為調用vTaskDelay()到任務解除阻塞的時間不總是固定的并且該任務下一次調用vTaskDelay()函數的時間也不總是固定的(兩次執行同一任務的時間間隔本身就不固定,中斷或高優先級任務搶占也可能會改變每一次執行時間)。
vTaskDelay()指定一個從調用vTaskDelay()函數后開始計時,到任務解除阻塞為止的相對時間,而vTaskDelayUntil()指定一個絕對時間,每當時間到達,則解除任務阻塞。
應當指出的是,如果指定的喚醒時間已經達到,vTaskDelayUntil()立刻返回(不會有阻塞)。因此,使用vTaskDelayUntil()周期性執行的任務,無論任何原因(比如,任務臨時進入掛起狀態)停止了周期性執行,使得任務少運行了一個或多個執行周期,那么需要重新計算所需要的喚醒時間。這可以通過傳遞給函數的指針參數pxPreviousWake指向的值與當前系統時鐘計數值比較來檢測,在大多數情況下,這并不是必須的。
常量portTICK_RATE_MS 用來輔助計算真實時間,此值是系統節拍時鐘中斷的周期,單位是毫秒。
當調用vTaskSuspendAll()函數掛起RTOS調度器時,不可以使用此函數。
2.2參數描述
pxPreviousWakeTime
:指針,指向一個變量,該變量保存任務最后一次解除阻塞的時間。第一次使用前,該變量必須初始化為當前時間。之后這個變量會在vTaskDelayUntil()函數內自動更新。
xTimeIncrement
:周期循環時間。當時間等于(*pxPreviousWakeTime + xTimeIncrement)時,任務解除阻塞。如果不改變參數xTimeIncrement的值,調用該函數的任務會按照固定頻率執行。
2.3用法舉例
//每10次系統節拍執行一次 void vTaskFunction( void * pvParameters ) { static portTickType xLastWakeTime; const portTickType xFrequency = 10; // 使用當前時間初始化變量xLastWakeTime xLastWakeTime = xTaskGetTickCount(); for( ;; ) { //等待下一個周期 vTaskDelayUntil( &xLastWakeTime,xFrequency ); // 需要周期性執行代碼放在這里 } }
3.獲取任務優先級
3.1函數描述
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask );
獲取指定任務的優先級。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskPriorityGet必須設置成1,此函數才有效。
3.2參數描述
xTask:任務句柄。NULL表示獲取當前任務的優先級。
3.3返回值
返回指定任務的優先級。
3.4用法舉例
voidvAFunction( void ) { xTaskHandlexHandle; // 創建任務,保存任務句柄 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用句柄獲取創建的任務的優先級 if( uxTaskPriorityGet( xHandle ) !=tskIDLE_PRIORITY ) { // 任務可以改變自己的優先級 } // ... // 當前任務優先級比創建的任務優先級高? if( uxTaskPriorityGet( xHandle )
4.設置任務優先級
4.1函數描述
void vTaskPrioritySet( TaskHandle_txTask,UBaseType_tuxNewPriority );
設置指定任務的優先級。如果設置的優先級高于當前運行的任務,在函數返回前會進行一次上下文切換。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskPrioritySet 必須設置成1,此函數才有效。
4.2參數描述
xTask:要設置優先級任務的句柄,為NULL表示設置當前運行的任務。uxNewPriority:要設置的新優先級。
4.3用法舉例
voidvAFunction( void ) { xTaskHandlexHandle; // 創建任務,保存任務句柄。 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用句柄來提高創建任務的優先級 vTaskPrioritySet( xHandle,tskIDLE_PRIORITY + 1 ); // ... // 使用NULL參數來提高當前任務的優先級,設置成和創建的任務相同。 vTaskPrioritySet( NULL, tskIDLE_PRIORITY +1 ); }
5.任務掛起
5.1函數描述
void vTaskSuspend( TaskHandle_txTaskToSuspend );
掛起指定任務。被掛起的任務絕不會得到處理器時間,不管該任務具有什么優先級。
調用vTaskSuspend函數是不會累計的:即使多次調用vTaskSuspend ()函數將一個任務掛起,也只需調用一次vTaskResume ()函數就能使掛起的任務解除掛起狀態。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必須設置成1,此函數才有效。
5.2參數描述
xTaskToSuspend:要掛起的任務句柄。為NULL表示掛起當前任務。
5.3用法舉例
voidvAFunction( void ) { xTaskHandlexHandle; // 創建任務,保存任務句柄. xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用句柄掛起創建的任務. vTaskSuspend( xHandle ); // ... // 任務不再運行,除非其它任務調用了vTaskResume(xHandle ) //... // 掛起本任務. vTaskSuspend( NULL ); // 除非另一個任務使用handle調用了vTaskResume,否則永遠不會執行到這里 }
6.恢復掛起的任務
6.1函數描述
void vTaskResume( TaskHandle_txTaskToResume );
恢復掛起的任務。
通過調用一次或多次vTaskSuspend()掛起的任務,可以調用一次vTaskResume ()函數來再次恢復運行。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必須置1,此函數才有效。
6.2參數描述
xTaskToResume:要恢復運行的任務句柄。
6.3用法舉例
voidvAFunction( void ) { xTaskHandle xHandle; // 創建任務,保存任務句柄 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用句柄掛起創建的任務 vTaskSuspend( xHandle ); // ... //任務不再運行,除非其它任務調用了vTaskResume(xHandle ) //... // 恢復掛起的任務. vTaskResume( xHandle ); // 任務再一次得到處理器時間 // 任務優先級與之前相同 }
7.恢復掛起的任務(在中斷服務函數中使用)
7.1函數描述
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume );
用于恢復一個掛起的任務,用在ISR中。
通過調用一次或多次vTaskSuspend()函數而掛起的任務,只需調用一次xTaskResumeFromISR()函數即可恢復運行。
xTaskResumeFromISR()不可用于任務和中斷間的同步,如果中斷恰巧在任務被掛起之前到達,這就會導致一次中斷丟失(任務還沒有掛起,調用xTaskResumeFromISR()函數是沒有意義的,只能等下一次中斷)。這種情況下,可以使用信號量作為同步機制。在文件FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必須設置成1,此函數才有效。
7.2參數描述
xTaskToResume:要恢復運行的任務句柄。
7.3返回值
如果恢復任務后需要上下文切換返回pdTRUE,否則返回pdFALSE。由ISR確定是否需要上下文切換。
7.4用法舉例
xTaskHandlexHandle; //注意這是一個全局變量 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(); } }
原文鏈接:https://blog.csdn.net/zhzht19861011/article/details/50454591
相關推薦
- 2023-07-25 使用EasyExcel實現Excel的導入導出
- 2022-06-13 Python數據類型及常用方法_python
- 2022-11-05 Android開發使用Databinding實現關注功能mvvp_Android
- 2022-12-15 C語言利用鏈表實現學生成績管理系統_C 語言
- 2022-05-06 Matplotlib安裝與配置
- 2023-03-22 WinPC搭建nginx服務器的實現步驟_nginx
- 2022-04-28 詳解Pandas的三大利器(map,apply,applymap)_python
- 2022-07-29 C++超詳細講解操作符的重載_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支