日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...

發(fā)布時(shí)間:2023/12/2 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2.FREERTOS任務(wù)創(chuàng)建、內(nèi)核鏈表初始化

硬件環(huán)境:cortex m4

FreeRTOS版本:v8.0.1

今天開始閱讀freertos,閱讀同時(shí)做下筆記,等哪天碰到移植問題再翻出來看看。

2.1 任務(wù)、鏈表結(jié)構(gòu)體

源碼中使用tskTCB來存儲一個任務(wù)的所有信息,xLIST存儲內(nèi)核鏈表數(shù)據(jù)。一個系統(tǒng)最基本的功能是它的任務(wù)調(diào)度,在任務(wù)切換時(shí)最重要的則是內(nèi)核鏈表,用圖描述下這兩個結(jié)構(gòu)體,這樣看起來比代碼更清晰。(TCB中有省略成員)

(TCB結(jié)構(gòu)體)

-------------------------------------------------分割線----------------------------------------------------

(LIST結(jié)構(gòu)體)

一個TCB中包含了兩個xLIST_ITEM作為鏈表節(jié)點(diǎn),操作xLIST_ITEM中的指針指向既為控制一個任務(wù)進(jìn)出某個鏈表。相比xLIST_ITEM,在xLIST中使用了精簡版的結(jié)點(diǎn)xMINI_LIST_ITEM。

2.2 xTaskGeneEricCreate 任務(wù)創(chuàng)建流程分析

xTaskGeneEricCreate 函數(shù)用來創(chuàng)建一個新任務(wù),在調(diào)度器啟動前和啟動后都可以創(chuàng)建。

Freertos在調(diào)度器啟動后至少會有一個任務(wù)(IDLE)處于準(zhǔn)備調(diào)度狀態(tài),即使開發(fā)者不去創(chuàng)建自己的任務(wù)。

xTaskGeneEricCreate源碼流程:(拖動可以放大圖片)

(任務(wù)創(chuàng)建流程圖)

2.2.1 prvAllocateTCBAndStack 分配空間

Freertos使用pvPortMalloc在堆上分配一塊TCB大小的內(nèi)存空間,分配成功后還要使用pvPortMalloc分配一塊內(nèi)存,當(dāng)做任務(wù)運(yùn)行所需要的棧空間。這些空間直到任務(wù)被刪除時(shí)才會得到釋放。

在棧分配時(shí)有參數(shù)判斷,若創(chuàng)建任務(wù)時(shí)有傳入的棧地址則放棄分配。

分配的棧內(nèi)存總大小為棧深度(傳入?yún)?shù))與棧寬度乘積。

2.2.2 prvInitialiseTCBVariables 執(zhí)行初始化

prvInitialiseTCBVariables函數(shù)中主要執(zhí)行了任務(wù)名字拷貝、優(yōu)先級保存、兩個鏈表節(jié)點(diǎn)初始化。

下圖表示TCB中節(jié)點(diǎn)和鏈表初始化后指針指向

(鏈表及TCB初始化后)

2.2.3 pxPortInitialiseStack 執(zhí)行”壓棧”

pxPortInitialiseStack函數(shù)執(zhí)行的代碼非常奇特,一開始完全無法理解,還好在葵花寶典找到了da案,神書!引用M3權(quán)威指南上一句翻譯:響應(yīng)異常的第一個步驟是保存現(xiàn)場,硬件自動壓棧,壓棧后內(nèi)存分布:

再對比看下pxPortInitialiseStack源碼:

對比下兩者動作,這個函數(shù)是對任務(wù)棧進(jìn)行了一些處理,并且是模仿異(中斷)常發(fā)生時(shí)所產(chǎn)生的動作。為什么一定要模仿異常進(jìn)行壓棧,首先扯一下freertos任務(wù)調(diào)度工作的大致流程:

當(dāng)一個任務(wù)在運(yùn)行時(shí),還有一個內(nèi)部定時(shí)器(systick)在一直計(jì)數(shù),它的計(jì)數(shù)值和時(shí)鐘頻率比值可以看成為時(shí)間片。時(shí)間片到,中斷產(chǎn)生,中斷里進(jìn)行上下文切換也就是pxReadyTasksLists中的任務(wù)被依次調(diào)度。硬件進(jìn)入中斷時(shí)便會自動壓棧,不需要我們處理。中斷處理完成后到中斷返回時(shí)硬件還會自動出棧,還原進(jìn)入異常前的狀態(tài)。進(jìn)中斷時(shí)壓入的那些寄存器值都被一一出棧 如:PC、R0、等寄存器。這樣pxPortInitialiseStack函數(shù)就好理解了,它先對新創(chuàng)建的任務(wù)進(jìn)行手動壓棧,還多包括了R4-R11,那么在調(diào)度中斷結(jié)束后這些手動壓入的值將被自動出棧,進(jìn)而使新任務(wù)運(yùn)行起來。

PC位置是傳入的任務(wù)主程序句柄地址,也就是我們要任務(wù)執(zhí)行的主要程序,LR(返回寄存器)的位置是prvTaskExitError函數(shù)地址,這個函數(shù)里是一個for死循環(huán)加錯誤信息打印,也就是一個任務(wù)永遠(yuǎn)不應(yīng)從它的主程序中跳出,如果跳出則進(jìn)入prvTaskExitError函數(shù)打印錯誤。一般任務(wù)句柄里都會用for(;;)把它寫死永遠(yuǎn)循環(huán)執(zhí)行,需要退出時(shí)要將該任務(wù)delete掉。

2.3 pxReadyTasksLists鏈表

一個TCB創(chuàng)建并初始化完成后便開始插入pxReadyTasksLists等待被調(diào)度。pxReadyTasksLists鏈表是一個數(shù)組,優(yōu)先級最大數(shù)決定它的大小。一個處于空閑狀態(tài)的TCB(準(zhǔn)備好被調(diào)度)在插入時(shí)是an照優(yōu)先級作為索引插入的,這里說TCB插入不太準(zhǔn)確,應(yīng)該是TCB上的鏈表節(jié)點(diǎn)插入鏈表。

舉個栗子,第一個任務(wù)插入空鏈表時(shí)的狀況:

看著有些凌亂的話再來張大意圖:

如果此時(shí)又有一個相同優(yōu)先級任務(wù)創(chuàng)建,鏈表變?yōu)?#xff1a;

簡略圖:

鏈表將節(jié)點(diǎn)依次連接,組成TCB鏈,調(diào)度器運(yùn)行時(shí)會an照需要遍歷鏈表進(jìn)而控制任務(wù)。

鏈表頭部都帶有index元素,一開始它指向鏈表本身,所以我們上面創(chuàng)建的任務(wù)都像是在尾插,事實(shí)上調(diào)度器運(yùn)行起來時(shí)新節(jié)點(diǎn)插入的位置由index決定。

圖解:

調(diào)度開始后index開始遍歷readylist,它指向第一個TCB時(shí),第一個TCB得到cpu資源開始運(yùn)行,變?yōu)?#xff1a;

注意紅色線條變化,此時(shí)如果動態(tài)創(chuàng)建了一個優(yōu)先級相同的任務(wù)TCB3,應(yīng)該把它插在哪里?如果插在TCB后面那對于TCB2來說是不公平的,因?yàn)槿思遗抨?duì)等待cpu的時(shí)間肯定比TCB3長,其實(shí)仔細(xì)考慮下插在鏈表頭部或尾部都是不規(guī)律的,只有利用index。Freertos將其插在TCB前面,以保證是當(dāng)前鏈表最后一個得到cpu資源的位置:

新TCB進(jìn)入鏈表,任務(wù)創(chuàng)建流程就快結(jié)束了。在程序尾部有些優(yōu)先級判斷,如果創(chuàng)建的任務(wù)比當(dāng)前運(yùn)行的任務(wù)優(yōu)先級要高則使能PendSV中斷。如果調(diào)度器是停止的則直接更改當(dāng)前TCB指針。

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎

總結(jié)

以上是生活随笔為你收集整理的esp32 怎么分配freertos 堆栈大小_深度解剖~ FreeRtos阅读笔记2 任务创建、内核链表初始化...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。