<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎么解決MCU RAM空間不夠用的問題?

TopSemic嵌入式 ? 來源:TopSemic嵌入式 ? 2024-05-01 09:57 ? 次閱讀

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

30fba576-0049-11ef-a297-92fbcf53809c.png

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

310efbbc-0049-11ef-a297-92fbcf53809c.png

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

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

CH573 RAM起始地址為0x20003800

311a49d6-0049-11ef-a297-92fbcf53809c.png

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

3125862a-0049-11ef-a297-92fbcf53809c.png

31364dde-0049-11ef-a297-92fbcf53809c.png

比如上述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

    文章

    1551

    瀏覽量

    146729
  • RAM
    RAM
    +關注

    關注

    7

    文章

    1322

    瀏覽量

    113724
  • BLE
    BLE
    +關注

    關注

    12

    文章

    608

    瀏覽量

    58873
  • USB通信
    +關注

    關注

    0

    文章

    22

    瀏覽量

    10858
  • OLED顯示
    +關注

    關注

    1

    文章

    52

    瀏覽量

    16918

原文標題:MCU RAM空間不夠用了怎么辦?

文章出處:【微信號:TopSemic,微信公眾號:TopSemic嵌入式】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    PCB面積總是不夠用?試試這個方案唄~

    PCB面積總是不夠用?試試這個方案唄~
    的頭像 發表于 10-17 15:14 ?624次閱讀
    PCB面積總是<b class='flag-5'>不夠用</b>?試試這個方案唄~

    單片機RAM不夠用怎么解決?

    來自一位用戶的咨詢,麻煩幫忙解答。越詳細越好,有圖有真相。如有相關的視頻、文檔也可以輔助說明,謝謝。 單片機RAM不夠用怎么辦? 單片機都有RAM,如果我們一下子定義了一大堆的變量,使得變量占的
    發表于 02-02 07:35

    E幣不夠用

    E幣不夠用,{:1:}{:16:}
    發表于 04-29 18:12

    1452的延時不夠用,外掛ram做延時,請問硬件應該怎么連接,sigmastudio應該怎么設置?

    1452的延時不夠用,打算外掛ram做延時。。。請問硬件應該怎么連接,sigmastudio應該怎么設置呢?
    發表于 08-03 06:41

    請問DSP中的.ebss文件能否映射到Flash上,SARAM空間有點不夠用?

    DSP中的.ebss文件能否映射到Flash上,SARAM空間有點不夠用?請高手指點,不勝感激!
    發表于 12-03 16:01

    mini板上lwip+ucosii移植ram不夠用該怎么辦?

    板子只有48k的ram,而且mini沒有外置ram,為什么???如果在103r8上跑lwip和ucosii可以嗎,感覺可以rom和ram不夠用,這個配置應該怎么搞呢?十分感謝~~~
    發表于 08-20 04:35

    DSP匯編程序用軟件仿真時,寫文本段發現RAM不夠用怎么解決?

    原來有一套可以直接燒錄到flash的程序,現在想改成用硬件仿真器XDS510可以在線單步測試的程序,修改CMD文件,把原來在flash的段改成在RAM段,發現RAM不夠用,怎么辦?
    發表于 07-13 06:31

    malloc申請的內存不夠用怎么解決?

    辦法把reserved的那部分也用起來,我現在因為用到大量的long double數據,malloc申請的內存不夠用.問題2:想請教下,關于long double的數據類型的計算,有沒有什么辦法可以提高
    發表于 07-22 10:05

    串口不夠用的解決辦法?

    我要用好我個串口,但是單片機上就必個,串口不夠用,怎么辦?
    發表于 08-04 00:56

    IO口不夠用怎么辦?

    C51單片機————總線與系統擴展Created with Rapha?l 2.1.2張三張三李四李四四哥,IO口不夠用怎么辦?你可以進行系統擴展!什么鬼?那是什么東西?。。??磿?.引文前面說過
    發表于 07-19 07:21

    stm32出現ram、rom不夠用怎么解決?

    stm32出現ram、rom不夠用怎么解決?
    發表于 02-16 06:00

    LPC2478不夠用啊,請教怎么裁剪可以減少空間

    了RT-GUI后,空間增加不少,到了84332+478612,LPC2478不夠用啊,請教怎么裁剪可以減少空間呢?開始IROM1的SIZE=0x80000編譯不能通過,修改SIZE=0x100000可以通過,但燒寫進去不對啊。難
    發表于 04-14 14:23

    諾基亞投訴率居榜首 電池不夠用成突出問題

    諾基亞投訴率居榜首 電池不夠用成突出問題
    發表于 04-09 08:48 ?329次閱讀

    stm32出現ram、rom不夠用,調試方法

    手里有一塊stm32f103r8ct的板子,想移植ucosii+lwip,使用原子mini的源代碼提示ram、rom不夠用,一直很糾結,感覺應該是malloc的問題,但又不知道怎么改
    發表于 12-20 19:15 ?3次下載
    stm32出現<b class='flag-5'>ram</b>、rom<b class='flag-5'>不夠用</b>,調試方法

    局域網IP地址不夠用怎么解決

    如果是在一個小型的局域網里可能完全不必要考慮IP地址不夠的情況,但是在超過“255臺”電腦的大型局域網里,就必須要考慮電腦IP地址不夠用該如何解決了。
    的頭像 發表于 12-05 10:13 ?451次閱讀
    局域網IP地址<b class='flag-5'>不夠用</b>怎么解決
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>