请教关于分散加载原理的一个问题
本帖最后由 lwplwp2 于 2018-4-24 15:51 编辑若我通过配置scatter文件将固件的加载地址和执行地址分开,比如我将固件加载到flash中0x60002400,但是运行地址配置为内部RAM中0x0000000。那么其将指令从存储位置0x60002400拷贝到0x0000000去运行这个过程是如何实现的?是在什么时候去做的?
有没有大佬可以指点一二,或者有什么文档可以参考.{:13:}
这种复制没用的,因为编译器编译好的程序都是固定位置执行的,编译好的程序不能随意下载到另外一个位置执行。你这种要求的得自己搞个boot和app,太麻烦。
看我这里提供的超简单方法:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86206&extra=page%3D1 scatter文件中应该可以指定加载段和执行段。编译器会自动生成复制代码到运行空间的,这个是在进入到 main函数之前就做好的。不需要手动复制。 startup里会有一小段复制数据段的操作,比如把.textrw类型的数据全都从flash加载到ram中,就是在此时完成的。
一般startup里要执行的内容:
1. 关掉Watch Dog,关掉全局中断
2. 拷贝中断向量表,初始化堆栈指针
3. 初始化fpu
4. 拷贝需要在内存里操作的数据段(比如全局变量,ram func,还有程序员自己在链接脚本中指定需要加载到这个区间的数据)
5. 加载main的entry,程序跳转到main函数,开始执行用户程序 armfly 发表于 2018-4-24 16:12
scatter文件中应该可以指定加载段和执行段。编译器会自动生成复制代码到运行空间的,这个是在进入到 main ...
分散加载设置没有手工设置灵活,比如我这里生成的一个H7的例子,需要单独管理每个文件,非常不方便。
LR_IROM1 0x08000000 0x00200000{ ; load region size_region
ER_IROM1 0x08000000 0x00200000{; load address = execution address
*.o (RESET, +First)
*(InRoot$Sections)
.ANY (+RO)
}
RW_IRAM1 0x20000400 0x0001FC00{; RW data
.ANY (+RW +ZI)
}
RW_IRAM2 0x00000000 0x00010000{
MainRAM.o (+RO)
bsp.o (+RO)
bsp_led.o (+RO)
bsp_key.o (+RO)
bsp_uart.o (+RO)
bsp_timer.o (+RO)
stm32h7xx_it.o (+RO)
stm32h7xx_nucleo_144.o (+RO)
stm32h7xx_hal_timebase_tim.o (+RO)
stm32h7xx_hal.o (+RO)
stm32h7xx_hal_cortex.o (+RO)
stm32h7xx_hal_rcc.o (+RO)
stm32h7xx_hal_gpio.o (+RO)
stm32h7xx_hal_adc.o (+RO)
stm32h7xx_hal_spi.o (+RO)
stm32h7xx_hal_adc_ex.o (+RO)
stm32h7xx_hal_rcc_ex.o (+RO)
stm32h7xx_hal_dma.o (+RO)
stm32h7xx_hal_dma_ex.o (+RO)
stm32h7xx_hal_tim.o (+RO)
stm32h7xx_hal_tim_ex.o (+RO)
stm32h7xx_hal_uart.o (+RO)
stm32h7xx_hal_uart_ex.o (+RO)
stm32h7xx_hal_usart.o (+RO)
}
}
alexyzhov 发表于 2018-4-24 16:20
startup里会有一小段复制数据段的操作,比如把.textrw类型的数据全都从flash加载到ram中,就是在此时完成的 ...
看我二楼的,超级方便。想放那个就放那个,重点是灵活:handshake eric2013 发表于 2018-4-24 16:23
看我二楼的,超级方便。想放那个就放那个,重点是灵活
这个手动设置和分散加载的工作原理是一样的吗(只是能够更方便的配置),其也是在startup中去把数据加载到内部ram中吧? alexyzhov 发表于 2018-4-24 16:20
startup里会有一小段复制数据段的操作,比如把.textrw类型的数据全都从flash加载到ram中,就是在此时完成的 ...
嗯我去看一下startup,感谢指点!{:8:} lwplwp2 发表于 2018-4-24 16:29
这个手动设置和分散加载的工作原理是一样的吗(只是能够更方便的配置),其也是在startup中去把数据加载 ...
本质就是分散加载,这种设置后就会生成一个分散加载文件,你设置好即可,其它都不用管,编译器会处理。 eric2013 发表于 2018-4-24 16:30
本质就是分散加载,这种设置后就会生成一个分散加载文件,你设置好即可,其它都不用管,编译器会处理。
感谢,从这里去手动设置确实方便很多! armfly 发表于 2018-4-24 16:12
scatter文件中应该可以指定加载段和执行段。编译器会自动生成复制代码到运行空间的,这个是在进入到 main ...
嗯感谢指点! eric2013 发表于 2018-4-24 16:22
分散加载设置没有手工设置灵活,比如我这里生成的一个H7的例子,需要单独管理每个文件,非常不方便。
...
RW_IRAM2 不用把每个文件都列出来把?? xieyang__ 发表于 2018-4-25 09:07
RW_IRAM2 不用把每个文件都列出来把??
是的,单独设置分散加载很麻烦。你的指定要操作的文件。
页:
[1]