2019-01-12 用esp-open-rtos实现8285上的OTA

A基于自有服务器、B在1Mbyte的8285上基于RTOS来实现OTA。C.数据校验

一、8285存储结构

8285flash使用 w25q8 作为存储芯片,数据空间构成为1M*8bit, 寻址空间为 00000~0XFFFFF。依据参考在NONOS编译生成可OTA的固件时会生成两个文件,一个写入起始地址为0x1000,一个为0X81000可以看出:

1.固件的0x000~0xFFF,0x80000~0x80FFF应该存储了bootloader的引导代码(可能为Tensilica 上电复位地址和MCU的寄存器初始化等指令以及跳转至用户代码区等),0Xfc000-0xfdfff(乐鑫厂商的初始化数据存储区,例如如WIFI校正参数)用户代码1从0x01000~0x7ffff ,用户代码2从0x81000~0xfbfff ,0x7e000,和0xfC000的位置最好不要使用原因参考下图

来自ESPFlashDownload TOOL

2.用户使用时会存在有参数需要存储读取的情况,那么用户数据可以安排在代码0X7E000-0X1000*N,或者0XFC000-0X1000*N 开始的位置,用户数据存储时需要了解到FLASH空间是以bit为单位的,计算时需要将 int,long 的数据转换后考虑规划分配空间大小,以及分配的最小单位为块即0x1000。如需要100个char型数则100*8=800 需要分配0x7C000-0X1000=0X7B000 开始的空间,或者0XFB000开始的4096个bit里。

为确保AB程序切换不会越界,那么我就可以得出用户代码的最大体量。0XFC000-0X1000*1-0X1000-0X80000=0x7A000 即488K

3.升级的原理是将1Mbit的空间分为2块,相互切换,A代码运行时下载的更新程序存与B区,然后改写0Xfc000区域的启动文件位置标志位确定下次复位以后从0x1000,还是0x81000读取用户程序。

二、.对于esp-open-rtos SDK编译的环境与参数设定

esp-open-rtos 拥有巨多的samples 不用可惜啊!对于lubantu的linux环境用起来还是非常容易的,可惜单片机开发人员过于陌生。我来试着在WINDOWS环境下一步步搭建编译环境,并在vistual studio code上调试。

1.下载完代码打开目录结构

一头雾水没关系,直奔主题进入examples目录 里的ota_basic里

这里的makefile 文件是make 机制的关键

给2个变量 PROGRAM 和EXTRA_COMPONENTS 赋值,并引用了esp-open-rtos-master根目录下的common.mk 文件。

那么我们来读一读common.mk 的文件内容:

ROOT := $(dir $(lastword $(MAKEFILE_LIST)))   #### 取得 common.mk 的相对samples的路径即此RTOS的根目录 使用 $(warning the ROOT is: $(ROOT))可以查看

include $(ROOT)parameters.mk    ####引入关于芯片参数的设定文件  用户需要自行修改以适应自己的项目

ifndef PROGRAM   #检测 PROGRAM   变量 以确保common.mk引用前做了必要的初始化, 非单独执行

$(error "Set the PROGRAM environment variable in your Makefile before including common.mk")

endif

empty :=

space := $(empty) $(empty)  #由于makefile 的语法规则,需定义一个空格字符,字符串处理会用 

lc = $(subst A,a,$(subst B,b,$(subst C,c,$(subst D,d,$(subst E,e,$(subst F,f,$(subst G,g,$(subst H,h,$(subst I,i,$(subst J,j,$(subst K,k,$(subst L,l,$(subst M,m,$(subst N,n,$(subst O,o,$(subst P,p,$(subst Q,q,$(subst R,r,$(subst S,s,$(subst T,t,$(subst U,u,$(subst V,v,$(subst W,w,$(subst X,x,$(subst Y,y,$(subst Z,z,$1))))))))))))))))))))))))))

#自定义函数lc 用于转换大写字符为小写

PROGRAM_DIR := $(dir $(firstword $(MAKEFILE_LIST))) #取得运行make 的目录

SDK_LIB_ARGS = $(addprefix -l,$(SDK_LIBS))

LIB_ARGS      = $(addprefix -l,$(LIBS))

PROGRAM_OUT  = $(BUILD_DIR)$(PROGRAM).out

LDFLAGS      += $(addprefix -T,$(LINKER_SCRIPTS))

FW_FILE = $(addprefix $(FIRMWARE_DIR),$(PROGRAM).bin)


___________________________________________________________________________


最新的IDF RTOS3.1 版本支持8285 

记得FLASH 使用四博智联的模块必须选择DOUT 方式,否则:如下


推荐阅读更多精彩内容