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

    文章

    1557

    浏览量

    146776
  • RAM
    RAM
    +关注

    关注

    7

    文章

    1327

    浏览量

    113794
  • BLE
    BLE
    +关注

    关注

    12

    文章

    611

    浏览量

    58900
  • USB通信
    +关注

    关注

    0

    文章

    22

    浏览量

    10860
  • OLED显示
    +关注

    关注

    1

    文章

    53

    浏览量

    16922

原文标题:MCU RAM空间不够用了怎么办?

文章出处:【微信号:TopSemic,微信公众号:TopSemic嵌入式】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    PCB面积总是不够用?试试这个方案呗~

    PCB面积总是不够用?试试这个方案呗~
    的头像 发表于 10-17 15:14 640次阅读
    PCB面积总是<b class='flag-5'>不够用</b>?试试这个方案呗~

    单片机RAM不够用怎么解决?

    来自一位用户的咨询,麻烦帮忙解答。越详细越好,有图有真相。如有相关的视频、文档也可以辅助说明,谢谢。 单片机RAM不够用怎么办? 单片机都有RAM,如果我们一下子定义了一大堆的变量,使得变量占的
    发表于 02-02 07:35

    stm32f103rbt6加上exfuns_init()函数就空间不够用了,有什么好的建议?

    主芯片用的stm32f103rbt6 加上exfuns_init()函数就空间不够用了,有什么好的建议? 板子已实现u盘功能。我想通过串口使用mf_scan_files(\"0:\")之类的命令。但主函数中加入初始化语句就已经容量不够
    发表于 05-17 07:23

    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口不够用怎么办?你可以进行系统扩展!什么鬼?那是什么东西?。。。看书去1.引文前面说过
    发表于 07-19 07:21

    stm32出现ram、rom不够用怎么解决?

    stm32出现ram、rom不够用怎么解决?
    发表于 02-16 06:00

    诺基亚投诉率居榜首 电池不够用成突出问题

    诺基亚投诉率居榜首 电池不够用成突出问题
    发表于 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 516次阅读
    局域网IP地址<b class='flag-5'>不够用</b>怎么解决