目录

蓝牙mesh协议中有不少数据需要存储dataflash,以记录网络中的数据。一些数据只需要配网时保存进dataflash,比如说本节点的网络地址、各类密钥等;另一些数据需要在运行中动态更新,比如说消息序列号(seq num)等。对于发送方,在新增发送消息数达到步长时需要保存数据,断电重新上电时会将根据dataflash中的消息序列号,再加上一个步长来恢复为当前消息序列号,保证其大于此节点之前发送的消息的序列号,以免被消息接收方判断为过往消息。默认步长为60(在app_mesh_config.h中由宏CONFIG_MESH_SEQ_STORE_RATE_DEF设置)。发送方每次保存12个字节,一块4K的扇区可以保存约341次,但考虑到其他数据的开销,实际要比341小一些。

鉴于dataflash有其擦写寿命,协议栈在存满n-1块扇区后,会收集整理数据,整合到另一块扇区。比如说宏配置了使用8块扇区,已存满7块扇区,协议栈会整理7块扇区中的数据,整合到第8块dataflash中。整理flash过程中涉及到字符串比对、拷贝等操作,故代码运行的时间越长,flash中保存的数据量以及数据间差异越大,整理dataflash用到的时间就越多。

最新EVT中,在app_mesh_config.h中有宏可进行配置,如下图,默认使用前3*4K的dataflash空间。

鉴于dataflash最小擦除单位为256字节,codeflash最小擦除单位为4K,如果用户需要更改首地址,在dataflash头部存放用户数据,建议按照256字节对齐,否则一次擦除可能会擦掉2*256字节的数据。

若使用到了BLE且配对绑定保存置为true,那么配对绑定的信息保存在dataflash尾部,具体位置见config.h中的BLE_SNV_ADDR。

需要注意的是在mesh代码中使用看门狗。582/573看门狗溢出计时最长可达约557ms,但整理一块4K大小的扇区,耗时最长可达1s,而整理dataflash又在协议栈中完成,故在使用到看门狗时,主循环中可能来不及喂狗。解决方法有二,一是减小整理flash所需的时间,适合需要保存的数据较少的情况,可以将保存的扇区数量以及扇区大小减小,最小以初始化不报错为准;二是拉长看门狗复位的超时时长,可以通过在看门狗中断中计数的方式,比如说溢出计数到10才复位,这样可以有5.5s的时长留给flash整理,延长看门狗复位的时间。

小贴士:①保存dataflash时没有用户层提示,保存dataflash的时间点需要根据发包频率与步长设置来估算,在跑一些实时性较高的代码时需要评估一下延时。

②整理flash的过程中,涉及到操作flash的库,会关闭总中断,可能不会及时触发包括看门狗在内的中断,但标志会保存,操作完dataflash后会触发中断。

③整理flash的过程中若突然断电打断了dataflash的整理,不会对上电重启时恢复的配网信息造成影响,因为在整理好dataflash数据前会保留旧的扇区,擦写好新的扇区才会擦除旧扇区。

原文地址:http://www.cnblogs.com/JayWellsBlog/p/16869845.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性