esp8266 rtos sdk编译后flash镜像构成
由于官方文件没有说明esp8266的启动特点,本文根据sdk内的flash map文档,sdk makefile,ld文件及flash image 生成的python脚本文件,简要分析esp8266的启动和运行,及flash镜像的构成特点。这里使用的sdk和编译时配置项见esp8266 rtos sdk在小黄板上的使用 ##sdk生成的elf文件 这里主要分析sdk根目录下的makefile文件就可以得到elf相关信息。
LD_FILE = $(LDDIR)/eagle.app.v6.ld eagle.app.v6.ld可以看到 MEMORY { dport0_0_seg : org = 0x3FF00000,len = 0x10 dram0_0_seg : org = 0x3FFE8000,len = 0x14000 iram1_0_seg : org = 0x40100000,len = 0x8000 irom0_0_seg : org = 0x40240000,len = 0x3C000 } sdk编译过程中会先生成eagle.app.v6.out,然后dump出段信息和符号文件 @$(RM) -r ../bin/eagle.S ../bin/eagle.dump @$(OBJDUMP) -x -s $< > ../bin/eagle.dump @$(OBJDUMP) -S $< > ../bin/eagle.S 从eagle.dump中可以找到对实际运行有效的5个section: Idx Name Size VMA LMA File off Algn 0 .data 00000634 3ffe8000 3ffe8000 000000e0 2**4 1 .rodata 000008b0 3ffe8640 3ffe8640 00000720 2**4 2 .bss 00006bc8 3ffe8ef0 3ffe8ef0 00000fd0 2**4 3 .text 0000776a 40100000 40100000 00000fd0 2**2 4 .irom0.text 00030928 40240000 40240000 00008740 2**4 结合ld文件的memory信息可以看到 .data,.rodata,.bbs都是放到dram0_0_seg中,.text是放到iram1_0_seg中,.irom0.text是放到irom0_0_seg中。 ##将elf文件转化为烧写镜像 ###makefile将以上各section copy成单个文件 $(OBJCOPY) --only-section .text -O binary $< eagle.app.v6.text.bin $(OBJCOPY) --only-section .data -O binary $< eagle.app.v6.data.bin $(OBJCOPY) --only-section .rodata -O binary $< eagle.app.v6.rodata.bin $(OBJCOPY) --only-section .irom0.text -O binary $< eagle.app.v6.irom0text.bin ###将section打包 然后使用gen_appbin.py脚本将eagle.app.v6.text.bin,eagle.app.v6.data.bin,eagle.app.v6.rodata.bin三个文件打包成一个eagle.app.flash.bin,命令为: python ../tools/gen_appbin.py $< 0 $(mode) $(freqdiv) $(size_map) 这里直接给出gen_appbin.py的各项参数 elf_file = sys.argv[1] >eagle.app.v6.out boot_mode = sys.argv[2] >0 flash_mode = sys.argv[3] >0 flash_clk_div = sys.argv[4] >0 flash_size_map = sys.argv[5] >4 BIN_MAGIC_IROM = 0xEA TEXT_ADDRESS = 0x40100000 打包过程简要:
call_user_start --> entry_addr >40100004 入口地址 _data_start --> data_start_addr >3ffe8000 .data段开始地址 _rodata_start --> rodata_start_addr >3ffe8640 .rodata段开始地址
HEAD0 = BIN_MAGIC_FLASH
##FLASH MAP 在数据下载后会写到SPI Flash内: eagle.flash.bin下载到0x00000处 eagle.irom0text.bin下载到0x40000处 ##irom说明 从前面可以看.text放到idram0中执行,但指令内存空间有限32K,所以在C代码中,使用ICACHE_FLASH_ATTR定义的函数将会放到irom0内,最后也就是放到了eagle.irom0text.bin,被放到SPI flash上的0x40000处。 #define ICACHE_FLASH_ATTR __attribute__((section(".irom0.text"))) ##启动和运行 现在可以来猜启动和运行的过程了:
由于片上ROM我们不能更改,因此编写代码时要遵循FLASH MAP地址和大小。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |