之前使用沁恒公司的一款BLE芯片CH573,隨著代碼量的增多,開發(fā)到后期時(shí)遇到了RAM空間不夠用的問題,當(dāng)時(shí)嚇了我一跳,以為需要重新?lián)Q更大RAM的芯片。后來經(jīng)過一番分析,優(yōu)化之后省出來一部分空間,解決了RAM危機(jī)。

CH573的Flash挺大,但是RAM只有18K。只跑一個(gè)BLE的HID_Keyboard例子就會占用接近14K,留給用戶真正能使用的RAM空間只有約4K。

項(xiàng)目里除了用到BLE還用到了USB通信、OLED顯示等功能,所以一不小心RAM就緊張了。
在優(yōu)化RAM空間之前,首先要利用好map文件,查看RAM空間的實(shí)際占用情況,這樣才好針對性去優(yōu)化。
CH573 RAM起始地址為0x20003800

通過map文件可以清楚的看到RAM的實(shí)際占用情況:


比如上述MEM_BUF就占用了6K空間,它在程序中定義如下:
#define BLE_MEMHEAP_SIZE (1024*6) attribute((aligned(4))) uint32_t MEM_BUF[BLE_MEMHEAP_SIZE / 4];
這個(gè)和藍(lán)牙協(xié)議棧相關(guān),不可隨意修改。
我當(dāng)時(shí)主要優(yōu)化了一個(gè)地方:中斷服務(wù)函數(shù)。CH573要求中斷服務(wù)函數(shù)放到RAM里(猜測可能是為了提高響應(yīng)速度),我之前沒注意把所有的中斷處理代碼全部都寫在了中斷服務(wù)函數(shù)里,導(dǎo)致占用了很多RAM空間,
其實(shí)只需要按照如下的寫法就會節(jié)約很多空間:
/*********************************************************************
* @fn USB_IRQHandler
*
* @brief USB中斷函數(shù)
*
* @return none
*/
__attribute__((interrupt("WCH-Interrupt-fast")))
__attribute__((section(".highcode")))
void USB_IRQHandler(void) /* USB中斷服務(wù)程序,使用寄存器組1 */
{
USB_DevTransProcess();
}
即將USB_DevTransProcess()函數(shù)的具體實(shí)現(xiàn)寫在外面。
除此之外,還有比如靈活使用const關(guān)鍵字、使用union等方法,不在此詳細(xì)介紹了。
重要的是利用好map文件,找到占空RAM大的地方,對應(yīng)去優(yōu)化。
在成本允許的情況下,當(dāng)然是一開始就選擇一款RAM空間足夠大的MCU最好。
-
FlaSh
+關(guān)注
關(guān)注
10文章
1748瀏覽量
155514 -
RAM
+關(guān)注
關(guān)注
8文章
1399瀏覽量
120549 -
BLE
+關(guān)注
關(guān)注
13文章
776瀏覽量
66342 -
USB通信
+關(guān)注
關(guān)注
0文章
22瀏覽量
11376 -
OLED顯示
+關(guān)注
關(guān)注
1文章
57瀏覽量
17460
原文標(biāo)題:MCU RAM空間不夠用了怎么辦?
文章出處:【微信號:TopSemic,微信公眾號:TopSemic嵌入式】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
單片機(jī)RAM不夠用怎么解決?
esp32c2同時(shí)開啟wifi藍(lán)牙內(nèi)存ram會有點(diǎn)不夠用,如何能夠多節(jié)省點(diǎn)ram空間出來嗎?
1452的延時(shí)不夠用,外掛ram做延時(shí),請問硬件應(yīng)該怎么連接,sigmastudio應(yīng)該怎么設(shè)置?
請問DSP中的.ebss文件能否映射到Flash上,SARAM空間有點(diǎn)不夠用?
mini板上lwip+ucosii移植ram不夠用該怎么辦?
DSP匯編程序用軟件仿真時(shí),寫文本段發(fā)現(xiàn)RAM不夠用怎么解決?
malloc申請的內(nèi)存不夠用怎么解決?
IO口不夠用怎么辦?
stm32出現(xiàn)ram、rom不夠用,調(diào)試方法
怎么解決MCU RAM空間不夠用的問題?
評論