之前使用沁恒公司的一款BLE芯片CH573,隨著代碼量的增多,開發到后期時遇到了RAM空間不夠用的問題,當時嚇了我一跳,以為需要重新換更大RAM的芯片。后來經過一番分析,優化之后省出來一部分空間,解決了RAM危機。
CH573的Flash挺大,但是RAM只有18K。只跑一個BLE的HID_Keyboard例子就會占用接近14K,留給用戶真正能使用的RAM空間只有約4K。
項目里除了用到BLE還用到了USB通信、OLED顯示等功能,所以一不小心RAM就緊張了。
在優化RAM空間之前,首先要利用好map文件,查看RAM空間的實際占用情況,這樣才好針對性去優化。
CH573 RAM起始地址為0x20003800
通過map文件可以清楚的看到RAM的實際占用情況:
比如上述MEM_BUF就占用了6K空間,它在程序中定義如下:
#define BLE_MEMHEAP_SIZE (1024*6) attribute((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4];
這個和藍牙協議棧相關,不可隨意修改。
我當時主要優化了一個地方:中斷服務函數。CH573要求中斷服務函數放到RAM里(猜測可能是為了提高響應速度),我之前沒注意把所有的中斷處理代碼全部都寫在了中斷服務函數里,導致占用了很多RAM空間,
其實只需要按照如下的寫法就會節約很多空間:
/********************************************************************* * @fn USB_IRQHandler * * @brief USB中斷函數 * * @return none */ __attribute__((interrupt("WCH-Interrupt-fast"))) __attribute__((section(".highcode"))) void USB_IRQHandler(void) /* USB中斷服務程序,使用寄存器組1 */ { USB_DevTransProcess(); }
即將USB_DevTransProcess()函數的具體實現寫在外面。
除此之外,還有比如靈活使用const關鍵字、使用union等方法,不在此詳細介紹了。
重要的是利用好map文件,找到占空RAM大的地方,對應去優化。
在成本允許的情況下,當然是一開始就選擇一款RAM空間足夠大的MCU最好。
-
FlaSh
+關注
關注
10文章
1635瀏覽量
148023 -
RAM
+關注
關注
8文章
1368瀏覽量
114697 -
BLE
+關注
關注
12文章
660瀏覽量
59410 -
USB通信
+關注
關注
0文章
22瀏覽量
10912 -
OLED顯示
+關注
關注
1文章
55瀏覽量
17001
原文標題:MCU RAM空間不夠用了怎么辦?
文章出處:【微信號:TopSemic,微信公眾號:TopSemic嵌入式】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論