在使用μC/OS的多任務(wù)應(yīng)用程序中,main()啟動(dòng)后首先使用系統(tǒng)C棧,在OS啟動(dòng)后使用任務(wù)棧。
基于μC/OS-II或μC/OS-III編寫(xiě)應(yīng)用代碼時(shí),用戶必須為每個(gè)任務(wù)聲明一個(gè)堆棧,用于任務(wù)運(yùn)行現(xiàn)場(chǎng)及保存任務(wù)上下文(CPU寄存器)。在多任務(wù)處理開(kāi)始之前執(zhí)行的C代碼將使用C棧。只有當(dāng)應(yīng)用程序的第一個(gè)任務(wù)開(kāi)始運(yùn)行時(shí),棧才會(huì)從C棧中轉(zhuǎn)移到任務(wù)棧。
不同的微控制器棧的實(shí)現(xiàn)也不同,許多32位處理器支持多個(gè)棧。例如,ARM Cortex-M內(nèi)核有兩個(gè)棧指針,分別指向主棧和進(jìn)程棧。在基于μC/OS-III的應(yīng)用中,多任務(wù)開(kāi)始前使用主堆棧,其空間為鏈接命令文件中定義的堆棧區(qū)域。當(dāng)應(yīng)用程序調(diào)用OSStart()函數(shù)啟動(dòng)多任務(wù)時(shí),進(jìn)程堆棧指針被設(shè)置為第一個(gè)任務(wù)堆棧的棧頂?shù)刂?,并修改控制寄存器,使任?wù)開(kāi)始運(yùn)行時(shí)使用該堆棧。同時(shí),主堆棧指針被用來(lái)指向μC/OS-III的中斷堆棧OSCfg_ISRStk[]。后續(xù)多任務(wù)系統(tǒng)運(yùn)行過(guò)程中,此堆棧將專門(mén)用于中斷和異常處理程序。多任務(wù)啟動(dòng)后,C堆棧會(huì)丟失,導(dǎo)致嵌入式應(yīng)用中可用的RAM量減少,在資源有限的應(yīng)用中,可以重用C堆棧空間,用于任務(wù)堆棧,具體實(shí)現(xiàn)可以參考文章:技術(shù)小課堂| μC/OS-III的應(yīng)用中CSTACK重用
由于main()對(duì)C堆棧的依賴,必須確保為這個(gè)堆棧留出足夠的空間。如上所述,μC/OS-III用戶還必須知道OSCfg_ISRStk[]棧的大小。OSCfg_ISRStk[]是一個(gè)數(shù)組,類似于任務(wù)堆棧,其大小由內(nèi)核配置常量OS_CFG_ISR_STK_SIZE決定。另一方面,C堆棧的大小通常直接提供給鏈接器,因此在不同開(kāi)發(fā)環(huán)境中對(duì)該堆棧進(jìn)行更改的方法是不一樣的。
在Segger Embedded Studio中,Cortex-M的應(yīng)用中main()使用的堆棧通常被命名為stack,可以通過(guò)工程options菜單進(jìn)行堆棧配置,無(wú)需直接更改鏈接器文件。
如果基于μC/OS-III官方示例工程開(kāi)發(fā),通常不需要修改C棧的大小。這些工程已為main()的執(zhí)行分配了足夠的空間。不過(guò),中斷堆棧大小的定義OS_CFG_ISR_STK_SIZE可能需要進(jìn)行一些調(diào)整。對(duì)于使用獨(dú)立中斷堆棧的應(yīng)用,如果不在中斷處理程序增加復(fù)雜的函數(shù)調(diào)用,示例的默認(rèn)大小即可滿足需求。
基于μC/OS構(gòu)建的系統(tǒng)在main()運(yùn)行過(guò)程中依賴C堆棧,一旦調(diào)用OSStart()后,系統(tǒng)就切換到任務(wù)堆棧,以便開(kāi)始多任務(wù)處理。
審核編輯 :李倩
-
微控制器
+關(guān)注
關(guān)注
48文章
7932瀏覽量
154022 -
寄存器
+關(guān)注
關(guān)注
31文章
5430瀏覽量
123914 -
堆棧
+關(guān)注
關(guān)注
0文章
183瀏覽量
20078 -
應(yīng)用程序
+關(guān)注
關(guān)注
38文章
3328瀏覽量
58875
原文標(biāo)題:多任務(wù)系統(tǒng)中的堆棧使用
文章出處:【微信號(hào):麥克泰技術(shù),微信公眾號(hào):麥克泰技術(shù)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
多任務(wù)處理卡頓頻發(fā),無(wú)風(fēng)扇工控機(jī)如何優(yōu)化性能?聚徽廠家一文讀懂
快速入門(mén)——LuatOS:sys庫(kù)多任務(wù)管理實(shí)戰(zhàn)攻略!

AGV監(jiān)控與任務(wù)管理系統(tǒng)設(shè)計(jì)

BEVFusion —面向自動(dòng)駕駛的多任務(wù)多傳感器高效融合框架技術(shù)詳解

MCU在車載系統(tǒng)中的展望
使用任務(wù)通知提高RTOS應(yīng)用的效率
AUTOSAR中通信堆棧的配置 AUTOSAR通信模塊測(cè)試方法
航電實(shí)時(shí)測(cè)試系統(tǒng)解決方案

自動(dòng)發(fā)電控制系統(tǒng)的基本任務(wù)
freertos最多支持多少個(gè)任務(wù)
堆棧和內(nèi)存的基本知識(shí)

如何使用Polyspace Code Prover來(lái)統(tǒng)計(jì)堆棧

評(píng)論