打印
[STM32F1]

关于startup_stm32f10x_hd.s 和stm32f10x_flash.icf 的几个疑问

[复制链接]
2155|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 我听闻 于 2016-12-8 11:29 编辑

  • 在版本号为V3.1.0标准库中,startup_stm32f10x_hd.s 中对于堆栈顶的地址 在75行 有这样的一句话
    __intial_sp EQU 0x20000400</font>
    从工程生成的bin文件来看,栈顶地址确实是0x20000400,但是从.map文件来看,栈的地址范围为0x20000688 -0x20000a88,这两处不一致,而程序正常,这是为什么?
    CSTACK$Base            0x20000688           --   Gb  - Linker created -
    CSTACK$Limit           0x20000a88           --   Gb  - Linker created -</font>

  • 看了一些工程,有些stm32f10x_flash.icf中,定义ROM的范围时,开始的地址是从0x08003000,而不是标准的0x08000000,那么烧写bin文件的时候,会自动从0x08003000开始烧写么? 然后就是在启动配置中,从主闪存存储器启动时,主闪存存储器被映射到启动空间(0x0000 0000),这个时候能识别从0x08003000开始的代码区么?
    /*-Specials-*/
    define symbol __ICFEDIT_intvec_start__ = 0x08003000;
    /*-Memory Regions-*/
    define symbol __ICFEDIT_region_ROM_start__ = 0x08003000;
    define symbol __ICFEDIT_region_ROM_end__   = 0x0807FFFF;
    define symbol __ICFEDIT_region_RAM_start__ = 0x20000000;
    define symbol __ICFEDIT_region_RAM_end__   = 0x2000FFFF;</font>

沙发
feelhyq| | 2016-12-8 12:36 | 只看该作者
栈顶指针通常不要去指定在哪个地址,而是指定栈大小。因为一个Bin文件编译出来后运行时的区域段依次为 代码段(RO)+已经初始化全局变量段(RW)+ZI段 + 堆 + 栈,站栈顶指针正好指在运行时区域的最高点,因此栈顶指针位置跟全局变量的多少,栈的大小都有直接关系。如果指定的栈顶指针正好指在全局变量区域或者堆区域,就有问题了。

使用特权

评论回复
板凳
feelhyq| | 2016-12-8 12:38 | 只看该作者
针对第二个问题,人为可以控制bin文件烧写在flash中的位置,因为STM32的flash是可编程修改的。

使用特权

评论回复
地板
quray1985| | 2016-12-8 13:47 | 只看该作者
这个是不是得对应着表flash表来看呢

使用特权

评论回复
5
我听闻|  楼主 | 2016-12-8 14:02 | 只看该作者
feelhyq 发表于 2016-12-8 12:36
栈顶指针通常不要去指定在哪个地址,而是指定栈大小。因为一个Bin文件编译出来后运行时的区域段依次为 代码 ...

系统开始运行,从flash启动,先从地址0x0000 0000获取堆栈顶的地址,所以这个应该是栈在 ram中的结束地址,就是.map中的0x2000 0a88,您所说的“是指定栈的大小”应该是不对的。不知道我理解对不对

使用特权

评论回复
6
我听闻|  楼主 | 2016-12-8 14:15 | 只看该作者
feelhyq 发表于 2016-12-8 12:38
针对第二个问题,人为可以控制bin文件烧写在flash中的位置,因为STM32的flash是可编程修改的。 ...

烧写是可以人为控制,这工程配置是可以解决。我看数据手册说的是 闪存存储器启动是 主闪存存储器被映射到启动空间(0x00000000),即闪存存储器的内容可以在两个地址区域访问, 0x00000000或0x0800 0000。按我上面的工程,偏移的0x3000,单片机是怎么识别的。

使用特权

评论回复
7
feelhyq| | 2016-12-8 14:35 | 只看该作者
本帖最后由 feelhyq 于 2016-12-8 14:38 编辑
STM的启动代码 .S文件中,通常设置栈的大小,栈顶指针并不是一定要指向RAM区域的最高地址,栈顶指针可以指向任何RAM中可以被利用的位置(该片RAM位置没有存放代码段,数据段,全局变量段,堆)

使用特权

评论回复
8
feelhyq| | 2016-12-8 14:39 | 只看该作者
我听闻 发表于 2016-12-8 14:15
烧写是可以人为控制,这工程配置是可以解决。我看数据手册说的是 闪存存储器启动是 主闪存存储器被映射到 ...

STM32里面的Flash类似于一块NORflash,里面自带操作这块flash的寄存器,包括读,写,擦除,具体你去看看芯片手册,讲得很清楚了

使用特权

评论回复
9
feelhyq| | 2016-12-8 14:42 | 只看该作者
我听闻 发表于 2016-12-8 14:02
系统开始运行,从flash启动,先从地址0x0000 0000获取堆栈顶的地址,所以这个应该是栈在 ram中的结束地址 ...

QQ截图20161208144224.png (14.37 KB )

QQ截图20161208144224.png

使用特权

评论回复
10
zhanzr21| | 2016-12-8 18:22 | 只看该作者
我听闻 发表于 2016-12-8 14:15
烧写是可以人为控制,这工程配置是可以解决。我看数据手册说的是 闪存存储器启动是 主闪存存储器被映射到 ...

如果有偏移,就是另外有boot的

使用特权

评论回复
11
我听闻|  楼主 | 2016-12-9 08:41 | 只看该作者
zhanzr21 发表于 2016-12-8 18:22
如果有偏移,就是另外有boot的

程序的执行不都是从0地址开始的么,f1的boot有三种,主闪存,system memory和sram。您这里说的另外的boot是指什么勒?

使用特权

评论回复
12
我听闻|  楼主 | 2016-12-9 08:42 | 只看该作者
feelhyq 发表于 2016-12-8 14:39
STM32里面的Flash类似于一块NORflash,里面自带操作这块flash的寄存器,包括读,写,擦除,具体你去看看 ...

不知道是不是我说的不清楚。。。

使用特权

评论回复
13
feelhyq| | 2016-12-9 09:02 | 只看该作者
STM32F1的片子通常情况下从0x08000000开始的,0x08000000存放的就是你说的栈顶指针,0x08000004开始存放的中断向量表

使用特权

评论回复
14
我听闻|  楼主 | 2016-12-9 09:31 | 只看该作者
feelhyq 发表于 2016-12-9 09:02
STM32F1的片子通常情况下从0x08000000开始的,0x08000000存放的就是你说的栈顶指针,0x08000004开始存放的 ...

对是这样!
您看我上面 flash的配置 程序开始的地址是0x08003000,这个跳转是怎么实现的勒

使用特权

评论回复
15
feelhyq| | 2016-12-9 09:54 | 只看该作者
STM32固定式从0x08000000开始执行代码,因此上电后直接从0x08003000是不可能的(除非是调试模式,指定PC寄存器值为0x08003000)。 通常的要想跳转到指定的地址可以通过汇编和C语言实现

C语言:
          void(* function)(void);
          function = (void (*)(void))0x08003000;
          function();

汇编(cortex-M系列的芯片通常使用Thumb指令跳转):
           ldr r0, =0x08003000
           BX r0

         

使用特权

评论回复
16
我听闻|  楼主 | 2016-12-9 10:46 | 只看该作者
feelhyq 发表于 2016-12-9 09:54
STM32固定式从0x08000000开始执行代码,因此上电后直接从0x08003000是不可能的(除非是调试模式,指定PC寄存 ...

看来是我那里理解出错了,应该是0x08000000处是有一段代码的,这段代码实现了对0x08003000的跳转。谢谢

使用特权

评论回复
17
feelhyq| | 2016-12-9 11:09 | 只看该作者
不客气,我们公司自己做cortex-M内核的芯片,我们的片子从0地址开始执行的,每个厂家的不一样

使用特权

评论回复
18
我听闻|  楼主 | 2016-12-9 13:16 | 只看该作者
感谢大家的回答,结个贴。理解了之后,才发现版主一语中的,自己的修为还不够,加油

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

42

帖子

0

粉丝