4759|6

1976

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

一直不清楚的Cotex-Mx处理器的启动代码堆栈分配问题 [复制链接]

       经常使用Cortext_M的MCU在作开发,本着先会用,再逐步深入理解的路子,开发的程序都能跑得起来。最近想做一做IAP的功能,这就涉及到Flash划分,装载文件自定义,中断向量表重映射等东西,这些算是比较高深的东西,之前没有接触过。打算先仔细研究一下startup.s这个使用汇编语言写的启动文件,一开始就遇到了问题,百度查找了一些资料,解释得不是很明白,特来请教论坛里的各位,先上图:


       我先描述一下问题:这里的堆和栈的分配有些看不明白,Stack_Mem   SPACE   Stack_Size,这条是能看懂,意思是分配Stack_Size大小的内存空间,类似于c语言的定义一个数组,但是这句代码之后的__initial_sp,这句代码按理说是标号,对应是地址,但是说明里却是说指向栈顶地址(实际上确实是指向栈顶地址),举个例子,假如Stack_Size等于16,内存从地址0开始分配,那Stack_Mem就占据了16*4=64字节的空间,那么__initial_sp的值等于68(0x0044)。我对标号的理解是标号对应的是当前代码的地址,但是从图上看__initial_sp后面没有代码了,它指向什么呢?从实际得到的结果是它确实是指向了栈顶地址,这个是正确的。我的疑问是这种标号的用法是与SPACE这个伪指令有关系吗?同样的,在堆空间的定义中也是一样问题,一开始的_heap_base,指向堆基地址,这种用法倒是符合我对标号用法的理解,_heap_limit指向堆的尾地址,这样的用法就和我上述的栈顶地址的用法就一样了。

可能大家要说我钻牛尖了,能用就行,何必纠结这些,但是我个人就是想弄明白,这样今后也能看懂类似这样用法的汇编代码,也可能今后自己会改动这个启动文件,不清楚的话总是会有隐患,还请各位知道这方面的坛友帮忙解答一下,先行谢过了。
此帖出自单片机论坛

最新回复

本帖最后由 freebsder 于 2018-3-24 19:50 编辑 你是问问题的,你不能用你的角度来觉得应该提供哪些不应该提供哪些,越多的信息越有用。比如,上面的keil,我不熟悉,这种辣鸡工具我也几乎不用,但是,并不妨碍我告诉你咋回事。 汇编也好,C也好,最后都要通过链接实际给定位置,称之为PIC,可不是microchip的PIC单片机。 连接器根据脚本装载空间,惯例是asm/c里面相同的区段从上到下依次装载,先来先装载,从上到下的意思是词法顺序谁先声明就是谁先。因为位置无关,所以不同asm/c的前后没有影响。连接器内部有一个计数器,每分配一个空间就往下挪动一个空间的距离,因此会有个当前地址,类似PC这个当前指令指针。你前面那什么标号什么的__initial_sp,连接器遇到了就把当前地址给这个符号,是符号,意思是同一个地址可以给多个符号。因为__initial_sp和__heap_base之间没有空间分配(这里不考虑下面的8字节对齐影响,你可以设置成4字节对齐看看是不是相等的),所以当前地址不变,所以__initial_sp和__heap_base是一个地址,最后的布局就是栈顶=堆底。 所以,不考虑8字节对齐,内存布局应该是这样的: PIC+0 PIC+0x400 -> __initial_sp PIC+0x400 -> __heap_base PIC+0x600 -> __heap_limit 至于为什么要你多提供信息,因为我自己百度看到同一个文件下面vector那里DCD __initial_sp 做为0中断,那就必然是上面那样了,对于贫道这种即便是一点不会keil只根据上下文猜,也不会偏差到哪里去。  详情 回复 发表于 2018-3-24 19:43
点赞 关注
 

回复
举报

7608

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 
就不能多截点图?又不费你空间,扣扣索索的,管中窥豹没这精力,帮不了你。
此帖出自单片机论坛

点评

感谢你的回复,我想你可能是误解了,我想了解的只是汇编语言上的用法而已,并不是对启动文件整体有问题,所以其他的图放上来没有什么意义,反倒会增加干扰  详情 回复 发表于 2018-3-24 13:30
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

板凳
 
IAR吧,你得同时提供链接文件。
此帖出自单片机论坛
 
 
 

回复

366

帖子

1

TA的资源

一粒金砂(高级)

4
 
The DCD directive allocates one or more words of memory, aligned on four-byte boundaries, and defines the initial runtime contents of the memory.
The SPACE directive reserves a zeroed block of memory.

首先从DCD和SPACE这两条指令的功能就可以看出来,DCD是申请内存而且赋初值,而SPACE是只申请空间,那么你申请了Stack_Size这么大的空间,总得再搞个初始地址出来吧,SPACE指令后面紧跟一个标号,就是告诉编译器,请给我一个地址,编译器看到了你后面有个标号,就会给你分配个地址,也就是__initial_sp。为什么会是0x68呢,因为你上来就是分配栈,而内存是从0开始分配的,所以前0x64个地址已经被你的SPACE给申请了,所以下一个地址紧接着编译器就分给了标号__initial_sp

此帖出自单片机论坛

点评

谢谢你的解答,照你这么说,这种用法是属于汇编语言的规则范筹。还是我举的那个例子,使用SAPCE伪指令申请一片空间,Stack_Mem应该也算是一个标号,对应的地址应该就是这片空间的起始地址0x0000吧?那在堆空间分配时  详情 回复 发表于 2018-3-24 13:38
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

5
 
freebsder 发表于 2018-3-23 18:22
就不能多截点图?又不费你空间,扣扣索索的,管中窥豹没这精力,帮不了你。

感谢你的回复,我想你可能是误解了,我想了解的只是汇编语言上的用法而已,并不是对启动文件整体有问题,所以其他的图放上来没有什么意义,反倒会增加干扰
此帖出自单片机论坛

点评

你是问问题的,你不能用你的角度来觉得应该提供哪些不应该提供哪些,越多的信息越有用。比如,上面的keil,我不熟悉,这种辣鸡工具我也几乎不用,但是,并不妨碍我告诉你咋回事。 汇编也好,C也好,最后都要通过链  详情 回复 发表于 2018-3-24 19:43
 
 
 

回复

1976

帖子

0

TA的资源

五彩晶圆(初级)

6
 
飞翔荷兰人号 发表于 2018-3-24 00:54
The DCD directive allocates one or more words of memory, aligned on four-byte boundaries, and define ...

谢谢你的解答,照你这么说,这种用法是属于汇编语言的规则范筹。还是我举的那个例子,使用SAPCE伪指令申请一片空间,Stack_Mem应该也算是一个标号,对应的地址应该就是这片空间的起始地址0x0000吧?那在堆空间分配时,在分配Heap_Mem时,先有了__heap_base这个标号,那这个标号的地址是等于Heap_Mem空间起始地址减去4?
此帖出自单片机论坛
 
 
 

回复

7608

帖子

2

TA的资源

五彩晶圆(高级)

7
 
本帖最后由 freebsder 于 2018-3-24 19:50 编辑
bobde163 发表于 2018-3-24 13:30
感谢你的回复,我想你可能是误解了,我想了解的只是汇编语言上的用法而已,并不是对启动文件整体有问题, ...

你是问问题的,你不能用你的角度来觉得应该提供哪些不应该提供哪些,越多的信息越有用。比如,上面的keil,我不熟悉,这种辣鸡工具我也几乎不用,但是,并不妨碍我告诉你咋回事。
汇编也好,C也好,最后都要通过链接实际给定位置,称之为PIC,可不是microchip的PIC单片机。
连接器根据脚本装载空间,惯例是asm/c里面相同的区段从上到下依次装载,先来先装载,从上到下的意思是词法顺序谁先声明就是谁先。因为位置无关,所以不同asm/c的前后没有影响。连接器内部有一个计数器,每分配一个空间就往下挪动一个空间的距离,因此会有个当前地址,类似PC这个当前指令指针。你前面那什么标号什么的__initial_sp,连接器遇到了就把当前地址给这个符号,是符号,意思是同一个地址可以给多个符号。因为__initial_sp和__heap_base之间没有空间分配(这里不考虑下面的8字节对齐影响,你可以设置成4字节对齐看看是不是相等的),所以当前地址不变,所以__initial_sp和__heap_base是一个地址,最后的布局就是栈顶=堆底。
所以,不考虑8字节对齐,内存布局应该是这样的:
PIC+0
PIC+0x400 -> __initial_sp
PIC+0x400 -> __heap_base
PIC+0x600 -> __heap_limit

至于为什么要你多提供信息,因为我自己百度看到同一个文件下面vector那里DCD __initial_sp 做为0中断,那就必然是上面那样了,对于贫道这种即便是一点不会keil只根据上下文猜,也不会偏差到哪里去。
此帖出自单片机论坛
 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表