ESP8266 flash布局(layout)
支持flash为512KB, 1M, 2M, 4M.
4KB为1个扇区,也就是16进制的0x1000.
非OTA布局
a) 前256KB烧写主程序+用户数据+用户参数, 主程序文件名eagle.flash.bin, 最大64KB, 用户参数占用最后4个扇区, 共16KB
b) 后面的部分, 烧写主程序+用户数据+系统参数, 主程序文件名 eagle.irom0text.bin, 最大768KB, 默认200KB. 系统参数占用最后4个扇区, 共16KB.sdk提供. 依次为:
b1) 初始化射频参数,1个扇区, esp_init_data_default.bin
b2) 初始化系统参数,2个扇区, blnk.bin
b3) bootloader, 1个扇区.OTA布局
a) 可选前段是256KB, 512KB, 1MB, 后段至少要大于等于前段的大小.
b) 前段包括启动程序+主程序+用户数据+用户参数(后两个扇区为云端KEY). 启动程序boot.bin为4KB, 主程序user1.bin, 用户参数4个扇区16KB的后两个扇区存储乐鑫云端KEY master_device_key.bin
c) 后段包括预留区+主程序+用户数据+系统参数. 预留区4KB, 与启动程序的4KB对应, 主程序user2.bin,实际上是云端下载的缓存区, 事实上也不需要烧录. 系统参数与非OTA布局的相同.布局文件的位置
在ESP8266_NONOS_SDK/ld/eagle.app.v6.ld中的MEMORY字段.eagle.flash.bin和eagle.irom0text.bin的构成
eagle.flash.bin是用于存储直接读取到程序内存运行的程序段和数据内存的数据段的.
eagle.irom0text.bin是用于存储放在flash上, 不直接读取到内存中的程序段的.
程序内存:iram, internal ram, 通过ibus访问, 共32KB, 存放编译后的elf的TEXT字段
数据内存:dram, data ram, 通过 dbus访问, 可能是80kb或者96kb. 存放编译后的elf的data, rodata字段, 这部分字段可用约50kB. 其他的空间用于存放BBS, stack, heap.
FLASH存储: irom, 最大768KB, 存放编译后的elf的irom0.text字段, C源码函数前面有ICACHE_FLASH_ATTR前缀的就是说这个函数是放在irom中的. 另, 最大768KB的原因是, irom起始于256KB处, esp8266最大访问1MB程序段, 故1MB - 256KB = 768KB.
具体需要看(sdk中的eagle.app.v6.ld文件)[https://github.com/espressif/ESP8266_RTOS_SDK/blob/master/ld/eagle.app.v6.ld]对这几个存储的地址和大小的分配, 例如:
MEMORY
{
dport0_0_seg : org = 0x3FF00000, len = 0x10
dram0_0_seg : org = 0x3FFE8000, len = 0x18000
iram1_0_seg : org = 0x40100000, len = 0x8000
irom0_0_seg : org = 0x40220000, len = 0x5C000
}
- 编译术语
BBS block started By Symbol. 存放未初始化的全局变量, 静态分配
data 已经初始化的全局变量, 静态分配
text 程序执行代码
rodata 字符串与#define常量
heap 堆,动态分配的内存段(malloc, free)
stack 栈, 临时局部变量, 函数调用栈
常量段, 编译器产生的数据
参考(ESP8266_NONOS_SDK开发包生成的镜像文件构建步骤分析)[http://blog.csdn.net/yannanxiu/article/details/51371798]
(bss,data,text,rodata,堆,栈,常量段)[http://blog.csdn.net/ouyang_linux007/article/details/7448814]