硬汉嵌入式论坛

 找回密码
 立即注册
查看: 2301|回复: 12
收起左侧

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

[复制链接]

4

主题

40

回帖

194

积分

初级会员

积分
194
发表于 2018-4-24 15:49:19 | 显示全部楼层 |阅读模式
本帖最后由 lwplwp2 于 2018-4-24 15:51 编辑

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-4-24 16:07:56 | 显示全部楼层
这种复制没用的,因为编译器编译好的程序都是固定位置执行的,编译好的程序不能随意下载到另外一个位置执行。你这种要求的得自己搞个boot和app,太麻烦。

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

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2018-4-24 16:12:32 | 显示全部楼层
scatter文件中应该可以指定加载段和执行段。  编译器会自动生成复制代码到运行空间的,这个是在进入到 main函数之前就做好的。不需要手动复制。
回复

使用道具 举报

5

主题

196

回帖

211

积分

高级会员

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

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

分散加载设置没有手工设置灵活,比如我这里生成的一个H7的例子,需要单独管理每个文件,非常不方便。
  1. LR_IROM1 0x08000000 0x00200000  {    ; load region size_region
  2.   ER_IROM1 0x08000000 0x00200000  {  ; load address = execution address
  3.    *.o (RESET, +First)
  4.    *(InRoot$Sections)
  5.    .ANY (+RO)
  6.   }
  7.   RW_IRAM1 0x20000400 0x0001FC00  {  ; RW data
  8.    .ANY (+RW +ZI)
  9.   }
  10.   RW_IRAM2 0x00000000 0x00010000  {
  11.     MainRAM.o (+RO)
  12.     bsp.o (+RO)
  13.     bsp_led.o (+RO)
  14.     bsp_key.o (+RO)
  15.     bsp_uart.o (+RO)
  16.     bsp_timer.o (+RO)
  17.     stm32h7xx_it.o (+RO)
  18.     stm32h7xx_nucleo_144.o (+RO)
  19.     stm32h7xx_hal_timebase_tim.o (+RO)
  20.     stm32h7xx_hal.o (+RO)
  21.     stm32h7xx_hal_cortex.o (+RO)
  22.     stm32h7xx_hal_rcc.o (+RO)
  23.     stm32h7xx_hal_gpio.o (+RO)
  24.     stm32h7xx_hal_adc.o (+RO)
  25.     stm32h7xx_hal_spi.o (+RO)
  26.     stm32h7xx_hal_adc_ex.o (+RO)
  27.     stm32h7xx_hal_rcc_ex.o (+RO)
  28.     stm32h7xx_hal_dma.o (+RO)
  29.     stm32h7xx_hal_dma_ex.o (+RO)
  30.     stm32h7xx_hal_tim.o (+RO)
  31.     stm32h7xx_hal_tim_ex.o (+RO)
  32.     stm32h7xx_hal_uart.o (+RO)
  33.     stm32h7xx_hal_uart_ex.o (+RO)
  34.     stm32h7xx_hal_usart.o (+RO)
  35.   }
  36. }
复制代码





回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

看我二楼的,超级方便。想放那个就放那个,重点是灵活
回复

使用道具 举报

4

主题

40

回帖

194

积分

初级会员

积分
194
 楼主| 发表于 2018-4-24 16:29:09 | 显示全部楼层
eric2013 发表于 2018-4-24 16:23
看我二楼的,超级方便。想放那个就放那个,重点是灵活

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

使用道具 举报

4

主题

40

回帖

194

积分

初级会员

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

嗯我去看一下startup,感谢指点!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

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

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

使用道具 举报

4

主题

40

回帖

194

积分

初级会员

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

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

使用道具 举报

4

主题

40

回帖

194

积分

初级会员

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

嗯感谢指点!
回复

使用道具 举报

17

主题

248

回帖

299

积分

高级会员

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

...

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

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107157
QQ
发表于 2018-4-25 10:04:15 | 显示全部楼层
xieyang__ 发表于 2018-4-25 09:07
RW_IRAM2 不用把每个文件都列出来把??

是的,单独设置分散加载很麻烦。你的指定要操作的文件。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-20 17:54 , Processed in 0.193203 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表