硬汉嵌入式论坛

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

[STM32H750] 发个求助贴 关于STM32H750,自己做boot处理分段加载

[复制链接]

3

主题

34

回帖

43

积分

新手上路

积分
43
发表于 2019-3-21 21:04:58 | 显示全部楼层 |阅读模式
有用到STM32H750VB这个芯片,内部是128Kflash,这个flash用来做boot程序(自己写的),QSPI口有接,但是不是接的QSPI flash,而且也没打算把程序放到QSPI口的存储器上,程序打算放到内部的AXI RAM,总共512K,但是程序还是少了一些,所以打算把SRAM1 SRAM2的256K也用上。
这里就遇到一个些疑惑:
传说中的__main函数是负责初始化堆栈,以及分段加载代码的加载到指定位置,对,就是这里让我很疑惑,__main初始化堆栈,这个我没有异议,但是__main真的做了程序分段加载这个事情吗?
如果它确实在做了这个分段加载的事情,它加载程序的源在哪里?目标位置又在哪里?
根据以前的知识了解,映像文件里,除了一开始的中断向量表,就是接下来的实体程序内容了,实体程序内容当然也包括__main这个函数的内容,__main应该不会每次编译都重新生成编译一次,所以,__main,理论上,是不应该知道生成的那一堆实体程序,到底哪部分该搬运到哪里去。
而且,以以前使用别的芯片的经验,比如LPC系列的单片机,也是用keil开发,也包含__main,但是芯片的flash是分为两个分离地址的内部flash,烧录的时候,keil是调用不同的FLM文件进行烧录的。我们假设,__main确实包含了分段程序加载能力,那么它要加载的目标位置是flash,__main属于标准库一类的函数,就算能加载,也应该是使用一些类似memcpy之类的函数,根本不具备能力,操纵flash。
所以,擦侧,__main,只是具备初始化堆栈以及全局变量的能力,不具备分段程序加载的能力。
望有懂这一块的大佬赐教。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106746
QQ
发表于 2019-3-22 03:01:32 | 显示全部楼层
这个涉及到分散加载文件,需要文档的话,搜编译器的分散加载文档看。

编译器有个加载域和执行域的问题,加载域是实际下载到Flash里面的,你的RO, RW全部在Flash里面,上电后根据用户的分散加载设置,会执行复制粘贴操作,RW数据会复制到你的RAM区,ZI数据在RAM区开辟空间。

如果你的RO代码设置在了RAM区,也会复制。

此贴:
【STM32H743实验例程】实验11:程序在ITCM执行,中断向量表和所有变量全部放在DTCM,方法很简单--原创
http://www.armbbs.cn/forum.ph ... id=86207&fromuid=58
(出处: 安富莱电子论坛)

回复

使用道具 举报

3

主题

34

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2019-3-24 16:28:32 | 显示全部楼层
eric2013 发表于 2019-3-22 03:01
这个涉及到分散加载文件,需要文档的话,搜编译器的分散加载文档看。

编译器有个加载域和执行域的问题, ...

理解了,感谢硬汉
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-3 22:40 , Processed in 0.247847 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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