Flash 应用的优化设计建议
(1) 程序区和数据区分离避免频繁擦写程序区,可将 Flash 的特定区域划分为数据区用于频繁数据更新。
使用专门的 Flash 分区策略,提高存储寿命。
(2) 动态数据管理
对于需要频繁更新的数据(如计数值或运行日志),采用轮询存储或数据冗余机制减少对单一区域的擦写次数。
(3) 使用 Bootloader 实现安全更新
在 Flash 中保留一个独立的 Bootloader 区域,用于设备启动和程序更新。
在更新前对新程序进行校验,确保固件的完整性和可靠性。
(4) 数据加密与校验
在 Flash 中存储敏感数据时,可以对其进行加密,提升安全性。
在程序或数据更新时,通过校验和/哈希值验证数据完整性,防止写入错误。
将程序按照功能划分为不同的模块,如通信模块、控制模块、数据处理模块等,每个模块的代码存放在 Flash 的特定区域。这样做有助于提高代码的可读性和可维护性。 避免在堆上分配大块内存,以防止堆栈溢出。尽量使用局部变量,并在函数之间传递指针而不是复制整个数据。 全局变量占用固定的内存空间,且容易引起代码复杂性。尽量将全局变量改为局部变量或使用静态局部变量。 设计一个清晰、简洁、高效且组件复用性强的代码架构,如采用精简高效的算法和代码量小的中间件。 选择时间复杂度和空间复杂度都较低的算法。 在Flash中保留一个独立的Bootloader区域,用于设备启动和程序更新 将Flash的特定区域划分为数据区,用于频繁数据更新,以避免对程序区的频繁擦写 对于频繁调用的小函数,可以使用内联函数来减少函数调用的开销,但要注意这可能会增加代码大小。 由于初始化为非0的全局和静态变量会占用flash空间,可以考虑要不要对其初始化,这主要看初始化代码中会不会用到这些变量的值。 将Flash存储器划分为两个相同大小的区域,分别存储相同的程序内容,当一个区域出现问题时,可以切换到另一个区域。 由于 Flash 有擦写寿命限制,要采用均衡擦写的策略。可以将 Flash 划分为多个擦写单元,轮流使用这些单元进行数据存储和更新。例如,在一个数据记录系统中,将 Flash 分为多个扇区,每次记录数据时,选择使用擦写次数较少的扇区,避免某个扇区过度擦写而损坏。 在需要进行多次 Flash 读写操作时,合理安排读写顺序。一般来说,先进行批量的读操作,然后再进行写操作,这样可以减少 Flash 的状态转换次数。因为 Flash 在读写状态之间转换需要一定的时间和开销。 如果单片机的Flash支持分页,合理规划代码和数据在Flash中的分布,以减少页面切换。 根据应用需求,优化数据存储格式。例如,对于需要频繁读取的数据,可以采用紧凑的数据结构来减少读取时间;对于不需要精确存储的数据,可以采用近似值或压缩算法来减小存储体积。 在Flash中存储代码的校验和,用于启动时验证代码的完整性。 MCU内部FLASH要用来频繁读写数据的话,最好是做分区管理。 不需要的源代码不要编译到最终执行文件中,可不要包含源代码的头文件,是否需要编译它主要看业务中会不会调用源代码向外暴露的接口。 对于程序中使用的常量(如配置参数、表格数据等),应尽量存储在 Flash 中。因为 Flash 在掉电后数据不会丢失,而且读取 Flash 中的常量比从其他存储介质(如外部 EEPROM)读取更加高效。 对于需要频繁擦写的Flash存储器,可以采用磨损均衡技术来延长其使用寿命。通过定期更换擦写区域,使得每个区域的擦写次数相对均衡,从而避免某个区域因过度擦写而损坏。