OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

楼主: 正点原子

STM32 大小端模式 与 堆栈及其增长方向分析

  [复制链接]

  离线 

78

主题

902

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1514
金钱
1514
注册时间
2013-4-15
在线时间
105 小时
发表于 2015-8-27 14:17:06 | 显示全部楼层
正点原子公众号
回复【88楼】正点原子:
---------------------------------
回复【50楼】正点原子:
---------------------------------
静态区不连续的吗?是不是这样的顺序:从0x2000 0000开始,依次是静态区(0x2000 0000开始的)、堆区、栈区(栈顶:0x2000 0940)、静态区(总尺寸-1>地址>0x2000 0940的区域)
合肥-文盲
回复 支持 反对

使用道具 举报

  离线 

485

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
120217
金钱
120217
注册时间
2010-12-1
在线时间
958 小时
 楼主| 发表于 2015-8-27 22:39:24 | 显示全部楼层
回复【151楼】合肥-文盲:
---------------------------------
是连续的,只不过有一些字节对其的情况,会占用掉一些内存。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复 支持 反对

使用道具 举报

  离线 

78

主题

902

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1514
金钱
1514
注册时间
2013-4-15
在线时间
105 小时
发表于 2015-8-28 08:45:52 | 显示全部楼层
回复【152楼】正点原子:
---------------------------------
对的  是连续的  对齐可能会多用2-3个字节,从0x2000 0000开始,顺序就是静态区、堆区、栈区
合肥-文盲
回复 支持 反对

使用道具 举报

  离线 

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2015-5-4
在线时间
32 小时
发表于 2015-11-2 15:00:50 | 显示全部楼层
 回复【4楼】 正点原子 :
---------------------------------
原子大哥,


上图中,RO:常量所占空间
RW:程序中已经初始化的变量所占空间
ZI:未初始化的static变量和全局变量以及堆栈所占的空间

test.c中 stack_dircpu_endian都是未初始化的static变量,为什么是ZI-data=0,RW-data=6呢?

//保存栈增长方向
//0,向下增长;1,向上增长.
static u8 stack_dir;

//CPU大小端
//0,小端模式;1,大端模式.
static u8 cpu_endian;


回复 支持 反对

使用道具 举报

  离线 

485

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
120217
金钱
120217
注册时间
2010-12-1
在线时间
958 小时
 楼主| 发表于 2015-11-2 21:56:46 | 显示全部楼层
回复【154楼】shblh:
---------------------------------
因为他们是函数内局部变量,存放在堆栈里面,动态处理的.不体现在最终的编译结果里面
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复 支持 反对

使用道具 举报

  离线 

22

主题

104

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2015-5-4
在线时间
32 小时
发表于 2015-11-3 08:44:52 | 显示全部楼层
回复【155楼】正点原子:
---------------------------------
原子大哥,cpu_endian;stack_dir;以及*addr不是用占用6个字节吗?这些是静态变量,不是存放在静态存储区吗?
我是觉得cpu_endian;stack_dir;以及*addr都是未初始化的static变量,应该是ZI-data=6,RW-data=0?
回复 支持 反对

使用道具 举报

  离线 

13

主题

772

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2015-7-26
在线时间
565 小时
发表于 2015-12-5 19:57:48 | 显示全部楼层
回复【85楼】kang_zhenyi:
---------------------------------
我觉得你应该是误解了,你只设置了栈的容量,例如“Stack_Size      EQU     0x00000800”,这个地方设置了栈的容量,而你查到的栈顶地址MSP为“0X2000 0940”,你可能以为变量区和堆区范围限制在了剩下的“0X940-0x800 = 0x140”,其实不是的,我实测后发现栈顶地址是根据你定义的全局变量、静态变量(即变量区)所占的内存而改变的,栈顶“地址”不是固定的0X2000 0940,但是“容量”是固定的为“0x800”,这样无论你在变量区定义多少个变量内存都能得到足够的应用(只要不超过内存大小容量),如果你在变量区定义的变量越多,那么栈顶地址就会往上递增,至于栈容量需要设置多大,当然是根据你代码的需要设置了
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

13

主题

772

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2015-7-26
在线时间
565 小时
发表于 2015-12-5 20:20:50 | 显示全部楼层
回复【151楼】合肥-文盲:
---------------------------------
不是你指示的那样,栈顶地址0x2000 0940不是固定的........是根据你定义的变量区(即静态存储区),静态区你定义的变量越多,栈顶地址就会逐渐往上增长,所以过程还是“0x2000 0000开始,依次是静态区(0x2000 0000开始的)、堆区、栈区”,所有的静态区变量都是在静态区地址开始递增的,后面的堆区如果没有malloc可以为0,栈区设置了大小但没有设定栈顶地址,如156楼
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

13

主题

772

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2200
金钱
2200
注册时间
2015-7-26
在线时间
565 小时
发表于 2015-12-5 20:40:12 | 显示全部楼层
回复【151楼】 合肥-文盲 :
---------------------------------
当我在静态区定义的变量越多时,栈顶地址不断的往上递增,我定义了12个u32类型的静态全局变量,总共占48个字节=0x30,0x2000 0940+0x30刚好就是0x2000 0970,如下图


我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

  离线 

78

主题

902

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1514
金钱
1514
注册时间
2013-4-15
在线时间
105 小时
发表于 2015-12-7 13:19:08 | 显示全部楼层
回复【158楼】229382777@qq.com:
---------------------------------
回复【159楼】229382777@qq.com:
---------------------------------
嗯  你说的是对的  栈顶地址不是固定的   .s文件里面Stack_Size      EQU     0x00000800只是设置了栈的大小,栈顶确实受到静态区和堆区的挤压,静态变量用的越多,堆区越大  估计栈顶也就越大
合肥-文盲
回复 支持 反对

使用道具 举报

片羽之神 该用户已被删除
发表于 2016-2-1 11:59:09 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手上路

Rank: 1

积分
14
金钱
14
注册时间
2016-2-2
在线时间
2 小时
发表于 2016-2-2 16:06:47 | 显示全部楼层
如此好贴,怎能不顶!涨姿势了!
回复 支持 反对

使用道具 举报

  离线 

39

主题

205

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
472
金钱
472
注册时间
2013-11-22
在线时间
78 小时
发表于 2016-3-7 11:32:25 | 显示全部楼层
mark下
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
25
金钱
25
注册时间
2016-4-17
在线时间
4 小时
发表于 2016-4-18 11:50:37 | 显示全部楼层
本帖最后由 XYMtime 于 2016-4-18 11:57 编辑
正点原子 发表于 2013-11-16 14:54
目前还有个问题没解决,就是我提到的,0X2000 0000最开始的4个字节,存储的0X2000 0938,到底是怎么 ...

RW 是程序初始化的变量,初始化后的变量不能放在RAM里面,需要写进flash ,在运行的时候又要将RW的数据回写进RAM(RW最开始还是变量),
所以要在RAM中给RW的预留一定的内存空间,RW数据的起始地址就是0x2000_0000, 在beep.map里面的有一段关于RW的描述,
Execution Region RW_IRAM1 (Base: 0x20000000, Size: 0x00000760, Max: 0x00010000, ABSOLUTE)

    Base Addr            Size         Type   Attr        Idx    E Section Name        Object

    0x20000000   0x00000014   Data   RW          155    .data             system_stm32f10x.o
    0x20000014   0x00000004   Data   RW          197    .data               delay.o
    0x20000018   0x00000006   Data   RW          229    .data               usart.o
    0x2000001e   0x00000014   Data   RW          292    .data               stm32f10x_rcc.o
    0x20000032   0x00000002   PAD
  我自己的RW_data是56,刚好是0x34大小内存,但是后面还有一段
Base Addr            Size           Type     Attr           Idx    E Section Name        Object

    0x20000034   0x000000c8     Zero   RW           228    .bss                    usart.o
    0x200000fc   0x00000060     Zero    RW           354    .bss                   c_w.l(libspace.o)
    0x2000015c   0x00000004    PAD
这个.bss文件还没有搞懂,似乎是预留给嵌入式系统的
接下来是heap和Stack基地址 和大小
Base Addr            Size         Type     Attr        Idx     E Section Name        Object

0x20000160   0x00000200   Zero       RW          261    HEAP          startup_stm32f10x_hd.o

0x20000360   0x00000400   Zero      RW          260    STACK        startup_stm32f10x_hd.o

也就是 heap的起始地址并不是 从0x2000_0000开始,而是从0x2000_0160开始的向上增长


回复 支持 反对

使用道具 举报

  离线 

24

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
430
金钱
430
注册时间
2015-8-16
在线时间
111 小时
发表于 2016-5-31 21:37:08 | 显示全部楼层
原子哥,请问如何理解:if(*(char*)&x==1)
回复 支持 反对

使用道具 举报

  离线 

9

主题

103

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
227
金钱
227
注册时间
2016-7-4
在线时间
46 小时
发表于 2016-7-18 09:20:10 | 显示全部楼层

顶,总结的太好了。
回复 支持 反对

使用道具 举报

  离线 

4

主题

54

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2015-4-18
在线时间
16 小时
发表于 2016-8-2 21:18:09 | 显示全部楼层
必须标注一下
回复 支持 反对

使用道具 举报

  离线 

13

主题

52

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
271
金钱
271
注册时间
2013-1-16
在线时间
60 小时
发表于 2016-10-13 23:21:00 | 显示全部楼层
程序总共占用内存:20+2348字节=2368=0X940 我是菜鸟,请问下程序占用公的内存和代码占用的内存的区别
回复 支持 反对

使用道具 举报

  离线 

22

主题

162

帖子

0

精华

高级会员

Rank: 4

积分
548
金钱
548
注册时间
2012-3-30
在线时间
131 小时
发表于 2016-10-18 18:24:17 | 显示全部楼层
STM32还是有点复杂啊。
回复 支持 反对

使用道具 举报

  离线 

39

主题

90

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2015-5-6
在线时间
94 小时
发表于 2016-10-18 19:44:30 | 显示全部楼层
MARK,很好的资料,
回复 支持 反对

使用道具 举报

  离线 

15

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-8-8
在线时间
34 小时
发表于 2016-10-25 09:16:47 | 显示全部楼层
顶起 mark
回复 支持 反对

使用道具 举报

  离线 

67

主题

313

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
386
金钱
386
注册时间
2015-5-28
在线时间
128 小时
发表于 2016-10-25 11:38:43 | 显示全部楼层
原子哥,好文!
最近爱上了stm32
回复 支持 反对

使用道具 举报

  离线 

7

主题

87

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
302
金钱
302
注册时间
2016-10-21
在线时间
41 小时
发表于 2016-10-25 13:10:16 | 显示全部楼层
很赞同原子哥的解释,栈和堆都解释得很到位。另,不喜欢别人老是说堆栈、堆栈什么的,堆就是堆,栈就是栈,这是两个不同空间的东西。
回复 支持 反对

使用道具 举报

  离线 

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-5-3
在线时间
40 小时
发表于 2016-10-27 17:34:53 | 显示全部楼层
学习了,菜鸟在次谢过,看来以后要多逛论坛了。
回复 支持 反对

使用道具 举报

  离线 

2

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
118
金钱
118
注册时间
2016-5-3
在线时间
40 小时
发表于 2016-10-27 17:39:35 | 显示全部楼层
那位大神进行解答一下,如何学习stm32?小弟学stm32也有一年有余,可以总是局限在应用层,改改接口什么的,感觉都是三岁小孩所做之事,明知太水,却无从下手。望大神指点迷津,感激不尽。
回复 支持 反对

使用道具 举报

  离线 

15

主题

41

帖子

0

精华

初级会员

Rank: 2

积分
129
金钱
129
注册时间
2015-8-8
在线时间
34 小时
发表于 2016-10-28 21:22:11 | 显示全部楼层
F:\E353.tmp.png
E353.tmp.png
回复 支持 反对

使用道具 举报

  离线 

1

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
49
金钱
49
注册时间
2013-12-12
在线时间
4 小时
发表于 2017-2-20 15:48:01 | 显示全部楼层
电子爱好探索者 发表于 2016-5-31 21:37
原子哥,请问如何理解:if(*(char*)&x==1)

这个简单啊,你现在应该早就明白了吧。
x是4字节的,x = 0x00 00 00 01,先取x的地址(&x),强制为字节指针访问(char *),然后取最低地址里的数据(*),如果为1,则为小端;如果为0,则为大端。
回复 支持 反对

使用道具 举报

  离线 

1

主题

8

帖子

0

精华

新手上路

Rank: 1

积分
49
金钱
49
注册时间
2013-12-12
在线时间
4 小时
发表于 2017-2-20 15:49:24 | 显示全部楼层
sky三叶草 发表于 2016-10-27 17:39
那位大神进行解答一下,如何学习stm32?小弟学stm32也有一年有余,可以总是局限在应用层,改改接口什么的, ...

买块开发板,从外设驱动开始,到最后移植系统。打好基础之后,应用其实很重要。
回复 支持 反对

使用道具 举报

  离线 

9

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
117
金钱
117
注册时间
2016-2-2
在线时间
39 小时
发表于 2017-5-10 15:16:22 | 显示全部楼层
原子哥  我想问一下,关于栈中还存放着函数的形参应该如何理解呢?RW跟ZI并不会包括形参,那么MSP的地址不过太小吗?还是说在运行过程中根据形参的调用会增加栈的大小?
回复 支持 反对

使用道具 举报

  离线 

1

主题

4

帖子

0

精华

新手上路

Rank: 1

积分
13
金钱
13
注册时间
2017-7-6
在线时间
2 小时
发表于 2017-7-9 17:00:27 | 显示全部楼层
关于上面的描述有两个问题想要问一下:
1/文中说“程序运行后,MSP就是从这个地址开始(也就是ZI-DATA+RW-DATA总值),往下给函数的局部变量分配地址”,那么在启动段.s文件中划分出的栈空间大小比这个值大还有没有意义?( 栈是从MSP值向下增长,如果启动段划分出的栈空间比这个MSP值大岂不是用栈顶-栈空间就小于了0x20000000了)。但是实际上栈底固定在了0x20000000处,加上了栈空间Stack_Size 划分的大小得到了栈顶的位置。这块为什么加载之后MSP的值不是(0x20000000+Stack_Size )的位置?
2/文中提到“第二种情况(不使用malloc):
STM32的内存分配规律:
从0X20000000开始依次为:静态存储区+栈区“  这样子,静态存储区被包含在了栈区中间了啊?? 还请指点。  
谢谢~
回复 支持 反对

使用道具 举报

  离线 

13

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
112
金钱
112
注册时间
2017-7-12
在线时间
15 小时
发表于 2017-7-31 23:29:16 | 显示全部楼层
正点原子 发表于 2014-3-21 14:34
回复【90楼】kang_zhenyi:
---------------------------------
设置小了,程序会跑飞,也就是说,会死机... ...

如果进入一个函数里的话,那么直到这个函数结束为止,所有的动态变量都会被压栈吗,也就是说main函数里定义的动态变量都一直在栈内,进入了更深层的函数,外层的函数里的动态变量也都一直在栈内,可以这么理解吗?
回复 支持 反对

使用道具 举报

  离线 

1

主题

48

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2017-8-21
在线时间
15 小时
发表于 2017-8-21 11:42:12 | 显示全部楼层
真的很不错
回复 支持 反对

使用道具 举报

  离线 

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-6-20
在线时间
31 小时
发表于 2017-9-1 16:19:36 | 显示全部楼层
栈顶不应该是低地址吗,怎么是最高地址?
回复 支持 反对

使用道具 举报

  离线 

50

主题

474

帖子

0

精华

高级会员

Rank: 4

积分
839
金钱
839
注册时间
2014-11-18
在线时间
141 小时
发表于 2017-9-4 15:14:50 | 显示全部楼层
正点原子 发表于 2013-11-16 14:54
目前还有个问题没解决,就是我提到的,0X2000 0000最开始的4个字节,存储的0X2000 0938,到底是怎么 ...

解决了吗?  多年前的问题
自己选择的路,成家前走完。
回复 支持 反对

使用道具 举报

  离线 

53

主题

270

帖子

0

精华

高级会员

Rank: 4

积分
709
金钱
709
注册时间
2012-11-16
在线时间
40 小时
发表于 2017-9-27 21:00:29 | 显示全部楼层
蛮经典的
回复 支持 反对

使用道具 举报

  离线 

53

主题

270

帖子

0

精华

高级会员

Rank: 4

积分
709
金钱
709
注册时间
2012-11-16
在线时间
40 小时
发表于 2017-9-27 21:01:14 | 显示全部楼层
cjw2017 发表于 2017-9-1 16:19
栈顶不应该是低地址吗,怎么是最高地址?

栈顶就是高地址,向下生长
回复 支持 反对

使用道具 举报

  离线 

3

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2017-6-20
在线时间
31 小时
发表于 2017-10-9 09:49:02 | 显示全部楼层
一般BDN 发表于 2017-9-27 21:01
栈顶就是高地址,向下生长

是不是不同的架构都不一样,ARM的栈顶是高地址,我之前学C的时候看到过栈顶有低地址的啊
回复 支持 反对

使用道具 举报

  离线 

53

主题

270

帖子

0

精华

高级会员

Rank: 4

积分
709
金钱
709
注册时间
2012-11-16
在线时间
40 小时
发表于 2017-10-9 20:52:20 | 显示全部楼层
cjw2017 发表于 2017-10-9 09:49
是不是不同的架构都不一样,ARM的栈顶是高地址,我之前学C的时候看到过栈顶有低地址的啊

不好意思这边我说错了,stm32的栈是向下生长的,也就是说入栈的东西是从高地址到低地址这么放置的。但是栈顶确实是低地址,这边我错了,不好意思
回复 支持 反对

使用道具 举报

  离线 

3

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
91
金钱
91
注册时间
2017-9-14
在线时间
44 小时
发表于 2017-11-8 11:45:06 | 显示全部楼层
mark   
回复 支持 反对

使用道具 举报

  离线 

0

主题

2

帖子

0

精华

新手上路

Rank: 1

积分
24
金钱
24
注册时间
2015-12-29
在线时间
7 小时
发表于 2017-11-17 10:06:23 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

  离线 

37

主题

248

帖子

0

精华

高级会员

Rank: 4

积分
611
金钱
611
注册时间
2016-7-22
在线时间
192 小时
发表于 2017-12-7 11:39:15 | 显示全部楼层
回复 支持 反对

使用道具 举报

  离线 

1

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2017-12-21
在线时间
12 小时
发表于 2017-12-29 12:41:25 | 显示全部楼层
精品资料,必须收藏。
回复 支持 反对

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2018-1-17 23:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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