[资源共享]

MCU RAM空间不够用了怎么办?

[复制链接]
1258|1
手机看帖
扫描二维码
随时随地手机跟帖
laocuo1142|  楼主 | 2024-5-14 14:26 | 显示全部楼层 |阅读模式
ap, TE, USB, US, RAM, MCU
本帖最后由 laocuo1142 于 2024-5-14 14:29 编辑

之前使用沁恒公司的一款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的实际占用情况:
73998664304c727d59.png
4381664304e077945.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最好。

使用特权

评论回复
呐咯密密| | 2024-5-20 09:47 | 显示全部楼层
函数实现放在中断服务函数外面还可以节省RAM啊,这个我真才知道

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1041

主题

4315

帖子

10

粉丝