lwplwp2 发表于 2018-4-24 15:49:19

请教关于分散加载原理的一个问题

本帖最后由 lwplwp2 于 2018-4-24 15:51 编辑

若我通过配置scatter文件将固件的加载地址和执行地址分开,比如我将固件加载到flash中0x60002400,但是运行地址配置为内部RAM中0x0000000。那么其将指令从存储位置0x60002400拷贝到0x0000000去运行这个过程是如何实现的?是在什么时候去做的?
有没有大佬可以指点一二,或者有什么文档可以参考.{:13:}

eric2013 发表于 2018-4-24 16:07:56

这种复制没用的,因为编译器编译好的程序都是固定位置执行的,编译好的程序不能随意下载到另外一个位置执行。你这种要求的得自己搞个boot和app,太麻烦。

看我这里提供的超简单方法:http://www.armbbs.cn/forum.php?mod=viewthread&tid=86206&extra=page%3D1

armfly 发表于 2018-4-24 16:12:32

scatter文件中应该可以指定加载段和执行段。编译器会自动生成复制代码到运行空间的,这个是在进入到 main函数之前就做好的。不需要手动复制。

alexyzhov 发表于 2018-4-24 16:20:36

startup里会有一小段复制数据段的操作,比如把.textrw类型的数据全都从flash加载到ram中,就是在此时完成的。

一般startup里要执行的内容:
1. 关掉Watch Dog,关掉全局中断
2. 拷贝中断向量表,初始化堆栈指针
3. 初始化fpu
4. 拷贝需要在内存里操作的数据段(比如全局变量,ram func,还有程序员自己在链接脚本中指定需要加载到这个区间的数据)
5. 加载main的entry,程序跳转到main函数,开始执行用户程序

eric2013 发表于 2018-4-24 16:22:35

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)
}
}




eric2013 发表于 2018-4-24 16:23:29

alexyzhov 发表于 2018-4-24 16:20
startup里会有一小段复制数据段的操作,比如把.textrw类型的数据全都从flash加载到ram中,就是在此时完成的 ...
看我二楼的,超级方便。想放那个就放那个,重点是灵活:handshake

lwplwp2 发表于 2018-4-24 16:29:09

eric2013 发表于 2018-4-24 16:23
看我二楼的,超级方便。想放那个就放那个,重点是灵活

这个手动设置和分散加载的工作原理是一样的吗(只是能够更方便的配置),其也是在startup中去把数据加载到内部ram中吧?

lwplwp2 发表于 2018-4-24 16:30:13

alexyzhov 发表于 2018-4-24 16:20
startup里会有一小段复制数据段的操作,比如把.textrw类型的数据全都从flash加载到ram中,就是在此时完成的 ...

嗯我去看一下startup,感谢指点!{:8:}

eric2013 发表于 2018-4-24 16:30:44

lwplwp2 发表于 2018-4-24 16:29
这个手动设置和分散加载的工作原理是一样的吗(只是能够更方便的配置),其也是在startup中去把数据加载 ...

本质就是分散加载,这种设置后就会生成一个分散加载文件,你设置好即可,其它都不用管,编译器会处理。

lwplwp2 发表于 2018-4-24 16:34:53

eric2013 发表于 2018-4-24 16:30
本质就是分散加载,这种设置后就会生成一个分散加载文件,你设置好即可,其它都不用管,编译器会处理。

感谢,从这里去手动设置确实方便很多!

lwplwp2 发表于 2018-4-24 16:42:43

armfly 发表于 2018-4-24 16:12
scatter文件中应该可以指定加载段和执行段。编译器会自动生成复制代码到运行空间的,这个是在进入到 main ...

嗯感谢指点!

xieyang__ 发表于 2018-4-25 09:07:46

eric2013 发表于 2018-4-24 16:22
分散加载设置没有手工设置灵活,比如我这里生成的一个H7的例子,需要单独管理每个文件,非常不方便。

...

RW_IRAM2 不用把每个文件都列出来把??

eric2013 发表于 2018-4-25 10:04:15

xieyang__ 发表于 2018-4-25 09:07
RW_IRAM2 不用把每个文件都列出来把??

是的,单独设置分散加载很麻烦。你的指定要操作的文件。
页: [1]
查看完整版本: 请教关于分散加载原理的一个问题