野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14166|回复: 3

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

[复制链接]
发表于 2019-3-21 21:07:36 | 显示全部楼层 |阅读模式
有用到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,只是具备初始化堆栈以及全局变量的能力,不具备分段程序加载的能力。
望有懂这一块的大佬赐教。
回复

使用道具 举报

发表于 2019-3-22 08:39:59 | 显示全部楼层
__main主要是负责把ROM里的代码加载到sct文件配置的位置
回复 支持 反对

使用道具 举报

发表于 2019-4-22 14:28:49 | 显示全部楼层
你可以借鉴一下RT1052的启动过程,你的boot和你的可执行代码关系是独立的,需要在外部ROM里面的固定地址存放一些固定的配置信息,比如:初始化某个硬件的参数结构体(SDRAM)、你的代码有多大,代码应该搬移到哪个地址,这个地址就是你可执行代码的scf中code的地址。boot是一个独立的代码,它自己的__main函数只初始化它自己的堆栈和变量,接下来就是根据配置信息初始化硬件、搬移代码;然后跳转到可执行代码的入口地址,这是boot就退出了,由可执行代码自身的__mian函数再次初始化堆栈和变量,然后就开始执行了,大概就是这么个过程。
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-22 08:54 , Processed in 0.038132 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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