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的位置最好不要使用原因参考下图
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 方式,否则:如下