<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
void vTaskDelay( portTickTypexTicksToDelay )
呼叫vTaskDelay()函數後,任務會進入阻塞狀態,持續時間由vTaskDelay()函數的引數xTicksToDelay指定,單位是系統節拍時鐘週期。常數portTICK_RATE_MS 用來輔助計算真實時間,此值是系統節拍時鐘中斷的週期,單位是毫秒。在檔案FreeRTOSConfig.h中,宏INCLUDE_vTaskDelay 必須設定成1,此函數才能有效。
vTaskDelay()指定的延時時間是從呼叫vTaskDelay()後開始計算的相對時間。比如vTaskDelay(100),那麼從呼叫vTaskDelay()後,任務進入阻塞狀態,經過100個系統時鐘節拍週期,任務解除阻塞。因此,vTaskDelay()並不適用與週期性執行任務的場合。此外,其它任務和中斷活動,會影響到vTaskDelay()的呼叫(比如呼叫前高優先順序任務搶佔了當前任務),因此會影響任務下一次執行的時間。API函數vTaskDelayUntil()可用於固定頻率的延時,它用來延時一個絕對時間。
xTicksToDelay:延時時間總數,單位是系統時鐘節拍週期。
voidvTaskFunction( void * pvParameters ) { /* 阻塞500ms. */ constportTickType xDelay = 500 / portTICK_RATE_MS; for( ;; ) { /* 每隔500ms觸發一次LED, 觸發後進入阻塞狀態 */ vToggleLED(); vTaskDelay( xDelay ); } }
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排程器時,不可以使用此函數。
pxPreviousWakeTime
:指標,指向一個變數,該變數儲存任務最後一次解除阻塞的時間。第一次使用前,該變數必須初始化為當前時間。之後這個變數會在vTaskDelayUntil()函數內自動更新。
xTimeIncrement
:週期迴圈時間。當時間等於(*pxPreviousWakeTime + xTimeIncrement)時,任務解除阻塞。如果不改變引數xTimeIncrement的值,呼叫該函數的任務會按照固定頻率執行。
//每10次系統節拍執行一次 void vTaskFunction( void * pvParameters ) { static portTickType xLastWakeTime; const portTickType xFrequency = 10; // 使用當前時間初始化變數xLastWakeTime xLastWakeTime = xTaskGetTickCount(); for( ;; ) { //等待下一個週期 vTaskDelayUntil( &xLastWakeTime,xFrequency ); // 需要週期性執行程式碼放在這裡 } }
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask );
獲取指定任務的優先順序。在檔案FreeRTOSConfig.h中,宏INCLUDE_vTaskPriorityGet必須設定成1,此函數才有效。
xTask:任務控制程式碼。NULL表示獲取當前任務的優先順序。
返回指定任務的優先順序。
voidvAFunction( void ) { xTaskHandlexHandle; // 建立任務,儲存任務控制程式碼 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用控制程式碼獲取建立的任務的優先順序 if( uxTaskPriorityGet( xHandle ) !=tskIDLE_PRIORITY ) { // 任務可以改變自己的優先順序 } // ... // 當前任務優先順序比建立的任務優先順序高? if( uxTaskPriorityGet( xHandle ) <uxTaskPriorityGet( NULL ) ) { // 當前優先順序較高 } }
void vTaskPrioritySet( TaskHandle_txTask,UBaseType_tuxNewPriority );
設定指定任務的優先順序。如果設定的優先順序高於當前執行的任務,在函數返回前會進行一次上下文切換。在檔案FreeRTOSConfig.h中,宏INCLUDE_vTaskPrioritySet 必須設定成1,此函數才有效。
xTask:要設定優先順序任務的控制程式碼,為NULL表示設定當前執行的任務。uxNewPriority:要設定的新優先順序。
voidvAFunction( void ) { xTaskHandlexHandle; // 建立任務,儲存任務控制程式碼。 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用控制程式碼來提高建立任務的優先順序 vTaskPrioritySet( xHandle,tskIDLE_PRIORITY + 1 ); // ... // 使用NULL引數來提高當前任務的優先順序,設定成和建立的任務相同。 vTaskPrioritySet( NULL, tskIDLE_PRIORITY +1 ); }
void vTaskSuspend( TaskHandle_txTaskToSuspend );
掛起指定任務。被掛起的任務絕不會得到處理器時間,不管該任務具有什麼優先順序。
呼叫vTaskSuspend函數是不會累計的:即使多次呼叫vTaskSuspend ()函數將一個任務掛起,也只需呼叫一次vTaskResume ()函數就能使掛起的任務解除掛起狀態。在檔案FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必須設定成1,此函數才有效。
xTaskToSuspend:要掛起的任務控制程式碼。為NULL表示掛起當前任務。
voidvAFunction( void ) { xTaskHandlexHandle; // 建立任務,儲存任務控制程式碼. xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用控制程式碼掛起建立的任務. vTaskSuspend( xHandle ); // ... // 任務不再執行,除非其它任務呼叫了vTaskResume(xHandle ) //... // 掛起本任務. vTaskSuspend( NULL ); // 除非另一個任務使用handle呼叫了vTaskResume,否則永遠不會執行到這裡 }
void vTaskResume( TaskHandle_txTaskToResume );
恢復掛起的任務。
通過呼叫一次或多次vTaskSuspend()掛起的任務,可以呼叫一次vTaskResume ()函數來再次恢復執行。在檔案FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend必須置1,此函數才有效。
xTaskToResume:要恢復執行的任務控制程式碼。
6.3用法舉例
voidvAFunction( void ) { xTaskHandle xHandle; // 建立任務,儲存任務控制程式碼 xTaskCreate( vTaskCode, "NAME",STACK_SIZE, NULL, tskIDLE_PRIORITY, &xHandle ); // ... // 使用控制程式碼掛起建立的任務 vTaskSuspend( xHandle ); // ... //任務不再執行,除非其它任務呼叫了vTaskResume(xHandle ) //... // 恢復掛起的任務. vTaskResume( xHandle ); // 任務再一次得到處理器時間 // 任務優先順序與之前相同 }
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume );
用於恢復一個掛起的任務,用在ISR中。
通過呼叫一次或多次vTaskSuspend()函數而掛起的任務,只需呼叫一次xTaskResumeFromISR()函數即可恢復執行。
xTaskResumeFromISR()不可用於任務和中斷間的同步,如果中斷恰巧在任務被掛起之前到達,這就會導致一次中斷丟失(任務還沒有掛起,呼叫xTaskResumeFromISR()函數是沒有意義的,只能等下一次中斷)。這種情況下,可以使用號誌作為同步機制。在檔案FreeRTOSConfig.h中,宏INCLUDE_vTaskSuspend 和 INCLUDE_xTaskResumeFromISR 必須設定成1,此函數才有效。
xTaskToResume:要恢復執行的任務控制程式碼。
如果恢復任務後需要上下文切換返回pdTRUE,否則返回pdFALSE。由ISR確定是否需要上下文切換。
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函數的功能分析的詳細內容,更多關於FreeRTOS任務控制API函數的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45