flash 读写擦
flash 读:顺序读很快。跳序读会损耗点时间,也很快,但不会影响功耗。无次数限制
flash 写:
原理:将1bit 变为0bit。
特点:
每次最小写入一个page (256字节)。
有限次数(10万-100万次,跟FLASH手册有关),
消耗时间大于flash读,有功耗。
有限次数指:写入某一区域的次数。比如:10万次写入0x40000-0x40100地址后,写入失效,从此0x40000-0x40100区域不可擦写,其余区域正常
建议:如果写入十分频繁(例如1s一次),并且数据非常小(几十个字节以内),可以先存到SRAM,等SRAM存到接近256字节,再写入flash。4K数据作为一个Sector,满了可以继续写下一个Sector,数据按顺序写入形成一个闭环,通过前两位表示当前Sector_id
目的:减少写入的次数,减少写入同一区域的次数。
flash 擦:
原理:将0bit变为1bit
特点:
每次擦除区域最小为4k
有限次数(10万-100万次,跟FLASH手册有关),
消耗时间大于flash 写,有功耗(10ms)。
flash 擦除瞬间会影响到程序
flash擦除4k ,和擦除128k 时间代价差不多
建议:
flash 存满再进行擦除。存满是尽可能写满flash,因为擦除代价几乎一样。
等程序空闲的时候在进行擦除动作。尽量规避对程序的影响。
flash读的代价 《 flash写《 flash擦
flash 管理系统:
原则:
频繁的使用读操作,去减少flash擦写的频率,page满了才进行写,sector满了才进行擦。空闲的时间才进行擦。
操作日志思路:
uint16 sector_id
uint16 data_len
uint16 data
把所有擦写的操作都像日记一样记录到flash中,擦操作就是把data_len 改为0,因为写数据可以把1bit 变为0。就是伪擦除。真是等到日记将填满整个flash,并且程序空闲的时候,才真正进行一次擦操作。