色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

FreeRTOS任務控制API函數介紹

安芯教育科技 ? 來源:極術社區 ? 作者:朱工 ? 2021-03-19 10:19 ? 次閱讀

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系列第11篇---FreeRTOS任務控制

文章出處:【微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • RTOS
    +關注

    關注

    22

    文章

    819

    瀏覽量

    119829
  • FreeRTOS
    +關注

    關注

    12

    文章

    484

    瀏覽量

    62329

原文標題:FreeRTOS系列第11篇---FreeRTOS任務控制

文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    freertos最多支持多少個任務

    以下幾個因素: 系統資源 :FreeRTOS能夠支持的任務數量受到系統硬件資源的限制,特別是處理器的RAM大小和性能。RAM用于存儲任務控制塊(TCB)和
    的頭像 發表于 09-02 14:21 ?1146次閱讀

    請問一下FREERTOS只能創建4個任務,修改哪個宏定義可以增加創建任務的數量?

    請問一下FREERTOS只能創建4個任務,修改哪個宏定義可以增加創建任務的數量?解決方法:增加FREERTOS的堆。
    發表于 05-13 06:44

    淺析FreeRTOS任務調度器的三種調度算法和應用

    FreeRTOS在MCU領域應用非常廣泛,今天就給大家講解一下FreeRTOS調度器中的三種調度算法,以及在瑞薩RZ/T2L MPU中的應用。
    的頭像 發表于 05-10 14:02 ?7779次閱讀
    淺析<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務</b>調度器的三種調度算法和應用

    stm32在freertos中如何接收串口數據?

    之前STM32一致裸跑,最近使用FREERTOS感覺還不錯。最近想把UART 弄成一個API,這樣多個任務使用UART發送數據就不會亂碼了。 發送數據的API已經寫好了。數據接受用中斷
    發表于 05-09 07:06

    求助,關于stm32f1使用freeRTOS和Fatfs時任務堆棧大小問題求解

    哪位使用過freeRTOS和Fatfs時,使用Fatfs系統的函數如f_open()等等時,此任務的堆棧大小大致需要多大,當前MAX_SS 定義為4096,我分配12K軟件都跑飛了,請哪位使用分享一下經驗,謝謝!~~?
    發表于 05-09 06:50

    用的cube生成的freertos工程,串口和任務通過郵箱通訊,結果任務反應很慢是怎么回事?

    初學freertos。用的cube生成的freertos工程,單片機型號位stm32f103vbt6。 建了三個人物,一個是串口任務,一個是LED每秒翻轉一次,一個是空任務。 串口
    發表于 05-08 08:13

    freertos系統如何劃分任務

    正在看freertos方面的教程,想請教下如何劃分任務? 比如之前做的一個數據采集板,用到了單片機以下功能: 1,單片機通過SPI1和ADC芯片通訊,同時還要通過SPI控制ADC電路部分的其他外圍
    發表于 05-08 07:16

    freertos如何周期性的執行一個任務,比如200ms調用一次任務, 用定時器發消息?

    freertos如何周期性的執行一個任務,比如200ms調用一次任務, 用定時器發消息?有沒有一個函數能直接實現
    發表于 05-07 08:21

    關于FreeRTOS任務劃分及comsis_os函數使用的疑問求解

    當前任務掛起并喚醒下一個任務。比如在首頁,接受到設置按鍵以后,就將當前任務——首頁任務掛起,resume設置首頁任務。 請問這樣劃分行嗎?
    發表于 05-07 07:49

    FreeRTOS系統使用xTaskCreate產生的任務與osThreadDef 產生的線程有什么不同?

    請教下是要 FreeRTOS系統, 使用 xTaskCreate 產生的任務 與 osThreadDef產生的線程有什么不同?
    發表于 04-29 07:20

    freertos任務創建,每一個任務分配的內存是多大才好,怎么計算呢?

    小白剛剛接觸freertos,想問一下就創建任務而言,每一個任務分配的內存是多大才好,怎么計算呢? 另外,每個任務的執行周期怎么確定?在任務
    發表于 04-23 06:39

    為什么CubeMX設計的FreeRTOS工程只能正常運行3個任務

    用CubeMX4.20設計的FreeRTOS工程有六個任務,出一個任務優先級較低外,另外幾個都是較高優先級。發現只有3個任務是正常運行的,還有三個沒有運行的跡象。用斷點跟蹤法在
    發表于 04-19 08:23

    FreeRTOS里在中斷中掛起任務出錯的原因?怎么解決?

    各位大佬,新手剛學習FreeRTOS,現在想在中斷中掛起某個任務,我在教程里看到說有中斷中的恢復函數xTaskResumeFromISR,但是沒有在中斷中的掛起函數,我搜了一下,有人說
    發表于 04-16 08:26

    FreeRTOS任務無故進入掛起狀態的原因?

    請教大家一個問題,我子啊使用FreeRTOS的時候創建了一個以太網的任務任務在使用的過程中被無故掛起,請問一下出現這種現象有哪幾種原因呢?
    發表于 04-09 07:20

    verilog中函數任務對比

    在verilog中,函數任務均用來描述共同的代碼段,并且在模式內任意位置被調用,提高代碼效率,讓代碼更加的直觀,提高代碼可讀性。但是在實際使用的過程中,函數任務也存在諸多的不同,下
    的頭像 發表于 02-12 18:43 ?910次閱讀
    主站蜘蛛池模板: 在线中文字幕 | 日本高清免费在线 | 日韩精品欧美亚洲高清有无 | 国产人妻久久久精品麻豆 | 精品久久免费观看 | 18禁止看的免费污网站 | 青青草伊人久久 | 国产无遮挡色视频免费观看性色 | 成人性生交大片免费看金瓶七仙女 | 国产在线精品视频免费观看 | 国产精品一区二区AV97 | 小SB几天没做SAO死了H | 欧美男同gay粗大又长 | 欧洲-级毛片内射八十老太婆 | 性欧美FREE少妇XXX | 真人女人无遮挡内谢免费视频% | 国产精品嫩草影院在线观看免费 | 一本道mw高清码二区三区 | 久 久 亚洲 少 妇 无 码 | 国产成人精品自拍 | 日本欧美久久久久免费播放网 | 日韩人妻少妇一区二区三区 | 国产精品女上位在线观看 | www亚洲欲色成人久久精品 | 亚洲日本国产综合高清 | 亚洲午夜精品一区二区公牛电影院 | 精品无码国产AV一区二区三区 | 国产成人无码AV麻豆 | 快播萝莉影院 | 欧美人与动牲交XXXXBBBB免费 | 好男人视频免费高清在线观看www | 国内精品乱码卡一卡2卡三卡 | 一级无毛片 | 国产福利视频在线观看福利 | 父亲在线日本综艺免费观看全集 | 热の中文 AV天堂 | A片毛片免费视频在线看 | 无码日本亚洲一区久久精品 | 蜜桃视频无码区在线观看 | 国产精品色无码AV在线观看 | 国产亚洲精品 在线视频 香蕉 |