1. 程式人生 > >單片機爬坑記-02-資源緊缺

單片機爬坑記-02-資源緊缺

tex pac only -m 任務 輸出 kernel 查看 art

當下FreeRTOS得到了Keil、STM32Cube MX等開發環境的大力支持,很大程度上無需再考慮移植等底層問題,簡單設置後在代碼中直接調用即可。

不得不說,這是激動人心的,RTOS的各項特性所帶來的方便給予我們極大的誘惑,總覺得只要用好RTOS,我們能把單片機玩出各種花樣,再也不用考慮什麽全局變量、輪循順序、執行時長等惱人的問題,只要設置好優先級、信號量和任務參數,剩下的就可以安心於用代碼實現功能。

現實總是殘酷帥斃的!Keil中一堆“……axf: Error: L6406E: No space in execution regions with .ANY selector matching……”錯誤,能輕易的將人從“安心於用代碼實現功能”的美好幻想中拖到現實。

以Keil環境下,NuTiny-SDK-M051開發板為例,芯片是NuMicro M0516LDN,內核Cortex-M0,片上資源為主頻50MHz、Flash 64KB、RAM 4KB,Flash空間地址為0x0000_0000~0x000_FFFF,RAM空間地址為0x2000_0000~0x2000_0FFF(養成查看映射地址的好習慣,IDE環境中常能用上)。

實際對比Keil環境中NONOS(不用RTOS)、freeRTOS、CMSIS-RTOS(Keil RTX)、CMSIS-RTOS2(Keil RTX5)幾種方式下資源占用情況(在各RTOS種啟動一個任務,該任務重復執行一條UART輸出):

NONOS:
Program Size: Code=2672 RO-data=344 RW-data=76 ZI-data=812
freeRTOS:
Program Size: Code=7024 RO-data=344 RW-data=124 ZI-data=4948
CMSIS-RTOS(Keil RTX):
Program Size: Code=7268 RO-data=456 RW-data=68 ZI-data=2932
CMSIS-RTOS2(Keil RTX5):
Program Size: Code=6264 RO-data=560 RW-data=5128 ZI-data=608

//稍作解釋:Code是代碼占用的空間;RO-data是 Read Only 只讀常量的大小,如const型;RW-data是(Read Write) 初始化了的可讀寫變量的大小;ZI-data是(Zero Initialize) 沒有初始化的可讀寫變量的大小。ZI-data不會被算做代碼裏因為不會被初始化

//FLASH空間占用:(Code) + (RO Data) + (RW Data)

//RAM空間占用:( RW Dat) + (ZI Dat)

實際數值可以很容易的看出資源占用情況,當然我們也可以考慮通過對RTOS進行適當裁剪,來達到更小的FLASH和RAM空間占用——當然主要還是註重對RAM空間的占用,FLASH一般來說較為便宜且很容易外擴,不太容易先出現資源短缺的情況——但是很顯然對於RAM 4KB的單片機而言,無論采用何種RTOS,片上資源總是吃緊,對於我們想要充分利用單片機外設資源的想法而言,調用RTOS難免導致kernel代碼嚴重擠壓功能代碼的可用空間,得不償失。

單片機爬坑記-02-資源緊缺