打印
[其他产品]

MCU片上存储的知识分享

[复制链接]
212|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
meiyaolei|  楼主 | 2024-12-9 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前一些时间为了解决片上存储的问题,也是花过时间去研究的,在资源有限的MCU中,优化Flash和RAM的使用是嵌入式系统开发中的关键任务,尤其是在系统对性能、功耗和稳定性有较高要求时。


Flash与RAM的角色和优化目标
Flash是用于存储程序代码、常量和只读数据。
Flash由于其非易失性,Flash在断电后依然保持数据,Flash的读写速度较慢,通常不适合频繁写操作,合理安排常量、配置信息和代码部分是关键。

RAM是用于存储运行时的数据,变量、堆栈等。
RAM的读写速度远快于Flash,通常容量有限且易失,需要精心管理内存的使用,避免过多数据驻留在RAM中。


内存分配策略与优化技巧
Flash和RAM的内存布局优化,程序存储区和数据存储区分离是将代码、常量、只读数据存储在Flash中,动态数据存储在RAM中。这样可以减少对Flash的频繁写操作,避免浪费RAM空间用于静态数据。
常量存储优化, 使用const或__attribute__((section(".flash")))等编译器特性将不常变化的数据(查找表、配置参数等)存储在Flash中。

RAM优化
减少全局变量的使用,将其改为局部变量,减少RAM占用。
局部变量优化,将变量作用域限制在函数内,避免深层递归和过多的栈内存使用。
内存池管理,使用内存池减少内存碎片,提高动态内存分配效率。
栈内存优化,通过优化递归算法或将递归改为迭代形式,减少栈空间消耗。

Flash优化
程序压缩,使用代码压缩工具(如gzip)减少Flash存储空间。
程序分区管理,将频繁更新的代码和数据与不常更新的部分分开存储,减少Flash写入频率。
动态内存管理
固定内存分配,避免频繁的动态内存分配,预分配固定大小的内存块。
内存对齐,确保数据结构在内存中对齐,提高访问效率。

性能优化
数据局部性优化,将常用数据安排在相邻内存区域,减少缓存未命中。
避免频繁数据复制,减少RAM和Flash之间的数据复制,尤其是频繁访问的数据应存放在RAM中。
适当的数据类型,选择适合的数据类型,减少内存占用并提高处理速度。

功耗优化
内存节能,在低功耗模式下,减少内存访问,使用外设中断代替轮询。
合理分配内存资源,避免在低功耗模式中频繁访问RAM,降低电池消耗。

常见挑战与解决方案
内存不足,通过压缩数据、精简代码、共享模块减少内存占用。
读写性能瓶颈,批量写入Flash数据,使用RAM缓冲区提高性能。

实际优化经验
环形缓冲区,缓存串口或网络数据,减少频繁的读写操作。
定时任务,定期执行数据存储任务,减少内存压力。
优先级队列,分配内存资源,保证关键任务优先获得内存。

使用特权

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

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

171

主题

666

帖子

4

粉丝