吴忠躺衫网络科技有限公司

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

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

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

FreeRTOS之任務(wù)句柄

h1654155149.6853 ? 來(lái)源:果果小師弟 ? 作者:智果君 ? 2022-04-13 08:18 ? 次閱讀

摘要:學(xué)過(guò)用過(guò)FreeRTOS的人都知道,在創(chuàng)建任務(wù)時(shí)候我們都要定義一個(gè)任務(wù)句柄,這個(gè)任務(wù)句柄有啥含義?書(shū)上的解釋是任務(wù)創(chuàng)建成功以后會(huì)返回此任務(wù)的任務(wù)句柄,這個(gè)句柄就是任務(wù)的堆棧。此參數(shù)就用來(lái)保存這個(gè)任務(wù)句柄。其他API函數(shù)可能會(huì)使用到這個(gè)句柄。

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

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);
}
}
FreeRTOS之任務(wù)句柄

參數(shù):

  • pxTaskCode:任務(wù)函數(shù)。
  • pcName:任務(wù)名字,一般用于追蹤和調(diào)試,任務(wù)名字長(zhǎng)度不能超過(guò)。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ù)就用來(lái)保存這個(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ì)在程序開(kāi)頭都有這三個(gè)宏定義

FreeRTOS之任務(wù)句柄

要指定任務(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ù)控制塊的首地址。那么它又是如何來(lái)保存任務(wù)的首地址呢?這就是我們今天要討論的話題

FreeRTOS之任務(wù)句柄

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

是一個(gè)指針嗎?

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

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

什么是指針的指針?

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

二、二級(jí)指針

正好前兩天在公眾號(hào)看到了這樣一篇文章,里面有一道C語(yǔ)言的題可以引用來(lái)解釋我們今天的問(wèn)題,我們一起來(lái)看一下

FreeRTOS之任務(wù)句柄

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

FreeRTOS之任務(wù)句柄

很顯然是不可以的。

為了使大家看的更清楚,代碼簡(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é)果是多少?

FreeRTOS之任務(wù)句柄

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

FreeRTOS之任務(wù)句柄

從這里可以看出來(lái),在分配內(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)沒(méi)問(wèn)題。

FreeRTOS之任務(wù)句柄

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

如何解釋?

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

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

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

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

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

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

FreeRTOS之任務(wù)句柄
#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;
}

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

FreeRTOS之任務(wù)句柄

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

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

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

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62969
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    484

    瀏覽量

    62395
  • 任務(wù)
    +關(guān)注

    關(guān)注

    1

    文章

    20

    瀏覽量

    8561

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    FreeRTOS介紹與基礎(chǔ)任務(wù)創(chuàng)建

    本篇介紹FreeRTOS與基礎(chǔ)任務(wù)創(chuàng)建
    的頭像 發(fā)表于 09-26 09:00 ?2495次閱讀
    <b class='flag-5'>FreeRTOS</b>介紹與基礎(chǔ)<b class='flag-5'>任務(wù)</b>創(chuàng)建

    FreeRTOS中的任務(wù)管理

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

    任務(wù)句柄任務(wù)優(yōu)先級(jí)區(qū)別是什么

    以前在學(xué)ucos時(shí)候,說(shuō)優(yōu)先級(jí)才是任務(wù)的唯一ID,用來(lái)區(qū)分任務(wù)的,現(xiàn)在又學(xué)了freeRTOS說(shuō)任務(wù)句柄才是區(qū)分
    發(fā)表于 07-18 08:00

    什么是任務(wù)句柄

    啥是任務(wù)句柄啊,能簡(jiǎn)單點(diǎn)解釋下嗎?
    發(fā)表于 07-18 08:00

    FreeRTOS任務(wù)通知相關(guān)資料分享

    FreeRTOS--任務(wù)通知Notification今天發(fā)現(xiàn)了一個(gè)奇怪的現(xiàn)象,特意把它記錄下來(lái),防止忘記了。先上圖于是找了所有的任務(wù)句柄,真的是沒(méi)有操作掛起了這個(gè)
    發(fā)表于 01-21 12:07

    FreeRTOS任務(wù)應(yīng)用函數(shù)介紹

    任務(wù)應(yīng)用函數(shù)是一組輔助類函數(shù),一般用于調(diào)試信息輸出、獲取任務(wù)句柄、獲取任務(wù)狀態(tài)、操作任務(wù)標(biāo)簽值等等。 1. 獲取
    的頭像 發(fā)表于 03-19 10:22 ?2625次閱讀

    (一)FreeRTOS學(xué)習(xí)FreeRTOS任務(wù)基礎(chǔ)知識(shí)

    FreeRTOS學(xué)習(xí)FreeRTOS任務(wù)基礎(chǔ)知識(shí)轉(zhuǎn)行小白一枚,通過(guò)博客記錄自我學(xué)習(xí),望更多博友多多指點(diǎn),感激不盡!RTOS系統(tǒng)的核心就是任務(wù)
    發(fā)表于 12-23 19:57 ?3次下載
    (一)<b class='flag-5'>FreeRTOS</b>學(xué)習(xí)<b class='flag-5'>之</b><b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>基礎(chǔ)知識(shí)

    FreeRTOS任務(wù)詳解

    詳細(xì)講解freeRTOS任務(wù)
    發(fā)表于 12-23 20:01 ?11次下載
    <b class='flag-5'>FreeRTOS</b>的<b class='flag-5'>任務(wù)</b>詳解

    圖解FreeRTOS 原理系列任務(wù)管理器基本框架

    [導(dǎo)讀] 學(xué)習(xí)梳理一下FreeRTOS任務(wù)管理單元實(shí)現(xiàn)思路,代碼分析基于V10.4.3。從本文開(kāi)始計(jì)劃寫(xiě)個(gè)圖解freeRTOS內(nèi)核系列筆記分享給朋友們,...
    發(fā)表于 01-25 19:49 ?4次下載
    圖解<b class='flag-5'>FreeRTOS</b> 原理系列<b class='flag-5'>之</b><b class='flag-5'>任務(wù)</b>管理器基本框架

    FreeRTOS高級(jí)篇4---FreeRTOS任務(wù)切換分析

    FreeRTOS任務(wù)相關(guān)的代碼大約占總代碼的一半左右,這些代碼都在為一件事情而努力,即找到優(yōu)先級(jí)最高的就緒任務(wù),并使獲得CPU運(yùn)行權(quán)。任...
    發(fā)表于 01-26 17:41 ?12次下載
    <b class='flag-5'>FreeRTOS</b>高級(jí)篇4---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>切換分析

    FreeRTOS高級(jí)篇2---FreeRTOS任務(wù)創(chuàng)建分析

    FreeRTOS基礎(chǔ)系列《FreeRTOS系列第10篇---FreeRTOS任務(wù)創(chuàng)建和刪除》中介紹了任務(wù)創(chuàng)建API函數(shù)xTaskCreat
    發(fā)表于 01-26 17:42 ?23次下載
    <b class='flag-5'>FreeRTOS</b>高級(jí)篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>創(chuàng)建分析

    FreeRTOS系列第12篇---FreeRTOS任務(wù)應(yīng)用函數(shù)

    任務(wù)應(yīng)用函數(shù)是一組輔助類函數(shù),一般用于調(diào)試信息輸出、獲取任務(wù)句柄、獲取任務(wù)狀態(tài)、操作任務(wù)標(biāo)簽值等等。
    發(fā)表于 01-26 17:53 ?2次下載
    <b class='flag-5'>FreeRTOS</b>系列第12篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務(wù)</b>應(yīng)用函數(shù)

    一文解讀FreeRTOS任務(wù)內(nèi)存設(shè)置的大小

    uxTaskGetStackHighWaterMark(任務(wù)句柄);//FreeRTOS使用此函數(shù),查看任務(wù)堆棧空間使用情況。任務(wù)堆棧的“高
    的頭像 發(fā)表于 09-14 15:47 ?5283次閱讀

    freeRTOS任務(wù)

    freeRTOS系統(tǒng)的任務(wù)切換的具體過(guò)程最終都是在pendSV中斷服務(wù)函數(shù)里面完成的。
    的頭像 發(fā)表于 02-10 11:02 ?1694次閱讀
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任務(wù)</b>

    FreeRTOS任務(wù)通知簡(jiǎn)介

    任務(wù)通知簡(jiǎn)介 任務(wù)通知在 FreeRTOS 中是一個(gè)可選的功能,要使用任務(wù)通知的話就需要將宏configUSE_TASK_NOTIFICATIONS 定義為 1。
    的頭像 發(fā)表于 07-30 11:34 ?780次閱讀
    必博备用网址| 大发888娱乐场下载com| 狮威百家乐官网娱乐平台| 大赢家娱乐| 百家乐代理打| 狮威百家乐官网娱乐城| 百家乐官网里和的作用| 大发888娱乐城官方| 真龙娱乐| 君怡百家乐的玩法技巧和规则 | 太阳城论坛| 博彩百家乐心得| 百家乐官网路单怎样| 百家乐官网赌的技巧| 大发888信誉888娱乐城| 百家乐贴| 网址百家乐官网的玩法技巧和规则 | 真人百家乐官网网西陆| bet365| 大丰收百家乐的玩法技巧和规则 | 沙龙国际| 电子百家乐官网假在线哪| 军事| 现金网开户送彩金| 公海百家乐的玩法技巧和规则| 百家乐从哪而来| 最新百家乐官网出千赌具| 故城县| 一起pk棋牌游戏大厅| 好运来百家乐的玩法技巧和规则| 百家乐赢钱海立方| 立博百家乐官网的玩法技巧和规则 | 百家乐作弊工具| 百家乐官网太阳城| 百家乐官网筹码桌| 百家乐总厂在哪里| 百家乐官网稳赢投资法| 丹阳棋牌游戏中心| 德州扑克官方下载| 威尼斯人娱乐平台最新地址| 百家乐道具扫描|