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

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

3天內(nèi)不再提示

FreeRTOS任務(wù)如何創(chuàng)建和刪除?

安芯教育科技 ? 來源:極術(shù)社區(qū) ? 作者:朱工 ? 2021-03-11 18:08 ? 次閱讀

FreeRTOS移植到Cortex-M3硬件平臺的文章中,我們已經(jīng)見過任務(wù)創(chuàng)建API,但那篇文章的重點在于如何移植FreeRTOS,本文將重點放在任務(wù)的創(chuàng)建和刪除API函數(shù)上面。

任務(wù)創(chuàng)建和刪除API函數(shù)位于文件task.c中,需要包含task.h頭文件。

1. 任務(wù)創(chuàng)建

1.1 函數(shù)描述

BaseType_t xTaskCreate( TaskFunction_t pvTaskCode, const char * const pcName, unsigned short usStackDepth, void *pvParameters, UBaseType_t uxPriority, TaskHandle_t * pvCreatedTask );

創(chuàng)建新的任務(wù)并加入任務(wù)就緒列表。

如果使用FreeRTOS-MPU(在官方下載包中,為Cortex-M3內(nèi)核寫了兩個移植方案,一個是普通的FreeRTOS移植層,還有一個是FreeRTOS-MPU移植層。后者包含完整的內(nèi)存保護),那么推薦使用函數(shù)xTaskCreateRestricted()來代替xTaskCreate()。在使用FreeRTOS-MPU的情況下,使用xTaskCreate()函數(shù)可以創(chuàng)建運行在特權(quán)模式或用戶模式(見下面對函數(shù)參數(shù)uxPriority的描述)的任務(wù)。當運行在特權(quán)模式下,任務(wù)可以訪問整個內(nèi)存映射;當處于用戶模式下,任務(wù)僅能訪問自己的堆棧。無論在何種模式下,MPU都不會自動捕獲堆棧溢出,因此標準的FreeRTOS堆棧溢出檢測機制仍然會被用到。xTaskCreateRestricted()函數(shù)具有更大的靈活性。

1.2 參數(shù)描述

pvTaskCode:指針,指向任務(wù)函數(shù)的入口。任務(wù)永遠不會返回(位于死循環(huán)內(nèi))。該參數(shù)類型TaskFunction_t定義在文件projdefs.h中,定義為:typedefvoid (TaskFunction_t)( void )。

pcName:任務(wù)描述。主要用于調(diào)試。字符串的最大長度由宏configMAXTASKNAMELEN指定,該宏位于FreeRTOSConfig.h文件中。

usStackDepth:指定任務(wù)堆棧大小,能夠支持的堆棧變量數(shù)量,而不是字節(jié)數(shù)。比如,在16位寬度的堆棧下,usStackDepth定義為100,則實際使用200字節(jié)堆棧存儲空間。堆棧的寬度乘以深度必須不超過sizet類型所能表示的最大值。比如,sizet為16位,則可以表示的最大值是65535。

pvParameters:指針,當任務(wù)創(chuàng)建時,作為一個參數(shù)傳遞給任務(wù)。

uxPriority:任務(wù)的優(yōu)先級。具有MPU支持的系統(tǒng),可以通過置位優(yōu)先級參數(shù)的portPRIVILEGEBIT位,隨意的在特權(quán)(系統(tǒng))模式下創(chuàng)建任務(wù)。比如,創(chuàng)建一個優(yōu)先級為2的特權(quán)任務(wù),參數(shù)uxPriority可以設(shè)置為( 2 | portPRIVILEGE_BIT )。

pvCreatedTask:用于回傳一個句柄(ID),創(chuàng)建任務(wù)后可以使用這個句柄引用任務(wù)。

1.3 返回值

如果任務(wù)成功創(chuàng)建并加入就緒列表函數(shù)返回pdPASS,否則函數(shù)返回錯誤碼,具體參見projdefs.h。

1.4 用法舉例

/* 創(chuàng)建任務(wù)。 */void vTaskCode( void * pvParameters ){ for( ;; ) { /* 任務(wù)代碼放在這里 */ }} /* 創(chuàng)建任務(wù)函數(shù) */void vOtherFunction( void ){ static unsigned char ucParameterToPass; xTaskHandlexHandle; /* 創(chuàng)建任務(wù),存儲句柄。注:傳遞的參數(shù)ucParameterToPass必須和任務(wù)具有相同的生存周期, 因此這里定義為靜態(tài)變量。如果它只是一個自動變量,可能不會有太長的生存周期,因為 中斷和高優(yōu)先級任務(wù)可能會用到它。*/ xTaskCreate( vTaskCode, “NAME”, STACK_SIZE,&ucParameterToPass, tskIDLE_PRIORITY, &xHandle ); /* 使用句柄刪除任務(wù)。 */ if( xHandle !=NULL ) { vTaskDelete( xHandle ); }}

2. 任務(wù)刪除

2.1 任務(wù)描述

voidvTaskDelete( TaskHandle_t xTask );

RTOS內(nèi)核管理器中刪除一個任務(wù)。任務(wù)刪除后將會從就緒、阻塞、暫停和事件列表中移除。在文件FreeRTOSConfig.h中,必須定義宏INCLUDE_vTaskDelete 為1,本函數(shù)才有效。

注:被刪除的任務(wù),其在任務(wù)創(chuàng)建時由內(nèi)核分配的存儲空間,會由空閑任務(wù)釋放。如果有應(yīng)用程序調(diào)用xTaskDelete(),必須保證空閑任務(wù)獲取一定的微控制器處理時間。任務(wù)代碼自己分配的內(nèi)存是不會自動釋放的,因此刪除任務(wù)前,應(yīng)該將這些內(nèi)存釋放。

2.2 參數(shù)描述

xTask:被刪除任務(wù)的句柄。為NULL表示刪除當前任務(wù)。

原文標題:FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建和刪除

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

責任編輯:haq

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

    關(guān)注

    21

    文章

    809

    瀏覽量

    119361
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61918

原文標題:FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建和刪除

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

收藏 人收藏

    評論

    相關(guān)推薦

    freertos最多支持多少個任務(wù)

    FreeRTOS是一個輕量級的實時操作系統(tǒng)(RTOS),其設(shè)計初衷就是為了提供簡單、可靠且高效的實時任務(wù)管理。關(guān)于FreeRTOS最多支持多少個任務(wù)的問題,實際上并沒有一個固定的上限,
    的頭像 發(fā)表于 09-02 14:21 ?616次閱讀

    esp8266的freertos+lwip不支持在多個任務(wù)創(chuàng)建多個不同的socket嗎?

    的socket fd。也就是說每個socket都是在各自的任務(wù)創(chuàng)建、讀寫和close的,按照道理應(yīng)該是互相獨立的,但是為啥會互相影響? 難道樂鑫的esp8266的freertos+lwip不支持在多個
    發(fā)表于 07-11 07:29

    vTaskDelete()刪除正在打印日志的任務(wù)導致esp32卡死無法恢復要怎么處理?

    實際的應(yīng)用場景是錄音的時候創(chuàng)建了一個任務(wù)去讀i2s數(shù)據(jù),放到一個ringbuf里,然后主任務(wù)從ringbuf里取數(shù)據(jù)進行降噪編碼處理。 長跑測試發(fā)現(xiàn)設(shè)備在執(zhí)行錄音時偶然會發(fā)生死機現(xiàn)象,排查發(fā)現(xiàn)是讀
    發(fā)表于 06-17 07:48

    請問一下FREERTOS只能創(chuàng)建4個任務(wù),修改哪個宏定義可以增加創(chuàng)建任務(wù)的數(shù)量?

    請問一下FREERTOS只能創(chuàng)建4個任務(wù),修改哪個宏定義可以增加創(chuàng)建任務(wù)的數(shù)量?解決方法:增加FREER
    發(fā)表于 05-13 06:44

    基于STM32Cubemx創(chuàng)建FreeRTOS,創(chuàng)建UART任務(wù)遇到的兩個問題求解

    基于STM32Cubemx創(chuàng)建FreeRTOS,創(chuàng)建UART任務(wù),經(jīng)過測試發(fā)現(xiàn)有以下兩個問題: 1、串口波特率問題: 在STM32Cubemx中串口設(shè)置如下: /* USART3 in
    發(fā)表于 05-10 07:33

    用STM32CubeMX中的FreeRTOS創(chuàng)建3任務(wù)無法運行的原因?

    用STM32CubeMX中的FreeRTOS 創(chuàng)建3任務(wù) Task Priority =osPrioirityNoral 等級的任務(wù),無法運行。 如果
    發(fā)表于 05-09 07:02

    HarmonyOS開發(fā)案例:【Stage模型下Ability的創(chuàng)建和使用】

    基于Stage模型,對Ability的創(chuàng)建和使用進行講解。首先在課程中我們將帶領(lǐng)大家使用DevEco Studio創(chuàng)建一個Stage模型Ability,并使用UIAbilityContext啟動
    的頭像 發(fā)表于 05-08 14:41 ?659次閱讀
    HarmonyOS開發(fā)案例:【Stage模型下Ability的<b class='flag-5'>創(chuàng)建和</b>使用】

    freertos系統(tǒng)如何劃分任務(wù)?

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

    freertos任務(wù)創(chuàng)建,每一個任務(wù)分配的內(nèi)存是多大才好,怎么計算呢?

    小白剛剛接觸freertos,想問一下就創(chuàng)建任務(wù)而言,每一個任務(wù)分配的內(nèi)存是多大才好,怎么計算呢? 另外,每個任務(wù)的執(zhí)行周期怎么確定?在
    發(fā)表于 04-23 06:39

    請問FreeRTOS同一個任務(wù)多次創(chuàng)建會有什么后果?

    比如在初始創(chuàng)建任務(wù)時就創(chuàng)建任務(wù)1、2、3、4、5 然后在任務(wù)2過程中又再次創(chuàng)建
    發(fā)表于 04-15 06:36

    FreeRTOS任務(wù)無故進入掛起狀態(tài)的原因?

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

    FreeRTOS如何刪除clib支持和抽象rtos?

    我目前在我的項目中使用FreeRTOS,但只使用了其最少的功能。 我需要刪除 clib 支持和抽象 rtos,只保留 FreeRTOS。 這是為了實現(xiàn)更輕的應(yīng)用程序并最大限度地減少依賴關(guān)系。 我怎么能那樣做?
    發(fā)表于 01-25 06:19

    如何可視化FreeRTOS任務(wù)響應(yīng)時間

    高效的開發(fā)基于FreeRTOS的固件需要理解任務(wù)、中斷和內(nèi)核之間的交互以及時間序列。
    的頭像 發(fā)表于 12-22 11:12 ?1003次閱讀
    如何可視化<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>響應(yīng)時間

    線程池的創(chuàng)建方式有幾種

    線程池是一種用于管理和調(diào)度線程的技術(shù),能夠有效地提高系統(tǒng)的性能和資源利用率。它通過預(yù)先創(chuàng)建一組線程并維護一個工作隊列,將任務(wù)提交給線程池來處理,從而減少線程的創(chuàng)建和銷毀次數(shù),避免了線程頻繁創(chuàng)建
    的頭像 發(fā)表于 12-04 16:52 ?801次閱讀

    FreeRTOS中的任務(wù)管理

    任務(wù)FreeRTOS 中最基本的調(diào)度單元,它是一段可執(zhí)行的代碼,可以獨立運行。FreeRTOS 中的任務(wù)是基于優(yōu)先級的搶占式調(diào)度,優(yōu)先級高的任務(wù)
    的頭像 發(fā)表于 11-27 17:03 ?922次閱讀