• 正文
  • 推薦器件
  • 相關推薦
申請入駐 產業(yè)圖譜

MCU RAM空間不夠用了怎么辦?

2024/04/22
2597
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

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

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

項目里除了用到BLE還用到了USB通信、OLED顯示等功能,所以一不小心RAM就緊張了。

在優(yōu)化RAM空間之前,首先要利用好map文件,查看RAM空間的實際占用情況,這樣才好針對性去優(yōu)化。

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];

這個和藍牙協(xié)議棧相關,不可隨意修改。

我當時主要優(yōu)化了一個地方:中斷服務函數。CH573要求中斷服務函數放到RAM里(猜測可能是為了提高響應速度),我之前沒注意把所有的中斷處理代碼全部都寫在了中斷服務函數里,導致占用了很多RAM空間,

其實只需要按照如下的寫法就會節(jié)約很多空間:

/********************************************************************* * @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大的地方,對應去優(yōu)化。

在成本允許的情況下,當然是一開始就選擇一款RAM空間足夠大的MCU最好。

關注公眾號,掃碼加入嵌入式交流群:

推薦器件

更多器件
器件型號 數量 器件廠商 器件描述 數據手冊 ECAD模型 風險等級 參考價格 更多信息
KSZ9031RNXCA-TR 1 Microchip Technology Inc DATACOM, ETHERNET TRANSCEIVER, QCC48

ECAD模型

下載ECAD模型
$105.81 查看
25AA02E48-I/SN 1 Microchip Technology Inc 256 X 8 SPI BUS SERIAL EEPROM, PDSO8, 3.90 MM, ROHS COMPLIANT, PLASTIC, SOIC-8

ECAD模型

下載ECAD模型
$0.53 查看
DSC1001CI1-020.0000T 1 Microchip Technology Inc OSC MEMS 20.000MHZ CMOS SMD
暫無數據 查看

相關推薦

登錄即可解鎖
  • 海量技術文章
  • 設計資源下載
  • 產業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄