在使用μC/OS的多任務應用程序中,main()啟動后首先使用系統C棧,在OS啟動后使用任務棧。
基于μC/OS-II或μC/OS-III編寫應用代碼時,用戶必須為每個任務聲明一個堆棧,用于任務運行現場及保存任務上下文(CPU寄存器)。在多任務處理開始之前執行的C代碼將使用C棧。只有當應用程序的第一個任務開始運行時,棧才會從C棧中轉移到任務棧。
不同的微控制器棧的實現也不同,許多32位處理器支持多個棧。例如,ARM Cortex-M內核有兩個棧指針,分別指向主棧和進程棧。在基于μC/OS-III的應用中,多任務開始前使用主堆棧,其空間為鏈接命令文件中定義的堆棧區域。當應用程序調用OSStart()函數啟動多任務時,進程堆棧指針被設置為第一個任務堆棧的棧頂地址,并修改控制寄存器,使任務開始運行時使用該堆棧。同時,主堆棧指針被用來指向μC/OS-III的中斷堆棧OSCfg_ISRStk[]。后續多任務系統運行過程中,此堆棧將專門用于中斷和異常處理程序。多任務啟動后,C堆棧會丟失,導致嵌入式應用中可用的RAM量減少,在資源有限的應用中,可以重用C堆棧空間,用于任務堆棧,具體實現可以參考文章:技術小課堂| μC/OS-III的應用中CSTACK重用
由于main()對C堆棧的依賴,必須確保為這個堆棧留出足夠的空間。如上所述,μC/OS-III用戶還必須知道OSCfg_ISRStk[]棧的大小。OSCfg_ISRStk[]是一個數組,類似于任務堆棧,其大小由內核配置常量OS_CFG_ISR_STK_SIZE決定。另一方面,C堆棧的大小通常直接提供給鏈接器,因此在不同開發環境中對該堆棧進行更改的方法是不一樣的。
在Segger Embedded Studio中,Cortex-M的應用中main()使用的堆棧通常被命名為stack,可以通過工程options菜單進行堆棧配置,無需直接更改鏈接器文件。
如果基于μC/OS-III官方示例工程開發,通常不需要修改C棧的大小。這些工程已為main()的執行分配了足夠的空間。不過,中斷堆棧大小的定義OS_CFG_ISR_STK_SIZE可能需要進行一些調整。對于使用獨立中斷堆棧的應用,如果不在中斷處理程序增加復雜的函數調用,示例的默認大小即可滿足需求。
基于μC/OS構建的系統在main()運行過程中依賴C堆棧,一旦調用OSStart()后,系統就切換到任務堆棧,以便開始多任務處理。
審核編輯 :李倩
-
微控制器
+關注
關注
48文章
7496瀏覽量
151083 -
寄存器
+關注
關注
31文章
5325瀏覽量
120052 -
堆棧
+關注
關注
0文章
182瀏覽量
19734 -
應用程序
+關注
關注
37文章
3245瀏覽量
57614
原文標題:多任務系統中的堆棧使用
文章出處:【微信號:麥克泰技術,微信公眾號:麥克泰技術】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論