亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

FreeRTOS任務控制API函數的功能是什么

發布時間:2022-04-07 09:56:59 來源:億速云 閱讀:123 作者:iii 欄目:開發技術

本篇內容主要講解“FreeRTOS任務控制API函數的功能是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“FreeRTOS任務控制API函數的功能是什么”吧!

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 ) <uxTaskPriorityGet( NULL ) )
     {
         // 當前優先級較高
     }
 }

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();
     }
 }

到此,相信大家對“FreeRTOS任務控制API函數的功能是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

吴旗县| 陵水| 瓮安县| 泾源县| 南岸区| 岱山县| 灌南县| 玛曲县| 浏阳市| 鸡泽县| 石渠县| 饶河县| 汤阴县| 白朗县| 手游| 当涂县| 泸定县| 宜兰县| 滦平县| 西乌珠穆沁旗| 静乐县| 临清市| 万载县| 民权县| 南漳县| 郎溪县| 阿荣旗| 江华| 泸溪县| 惠安县| 馆陶县| 静宁县| 沅陵县| 乌拉特前旗| 阿瓦提县| 威信县| 铅山县| 沙田区| 庐江县| 增城市| 乌恰县|