在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

3天內不再提示

FreeRTOS之任務句柄

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

摘要:學過用過FreeRTOS的人都知道,在創建任務時候我們都要定義一個任務句柄,這個任務句柄有啥含義?書上的解釋是任務創建成功以后會返回此任務的任務句柄,這個句柄就是任務的堆棧。此參數就用來保存這個任務句柄。其他API函數可能會使用到這個句柄。

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

1、創建一個任務

動態創建一個任務

#defineTASK1_TASK_PRIO1//任務優先級
#defineTASK1_STK_SIZE128//任務棧大小
TaskHandle_tTask1Task_Handler;//任務句柄
//動態創建一個任務1
xTaskCreate((TaskFunction_t)task1_task,//任務函數
(constchar*)"task1_task",//任務名稱
(uint16_t)TASK1_STK_SIZE,//任務堆棧大小
(void*)NULL,//傳遞給任務函數的參數
(UBaseType_t)TASK1_TASK_PRIO,//任務優先級
(TaskHandle_t*)&Task1Task_Handler);//任務句柄

//task1任務函數
voidtask1_task(void*pvParameters)
{
for(;;)
{
vTaskDelay(2000);
}
}
FreeRTOS之任務句柄

參數:

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

返回值:

  • pdPASS:任務創建成功。pdPASS宏定義為1
  • errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY:任務創建失敗,因為堆內存不足!

在創建一個任務時一般都會在程序開頭都有這三個宏定義

FreeRTOS之任務句柄

要指定任務的優先級、任務的棧大小,以及任務的句柄。

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

FreeRTOS之任務句柄

創建任務是時傳入的是一個指針?

是一個指針嗎?

不是,是一個指針的指針。

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

什么是指針的指針?

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

二、二級指針

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

FreeRTOS之任務句柄

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

FreeRTOS之任務句柄

很顯然是不可以的。

為了使大家看的更清楚,代碼簡單修改一下

#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;
}

按照我們一般人的的想法,結果應該是:

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

但是實際上結果是多少?

FreeRTOS之任務句柄

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

FreeRTOS之任務句柄

從這里可以看出來,在分配內存后,strp就分道揚鑣了,而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;
}

編譯運行,發現沒問題。

FreeRTOS之任務句柄

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

如何解釋?

函數中參數都是傳值,傳指針本質上也是傳值,只不過它的值是指針類型罷了。如果想要改變入參內容,則需要傳該入參的地址,通過解引用修改其指向的內容

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

這里面就涉及到了二級指針,首先str毫無疑問是一個指針變量對吧?那么&str是啥?理所當然就是一個指針的指針吧,就是地址的地址。

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

至于原因上面的例子已經非常清楚的講解了原因。

下面接著回到我們最開始的創建函數的任務句柄。在開始之前我們再把上面的函數封裝一下。

FreeRTOS之任務句柄
#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*起了一個別名而已,讓下面的代碼看起來更加順暢一寫。

FreeRTOS之任務句柄

這樣對比一下是不是很清楚了呢?這樣一來我們創建任務時候這個任務句柄就保存的是我們TCB控制塊這個結構體的首地址了,知道了一個任務的TCB控制塊首地址的話,那么這個任務的所有信息我是不是都知道了。是的,就是這么奇妙。通過指針的指針,二級指針來轉換一下。

原文標題:干貨 | FreeRTOS中的任務句柄到底是什么意思?

文章出處:【微信公眾號:電子工程世界】歡迎添加關注!文章轉載請注明出處。

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

    關注

    3

    文章

    4363

    瀏覽量

    63782
  • FreeRTOS
    +關注

    關注

    12

    文章

    485

    瀏覽量

    63403
  • 任務
    +關注

    關注

    1

    文章

    20

    瀏覽量

    8610

原文標題:干貨 | FreeRTOS中的任務句柄到底是什么意思?

文章出處:【微信號:電子工程世界,微信公眾號:電子工程世界】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    FreeRTOS介紹與基礎任務創建

    本篇介紹FreeRTOS與基礎任務創建
    的頭像 發表于 09-26 09:00 ?2788次閱讀
    <b class='flag-5'>FreeRTOS</b>介紹與基礎<b class='flag-5'>任務</b>創建

    FreeRTOS中的任務管理

    任務FreeRTOS 中最基本的調度單元,它是一段可執行的代碼,可以獨立運行。FreeRTOS 中的任務是基于優先級的搶占式調度,優先級高的任務
    的頭像 發表于 11-27 17:03 ?1207次閱讀

    任務句柄任務優先級區別是什么

    以前在學ucos時候,說優先級才是任務的唯一ID,用來區分任務的,現在又學了freeRTOS任務句柄才是區分
    發表于 07-18 08:00

    什么是任務句柄

    啥是任務句柄啊,能簡單點解釋下嗎?
    發表于 07-18 08:00

    FreeRTOS任務通知相關資料分享

    FreeRTOS--任務通知Notification今天發現了一個奇怪的現象,特意把它記錄下來,防止忘記了。先上圖于是找了所有的任務句柄,真的是沒有操作掛起了這個
    發表于 01-21 12:07

    FreeRTOS任務應用函數介紹

    任務應用函數是一組輔助類函數,一般用于調試信息輸出、獲取任務句柄、獲取任務狀態、操作任務標簽值等等。 1. 獲取
    的頭像 發表于 03-19 10:22 ?2751次閱讀

    (一)FreeRTOS學習FreeRTOS任務基礎知識

    FreeRTOS學習FreeRTOS任務基礎知識轉行小白一枚,通過博客記錄自我學習,望更多博友多多指點,感激不盡!RTOS系統的核心就是任務
    發表于 12-23 19:57 ?3次下載
    (一)<b class='flag-5'>FreeRTOS</b>學習<b class='flag-5'>之</b><b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務</b>基礎知識

    FreeRTOS任務詳解

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

    圖解FreeRTOS 原理系列任務管理器基本框架

    [導讀] 學習梳理一下FreeRTOS任務管理單元實現思路,代碼分析基于V10.4.3。從本文開始計劃寫個圖解freeRTOS內核系列筆記分享給朋友們,...
    發表于 01-25 19:49 ?5次下載
    圖解<b class='flag-5'>FreeRTOS</b> 原理系列<b class='flag-5'>之</b><b class='flag-5'>任務</b>管理器基本框架

    FreeRTOS高級篇4---FreeRTOS任務切換分析

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

    FreeRTOS高級篇2---FreeRTOS任務創建分析

    FreeRTOS基礎系列《FreeRTOS系列第10篇---FreeRTOS任務創建和刪除》中介紹了任務創建API函數xTaskCreat
    發表于 01-26 17:42 ?23次下載
    <b class='flag-5'>FreeRTOS</b>高級篇2---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務</b>創建分析

    FreeRTOS系列第12篇---FreeRTOS任務應用函數

    任務應用函數是一組輔助類函數,一般用于調試信息輸出、獲取任務句柄、獲取任務狀態、操作任務標簽值等等。
    發表于 01-26 17:53 ?2次下載
    <b class='flag-5'>FreeRTOS</b>系列第12篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>任務</b>應用函數

    一文解讀FreeRTOS任務內存設置的大小

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

    freeRTOS任務

    freeRTOS系統的任務切換的具體過程最終都是在pendSV中斷服務函數里面完成的。
    的頭像 發表于 02-10 11:02 ?1872次閱讀
    <b class='flag-5'>freeRTOS</b>的<b class='flag-5'>任務</b>

    FreeRTOS任務通知簡介

    任務通知簡介 任務通知在 FreeRTOS 中是一個可選的功能,要使用任務通知的話就需要將宏configUSE_TASK_NOTIFICATIONS 定義為 1。
    的頭像 發表于 07-30 11:34 ?888次閱讀
    主站蜘蛛池模板: 国产色爽免费视频 | 欧美一区二区不卡视频 | 日本不卡视频在线观看 | 国产农村妇女毛片精品久久久 | 国语自产拍在线观看7m | 免费视频现线观看 | ass日本69| 日本三级a | 韩国三级hd | 乱肉情欲杂乱小说 | 国产资源在线视频 | 天堂视频在线观看 | 亚洲三级在线视频 | 天天色图片 | 午夜影院免费入口 | 天堂8资源在线官网资源 | 天天综合天天看夜夜添狠狠玩 | 精品国产1000部91麻豆 | 成人综合激情 | 四虎www成人影院观看 | 天天噜天天干 | 综合网 色天使 | 日本口工禁漫画无遮挡全彩 | 国产怡红院 | 日韩一级片在线免费观看 | 青娱乐99| 天堂成人在线 | 一级特黄aaa免费 | 韩日毛片| 911精品国产91久久久久 | 免费一级毛毛片 | 91天天干| 日本三级网站在线观看 | 91福利国产在线观看网站 | 成人久久久 | 黄色短视频免费看 | 久久婷婷影院 | 欧美黄色一级视频 | 黄网观看 | 天天综合天天做 | 免费大片黄日本在线观看 |