加入星计划,您可以享受以下权益:

  • 创作内容快速变现
  • 行业影响力扩散
  • 作品版权保护
  • 300W+ 专业用户
  • 1.5W+ 优质创作者
  • 5000+ 长期合作伙伴
立即加入
  • 正文
  • 推荐器件
  • 相关推荐
  • 电子产业图谱
申请入驻 产业图谱

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

04/22 13:41
2337
阅读需 4 分钟
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

之前使用沁恒公司的一款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的实际占用情况:

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

关注公众号,扫码加入嵌入式交流群:

推荐器件

更多器件
器件型号 数量 器件厂商 器件描述 数据手册 ECAD模型 风险等级 参考价格 更多信息
PLR135/T1 1 Everlight Electronics Co Ltd Receiver, 16Mbps, Through Hole Mount, ROHS COMPLIANT, PACKAGE-3
暂无数据 查看
CPC1017NTR 1 IXYS Corporation Transistor Output SSR, 1-Channel, 1500V Isolation, SOP-4
$0.62 查看
ECS-160-9-42-CKM-TR 1 ECS International Inc Parallel - Fundamental Quartz Crystal, 16MHz Nom, ROHS COMPLIANT, SMD, 4 PIN

ECAD模型

下载ECAD模型
$2.07 查看

相关推荐

电子产业图谱

TopSemic,让芯片使用更简单。 专注分享:嵌入式,单片机,STM32,ARM,RTOS,Linux, 软硬件,半导体,电子技术等相关内容。