嵌入式之OTA详解

总述

对于物联网产品,OTA升级功能总是必不可少的,可以随时更新终端产品的用户体验,不过OTA对升级过程中的安全性要求极高,以防一不小心设备成砖。

升级方式

1、 双区域备份升级——pingpong升级

顾名思义,Flash分为两个区域A,B,A作为初始固件运行区,当检测到升级需求时,将新的固件写入到B区,校验新的升级固件完全下载写入后,设备重启后Bootloader启动代码从升级信息区读取当前应当运行的区域,后跳到指定的区域运行程序。
优点:升级代码下载到设备后,就不再需要任何处理,设备资源占用小。
缺点:flash占用大

2、压缩升级

压缩升级也是将Flash分为两个区域A,B,只不过启动区域都是一个。 OTA的固件是经过一定方式压缩后的升级固件,压缩后的固件写入到设备后,设备重启并查询升级区信息,对于压缩升级,设备需要先进行解压,解压后搬运到A区。
优点:Flash占用小。
缺点:升级过程较繁琐,存在出现问题的可能,例如断电。

3、差分升级

差分升级需要对固件的版本控制要求较高,升级前后固件改动不大的情况使用较好,差分升级固件是升级固件与原始固件的改动比较包。设备接收到固件后需要通过差分恢复算法更新现有固件。
优点:升级固件更小,下载速度快,更节省存储空间。
缺点:差分固件恢复成新固件的时间相对长,需要的内存相对大。

872、808的OTA程序详解

1、 SDK自带的升级方式

SDK自带了几种升级:
1、http升级
2、sd卡升级
调用接口:
ota_status_tota_get_image(ota_protocol_tprotocol,void*url);
参数:protocol:下载固件的协议,目前支持 http 和 file 两种协议
url:下载的地址
返回值:返回下载状态

示例:
在这里插入图片描述

2、 自定义升级方式

主要对接的接口:
typedef ota_status_t (*ota_update_init_t)(void *url);
此接口为初始化接口,如果不需要初始化的直接返回OTA_STATUS_OK即可。
typedef ota_status_t (*ota_update_get_t)(uint8_t *buf, uint32_t buf_size, uint32_t *recv_size, uint8_t *eof_flag);
参数:输入参数buf 升级固件的数据
输入参数buf_size 本次需要的数据长度,可以自己设置,系统默认为2k
输入参数recv_szie 实际数据长度
输入参数eof_flag 数据是否接收完毕
以上接口对接好后,在ota.c文件的: ota_status_t ota_get_image(ota_protocol_t protocol, void *url)函数里进行注册。并在ota.h增加ota_protocol枚举的种类

接口依次调用:ota_init() -> ota_get_image() ->ota_get_verify_data()->ota_verify_image()-> ota_reboot()

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/tulongyongshi/article/details/108038510