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

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

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

任務(wù)句柄是到底是怎么一回事

h1654155149.6853 ? 來源:電子工程世界 ? 作者:電子工程世界 ? 2022-05-07 11:19 ? 次閱讀
摘要學(xué)過用過FreeRTOS的人都知道,在創(chuàng)建任務(wù)時(shí)候我們都要定義一個(gè)任務(wù)句柄,這個(gè)任務(wù)句柄有啥含義?書上的解釋是任務(wù)創(chuàng)建成功以后會(huì)返回此任務(wù)的任務(wù)句柄,這個(gè)句柄就是任務(wù)的堆棧。參數(shù)就用來保存這個(gè)任務(wù)句柄。其他API函數(shù)可能會(huì)使用到這個(gè)句柄。

那么任務(wù)句柄是到底是怎么一回事,它保存的是任務(wù)控制塊的首地址。那么它又是如何來保存任務(wù)的首地址呢?這就是我們今天要討論的話題。我盡量寫得通俗易懂,讓大家都能輕松理解。

1、創(chuàng)建一個(gè)任務(wù)

動(dòng)態(tài)創(chuàng)建一個(gè)任務(wù)

#defineTASK1_TASK_PRIO1//任務(wù)優(yōu)先級(jí)
#defineTASK1_STK_SIZE128//任務(wù)棧大小
TaskHandle_tTask1Task_Handler;//任務(wù)句柄
//動(dòng)態(tài)創(chuàng)建一個(gè)任務(wù)1
xTaskCreate((TaskFunction_t)task1_task,//任務(wù)函數(shù)
(constchar*)"task1_task",//任務(wù)名稱
(uint16_t)TASK1_STK_SIZE,//任務(wù)堆棧大小
(void*)NULL,//傳遞給任務(wù)函數(shù)的參數(shù)
(UBaseType_t)TASK1_TASK_PRIO,//任務(wù)優(yōu)先級(jí)
(TaskHandle_t*)&Task1Task_Handler);//任務(wù)句柄

//task1任務(wù)函數(shù)
voidtask1_task(void*pvParameters)
{
for(;;)
{
vTaskDelay(2000);
}
}
cc620efc-cd96-11ec-bce3-dac502259ad0.png

參數(shù):

  • pxTaskCode:任務(wù)函數(shù)。
  • pcName:任務(wù)名字,一般用于追蹤和調(diào)試,任務(wù)名字長度不能超過。configMAX_TASK_NAME_LEN,在FreeRTOSConfig.h文件中宏定義為16。
  • usStackDepth:任務(wù)堆棧大小,實(shí)際申請(qǐng)到的堆棧是usStackDepth的4倍。其中空閑任務(wù)的任務(wù)堆棧大小為configMINIMAL_STACK_SIZE,在FreeRTOSConfig.h文件中宏定義為130(字)。
  • pvParameters:傳遞給任務(wù)函數(shù)的參數(shù)。
  • uxPriority:任務(wù)優(yōu)先級(jí),范圍0—configMAX_PRIORITIES-1,在FreeRTOSConfig.h文件中configMAX_PRIORITIES宏定義為32。
  • pxCreatedTask:任務(wù)句柄,任務(wù)創(chuàng)建成功以后會(huì)返回此任務(wù)的任務(wù)句柄,這個(gè)句柄其實(shí)就是任務(wù)的任務(wù)堆棧。此參數(shù)就用來保存這個(gè)任務(wù)句柄。其他API函數(shù)可能會(huì)使用到這個(gè)句柄。

返回值:

  • pdPASS:任務(wù)創(chuàng)建成功。pdPASS宏定義為1
  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任務(wù)創(chuàng)建失敗,因?yàn)?strong style="color:rgb(68,17,12);">堆內(nèi)存不足!

在創(chuàng)建一個(gè)任務(wù)時(shí)一般都會(huì)在程序開頭都有這三個(gè)宏定義

cc7db382-cd96-11ec-bce3-dac502259ad0.png

要指定任務(wù)的優(yōu)先級(jí)、任務(wù)的棧大小,以及任務(wù)的句柄。

優(yōu)先級(jí)很好理解,它決定了多個(gè)任務(wù)之間執(zhí)行任務(wù)的先后順序,任務(wù)的棧大小也很理解,在創(chuàng)建任務(wù)時(shí),任務(wù)的局部變量以及任務(wù)切換時(shí)的數(shù)據(jù)都保存在棧里面。那么任務(wù)句柄是怎么一回事,它保存的是任務(wù)控制塊的首地址。那么它又是如何來保存任務(wù)的首地址呢?這就是我們今天要討論的話題。

cc931f38-cd96-11ec-bce3-dac502259ad0.png

創(chuàng)建任務(wù)是時(shí)傳入的是一個(gè)指針?

是一個(gè)指針嗎?

不是,是一個(gè)指針的指針。

為什么要傳入指針的指針?

什么是指針的指針?

這些問題都需要搞明白你才能解決這個(gè)問題?

二、二級(jí)指針

正好前兩天看到了這樣一篇文章,里面有一道C語言的題可以引用來解釋我們今天的問題,我們一起來看一下

ccc85c2a-cd96-11ec-bce3-dac502259ad0.png

上面這個(gè)代碼有好幾處錯(cuò)誤,它的目的很簡(jiǎn)單,就是想把字符串hello world拷貝給str,但是它能拷貝成功嗎?

cce61c7e-cd96-11ec-bce3-dac502259ad0.png

很顯然是不可以的。

為了使大家看的更清楚,代碼簡(jiǎn)單修改一下

#include
#include
#include

voidgetmemory(char*p)
{
p=(char*)malloc(100);
strcpy(p,"www.zhiguoxin.cn");
printf("*p:%s&(*p):0x%x
",p,&p);
}
intmain()
{
char*str="www.baidu.cn";
getmemory(str);
printf("str:%s&str:0x%x
",str,&str);
free(str);
return0;
}

按照我們一般人的的想法,結(jié)果應(yīng)該是:

p:www.zhiguoxin.cn&p:xxxxxxx
str:www.zhiguoxin.cn&str:xxxxxxx

但是實(shí)際上結(jié)果是多少?

cd01f5f2-cd96-11ec-bce3-dac502259ad0.png

完全沒有變化,為了徹底解決這個(gè)問題,畫了一個(gè)圖,希望大家能夠看的更加清楚一點(diǎn)。

cd224b22-cd96-11ec-bce3-dac502259ad0.png

從這里可以看出來,在分配內(nèi)存后,strp就分道揚(yáng)鑣了,而str也還是指向www.baidu.cn

如何修改呢?正確的是啥樣的?

#include
#include
#include

voidgetmemory(char**p)
{
*p=(char*)malloc(100);
strcpy(*p,"www.zhiguoxin.cn");
printf("*p:%s&(*p):0x%x
",*p,&(*p));
}
intmain()
{
char*str="www.baidu.cn";
getmemory(&str);
printf("str:%s&str:0x%x
",str,&str);
free(str);
return0;
}

編譯運(yùn)行,發(fā)現(xiàn)沒問題。

cd3d40ee-cd96-11ec-bce3-dac502259ad0.png

達(dá)到了我們想要的目的,字符串也得到了正常的拷貝。

如何解釋?

函數(shù)中參數(shù)都是傳值,傳指針本質(zhì)上也是傳值,只不過它的值是指針類型罷了。如果想要改變?nèi)雲(yún)?nèi)容,則需要傳該入?yún)⒌牡刂罚ㄟ^解引用修改其指向的內(nèi)容。

這里的str的值就是*p的值,是多少?它們都是一個(gè)指針,就是保存的是一個(gè)地址,地址是多少?地址就是使用動(dòng)態(tài)分配內(nèi)存malloc函數(shù)分配的100字節(jié)的首地址。然后又使用strcpy()函數(shù)將hello world拷貝到*p里面。

這里面就涉及到了二級(jí)指針,首先str毫無疑問是一個(gè)指針變量對(duì)吧?那么&str是啥?理所當(dāng)然就是一個(gè)指針的指針吧,就是地址的地址。

所以,我如果在某個(gè)地方申請(qǐng)了一塊內(nèi)存,如果想得到這塊內(nèi)存的首地址,而此時(shí)我們又定義了一個(gè)指針變量,想讓這個(gè)指針來保存我們申請(qǐng)內(nèi)存你的首地址,就必須要傳入這個(gè)指針的地址,即指針的指針(二級(jí)指針)而不是傳入這個(gè)指針。

至于原因上面的例子已經(jīng)非常清楚的講解了原因。

下面接著回到我們最開始的創(chuàng)建函數(shù)的任務(wù)句柄。在開始之前我們?cè)侔焉厦娴暮瘮?shù)封裝一下。

cd5b026e-cd96-11ec-bce3-dac502259ad0.png
#include
#include
#include

typedefchar*TaskHandle_t;

voidgetmemory(TaskHandle_t*p)
{
*p=(char*)malloc(100);
strcpy(*p,"www.zhiguoxin.cn");
printf("*p:%s&(*p):0x%x
",*p,&(*p));
}
intmain()
{
TaskHandle_tstr;
getmemory(&str);
printf("str:%s&str:0x%x
",str,&str);
free(str);
return0;
}

沒啥大不了的,就是就是給char*起了一個(gè)別名而已,讓下面的代碼看起來更加順暢一寫。

cd6d9c9e-cd96-11ec-bce3-dac502259ad0.png

這樣對(duì)比一下是不是很清楚了呢?這樣一來我們創(chuàng)建任務(wù)時(shí)候這個(gè)任務(wù)句柄就保存的是我們TCB控制塊這個(gè)結(jié)構(gòu)體的首地址了,知道了一個(gè)任務(wù)的TCB控制塊首地址的話,那么這個(gè)任務(wù)的所有信息我是不是都知道了。是的,就是這么奇妙。通過指針的指針,二級(jí)指針來轉(zhuǎn)換一下。

審核編輯 :李倩


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

    關(guān)注

    0

    文章

    182

    瀏覽量

    19794
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62274
  • 變量
    +關(guān)注

    關(guān)注

    0

    文章

    613

    瀏覽量

    28425

原文標(biāo)題:干貨|FreeRTOS中的任務(wù)句柄到底是什么意思?

文章出處:【微信號(hào):電子工程世界,微信公眾號(hào):電子工程世界】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    Laird Eccosorb吸波材料的應(yīng)用案例

    抑制Retimer芯片在22GHz的雜訊是一回事,準(zhǔn)確提供所需解決方案的理想特征參數(shù)又是另外一回事。閱讀下文,了解家全球網(wǎng)絡(luò)技術(shù)制造商如何在對(duì)比九種不同的仿真結(jié)果后,最終選擇Laird Eccosorb GDS(經(jīng)過萊爾德實(shí)驗(yàn)
    的頭像 發(fā)表于 10-24 09:55 ?437次閱讀
    Laird Eccosorb吸波材料的應(yīng)用案例

    儲(chǔ)能變流器和光儲(chǔ)體化變流器是一回事嗎?

    我搜百度講儲(chǔ)能變流器又稱為雙向變流器,混合逆變器和光儲(chǔ)體化變流器是個(gè)東西嗎?
    發(fā)表于 09-11 15:27

    功放和運(yùn)放到底是什么區(qū)別?

    想請(qǐng)問下功放和運(yùn)放到底是什么區(qū)別,感覺只要接個(gè)小負(fù)載,運(yùn)放的輸出電流也可以很大???到底有什么區(qū)別啊
    發(fā)表于 09-10 07:00

    運(yùn)放的輸入電容到底是什么?

    我想請(qǐng)問下運(yùn)放的輸入電容到底是什么?
    發(fā)表于 09-04 06:52

    使用Tina ti仿真ths3201時(shí),發(fā)生源兩路輸入則輸出不對(duì)是怎么回事

    使用Tina ti仿真ths3201時(shí),發(fā)生源兩路輸入則輸出不對(duì),單路輸入結(jié)果卻正確。另外,我下載該仿真模型時(shí),模型沒有更新,因?yàn)楦轮?,ths3201無效,無法正常仿真。請(qǐng)問這是怎么一回事呢?
    發(fā)表于 08-14 06:21

    塊板子上,摘取焊接了四次不同的比較器,比較器型號(hào)都是tlv3702,相同測(cè)試條件但結(jié)果卻不同,為什么?

    測(cè)試,在該板上摘取焊接了四個(gè)同型號(hào)比較器,四次測(cè)試結(jié)果偏差很大,且我自己排除了焊接問題,求問這是怎么一回事;個(gè)人猜測(cè)這幾個(gè)比較器的功耗不同,只有功耗極低的比較器才能達(dá)到電路的理論輸出,輸出電壓低的,功耗大,如果是我猜測(cè)的這個(gè)原因,那是不是我買的是假貨;如果不是,請(qǐng)問有別的什么原因嗎?
    發(fā)表于 08-06 06:14

    傳感器和變送器是一回事?變送器和傳感器有什么差異

    變送器和傳感器有什么差異 變送器和傳感器在測(cè)量與控制系統(tǒng)中的角色不同,各自有其特定的功能和應(yīng)用場(chǎng)景。下面是詳細(xì)的對(duì)比 1. 定義 傳感器: 傳感器是種檢測(cè)裝置,能感受到被測(cè)量的信息,并能將檢測(cè)
    的頭像 發(fā)表于 06-20 08:46 ?1380次閱讀

    數(shù)字工廠與智能工廠是一回事

    本文旨在探討數(shù)字工廠與智能工廠的概念、特點(diǎn)、技術(shù)應(yīng)用及其在現(xiàn)代制造業(yè)中的作用。 、引言 隨著科技的不斷進(jìn)步,制造業(yè)正經(jīng)歷著前所未有的變革。數(shù)字工廠和智能工廠作為現(xiàn)代制造業(yè)的兩個(gè)重要概念,正逐漸
    的頭像 發(fā)表于 06-07 15:10 ?696次閱讀

    用STM8L152使用個(gè)矩陣鍵盤,信號(hào)直處于低電平狀態(tài)的原因?

    想用STM8L152 使用個(gè)矩陣鍵盤,根據(jù)的是行列掃描的方法,但是代碼調(diào)試過程中只能檢測(cè)到列的信號(hào)(高低電平)的變化,信號(hào)直處于低電平狀態(tài),這是怎么一回事?哪里出問題了?
    發(fā)表于 05-15 08:31

    共享單車到底是什么通信原理

    我們經(jīng)常騎的共享單車到底是什么通信原理,有人了解過嗎? 、智能車鎖 共享單車最核心的硬件是智能車鎖,主要用于實(shí)現(xiàn)控制和定位功能。
    發(fā)表于 04-09 10:33 ?881次閱讀
    共享單車<b class='flag-5'>到底是</b>什么通信原理

    電機(jī)驅(qū)動(dòng)芯片和電機(jī)控制芯片是一回事

    電機(jī)驅(qū)動(dòng)芯片和電機(jī)控制芯片在電機(jī)系統(tǒng)中各自扮演著重要的角色,但它們并不是一回事
    的頭像 發(fā)表于 04-08 11:15 ?1723次閱讀

    共享單車到底是什么通信原理?

    我們經(jīng)常騎的共享單車到底是什么通信原理,有人了解過嗎?下面寶藍(lán)小編就帶大家了解下。
    的頭像 發(fā)表于 02-25 10:32 ?1461次閱讀
    共享單車<b class='flag-5'>到底是</b>什么通信原理?

    電機(jī)和馬達(dá)是一回事嗎 馬達(dá)和電機(jī)有什么區(qū)別

    電機(jī)和馬達(dá)是一回事嗎 馬達(dá)和電機(jī)有什么區(qū)別 電機(jī)和馬達(dá)是一回事嗎? 電機(jī)和馬達(dá)是同個(gè)名詞的不同表達(dá)方式。在些地區(qū),特別是中國,人們更傾向于使用“電機(jī)”來指代電動(dòng)機(jī),而在其他地區(qū)則更
    的頭像 發(fā)表于 02-03 09:19 ?1.1w次閱讀

    SMT生產(chǎn)過程中拋料是怎么一回事呢?具體需要怎么解決?

    在SMT工廠,生產(chǎn)過程中經(jīng)常會(huì)遇到拋料的情況,甚至有時(shí)候拋料會(huì)非常嚴(yán)重,影響到生產(chǎn)效率,那么拋料是怎么一回事呢?具體需要怎么解決?
    的頭像 發(fā)表于 01-24 10:42 ?2993次閱讀

    M453VG6AE中ISP Flash和LDROM是不是一回事?它們基地址分別是什么?

    M453VG6AE芯片中 ISP Flash 和 LDROM 是不是一回事?它們基地址分別是什么?
    發(fā)表于 01-17 06:31