OTA和错误码问题
-
sdk中没有发送响应的接口, 如果蓝牙主机发送Write Request, 从机判断数据无效, 怎么发送错误码
系统时钟是由外部晶振提供还是内部RC?
还有OTA功能, 没有bootloader, 分析源码, 采用双分区, 启动后ROM从Flash地址0处读取jump_table获得分区1的Version和Image Size等, 再从地址Image Size处读取jump table获得分区2的Version和Image Size, 如果分区2参数有效且Version大于分区1的Version, 则运行分区2程序, 否则运行分区1程序.
这里有个问题, 如果升级失败, 下载分区的程序是不完整的, 可能无法读取jump_table, 设备会变砖. OTA服务做了一个处理, OTA开始时不擦除分区起始第一个页面256字节, 等数据传输完成后再擦除第一个页面, 写入数据. 但是这样还是会存在极低概率在擦写第一个页面出现异常变砖.
如何自行编写bootloader, 自定义OTA服务?
-
如果不完全就是crc校验不成功就不会写前面256字节,那么重启的时候回去判断,不会跑B区代码
-
@mars 如果擦写起始页256字节出错呢,不还是会变砖吗
另外从机怎么向主机返回错误码
-
为什么会出错呢,下图是从机回复app的方式,你参考一下我们的app实现的方式吧
-
@mars flash擦写出错是可能的, 比如擦写时掉电, 或者电压不稳.
从机通过Notify和Indication可以回复主机, 我需要的是在主机写请求 从机判断数据无效时返回错误码, 你们SDK有定义错误码, 在ble_hl_error.h文件中, 比如 ATT_ERR_INVALID_HANDLE, ATT_ERR_INVALID_PDU, ATT_ERR_INVALID_OFFSET 等等, 怎么返回主机这些错误码? 其他厂家的SDK是可以返回错误码, 你们的SDK中没有类似的接口或回调.
-
那你说的这种出错不会变砖,只有校验成功之后才会去写引导,开机的时候才会启动你ota的固件,
如果错误了直接断连了
-
@mars 不是校验的问题, 校验成功后写引导, 如果最后写引导这一步出错呢? 写flash并不是百分百成功.
除起始页256字节之外的flash,即使写失败也不会变砖, 可以回读校验数据是否写入成功. 分区1起始页256字节如果刚好在擦除后掉电没来得及写入或者写入失败肯定会变砖.