解读 ESP32 API参考-system-App Image Format


esp32官网链接

App Image Format

在这里插入图片描述
(以下内容均为个人理解,非官方解读!)
这里介绍了两个数据结构,应该是用来管理外存(spi flash)。
一个是esp_image_header_t 这个是记录整个spi flash的一些信息,包括一些spi的模式、速度等等,还有flash的段个数等信息。
esp32 的spi flash管理是利用段式分配的方案,每段的前几个字节使用数据结构存储了段的首地址和长度。
esp_image_header_t 应该是从spi flash的0地址空间开始存储的,因为由 offset for 0 Segment = sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t).
这个公式,可以发现0号段的起始地址为esp_image_header_t 的大小加上0号段自身描述结构体(esp_image_segment_header_t)的大小,也就是说真正可以使用的地址空间在header结构体之后。此外,由此公式,我们还可以得出,spi flash的访问只能是顺序访问,即若要访问第n段,需要将前n-1段全部访问一遍(实际上只要访问前几个字节得到段长和起始地址即可)。
启发:在使用spi flash时应该将经常访问的数据放在较小的段号上,以提高查找效率。
记录最大段数的宏定义:ESP_IMAGE_MAX_SEGMENTS

To get the list of your image segments, please run the following command:
用这个命令可以获取当前所有的段
esptool.py --chip esp32 image_info build/app.bin
在这里插入图片描述
当然,esp32复位时也会输出类似的信息。

Application Description

在这里插入图片描述
这里介绍了一个用于记录DROM信息的结构体,esp_app_dest_t 结构体变量如上图,主要是一些版本信息和编译时间等等,其中project_name最大长度是32字节,超出的字符会被忽略。

由上一节列出的各个段的信息,可以看出DROM是在第0号段的位置,所以在OTA的时候,因为其存储了版本信息等,可以只读到第一个段的时候就来判断是否需要升级。

Adding a Custom Structure to an Application

在这里插入图片描述
用户还可以定义自己的结构体用来描述信息,定义方法是:
const attribute((section(".rodata_custom_desc"))) esp_custom_app_desc_t custom_app_desc = { … }
其中
esp_custom_app_desc_t 应该是要自己定义的数据结构。
上面的代码只是做一个声明变量并初始化的操作。
例如:

// 自定义类型
typedef struct esp_custom_app_desc_t {
	char app_author_name[12];
}esp_custom_app_desc_t ;
//声明变量 使用这个const __attribute__((section(".rodata_custom_desc")))
//可以让你的结构体定义在指定位置 
const __attribute__((section(".rodata_custom_desc"))) esp_custom_app_desc_t custom_app_desc = {.app_author_name="xjx"}

具体来说,自定义结构体应该是存储在第0段,也就是DROM上的,由公式:
Offset for custom structure is sizeof(esp_image_header_t) + sizeof(esp_image_segment_header_t) + sizeof(esp_app_desc_t).
可以得出。
此外,为了保证你的自定义的数据结构确实是在DROM的前面,还需要做以下两个操作。
1: 在这个文件中:component.mk
添加这一行:
COMPONENT_ADD_LDFLAGS += -u custom_app_desc

2: 在这个文件中:CMakeLists.txt
添加这一行:
target_link_libraries(${COMPONENT_TARGET} “-u custom_app_desc”)

注意:如果你声明的时候,结构体名不是custom_app_desc,以上两个里面也要改。建议还是就用custom_app_desc这个名字,省得折腾

总结

esp32的外存包括DROM和SPI flash ,采用段式分配。
DROM在0号段(第一段),esp_app_dest_t 这个结构体在第一段,用来存储一些版本信息等。
用户也可以自定义结构体存储在DROM前面

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值