OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

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

楼主: 正点原子

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

  [复制链接]

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2013-11-17 23:54:05 | 显示全部楼层
正点原子公众号
另外,我们自己实现的malloc,其实也是利用静态存储区,只是我们用自己的方式,在管理这些内存。

只是这个概念,看你怎么去解读,可以把静态存储区看做堆区,单严格的说,堆区,只用于系统的malloc之用,所以,一旦没用到系统的malloc,也就无所谓堆区了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2013-11-17 23:54:32 | 显示全部楼层
突然想起一首诗:菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

2

主题

1405

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1953
金钱
1953
注册时间
2010-12-16
在线时间
124 小时
发表于 2013-11-18 00:05:17 | 显示全部楼层
回复【50楼】正点原子:
---------------------------------
堆标号在map里还是存在的,只是指定了0长度而已.指定了非0长度,无论用不用malloc,堆区都存在.

Keil也有完全关闭堆的方法,具体操作有点麻烦.

这里所谓的<堆>,本身也是编译器实现的动态内存分配容器,自己实现也是ok的,毕竟编译器的堆管理器并不是每个人都喜欢.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

  离线 

2

主题

1405

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1953
金钱
1953
注册时间
2010-12-16
在线时间
124 小时
发表于 2013-11-18 00:07:18 | 显示全部楼层
回复【52楼】正点原子:
---------------------------------
上了操作系统后,线程间的参数传递基本靠堆.

说到这个,基本上各种出书了.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

  离线 

14

主题

173

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
255
金钱
255
注册时间
2011-10-14
在线时间
1 小时
发表于 2013-11-18 16:19:10 | 显示全部楼层
正点原子公众号
回复【37楼】xiaoyan:
---------------------------------
谢谢,跟大家一起学习的感觉真好
回复 支持 反对

使用道具 举报

  离线 

19

主题

190

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
396
金钱
396
注册时间
2012-11-18
在线时间
34 小时
发表于 2013-11-18 17:23:55 | 显示全部楼层
受益匪浅...
回复 支持 反对

使用道具 举报

  离线 

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
223
金钱
223
注册时间
2012-2-17
在线时间
45 小时
发表于 2013-11-18 22:23:35 | 显示全部楼层
谢谢分享,前段时间研究了下内存管理,注意到stm32调用malloc是从低到高分配内置的,但在51下面刚好相反,先分配堆空间的高位地址,慢慢向低位分配;另外stm32内存是小端模式,而51是大端模式,可能就是这个造成了他们的不同,不知道理解对不对?
回复 支持 反对

使用道具 举报

  离线 

2

主题

1405

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1953
金钱
1953
注册时间
2010-12-16
在线时间
124 小时
发表于 2013-11-19 02:17:57 | 显示全部楼层
回复【57楼】frival:
---------------------------------
理论上是看编译器喜好吧,与大小端关系不大,没有相关证实资料.

反而是51的栈往上生长,堆优先往下分配<相对>没那么容易受到破坏吧,猜的.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

  离线 

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2013-11-5
在线时间
0 小时
发表于 2013-12-26 21:34:13 | 显示全部楼层
回复【30楼】xiaoyan:


应该是我弄错了,可以看到下面,R4:0x0000000 R5:0x200000E0 LR:0x080002E7


---------------------------------
我想问一下为什么LR的值会是奇数的,如果是跳转前PC的值,即使是16位的指令,那么至少也应该是偶数.它好像会比我们需要的返回地址+1,不知道这里的+1作何解释.
回复 支持 反对

使用道具 举报

  离线 

38

主题

2067

帖子

6

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3263
金钱
3263
注册时间
2012-1-16
在线时间
36 小时
发表于 2013-12-26 22:23:52 | 显示全部楼层
回复【59楼】516433342:
---------------------------------
我也不知道,呵呵
站在巨人的肩膀上不断的前进。。。
回复 支持 反对

使用道具 举报

  离线 

4

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
56
金钱
56
注册时间
2011-9-21
在线时间
0 小时
发表于 2014-2-27 22:27:59 | 显示全部楼层
酷,终于懂了堆栈
回复 支持 反对

使用道具 举报

  离线 

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2014-3-9 16:49:08 | 显示全部楼层
回复【49楼】正点原子:
---------------------------------
原子哥,你这里写的内存是指stm32的sram吗,为什么“它主要存放静态数据、全局数据和常量。”?常量也放在sram中吗?
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-9 17:41:39 | 显示全部楼层
回复【62楼】烂泥桑:
---------------------------------
是指的SRAM,在单片机里面,const常量之类的,是存在flash里面了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

头像被屏蔽

  离线 

38

主题

384

帖子

0

精华

高级会员

Rank: 4

积分
591
金钱
591
注册时间
2012-12-5
在线时间
18 小时
发表于 2014-3-10 09:20:31 | 显示全部楼层
对于我们菜鸟的实际操作来说,是不是只要注意在操作系统初始化时,
给每个任务分配好足够的STACK(栈)就可以了?
其它的不需要考虑,只要编译时总内存足够用就OK?
回复 支持 反对

使用道具 举报

  离线 

1

主题

25

帖子

0

精华

新手入门

积分
49
金钱
49
注册时间
2014-2-25
在线时间
0 小时
发表于 2014-3-10 10:28:45 | 显示全部楼层
回复【63楼】正点原子:
---------------------------------
原子哥及各位前辈
      我可否这么理解:
      无论是静态存储区、堆、栈都是在存储区框架的SRAM区中。
至于堆、栈的大小是由人为设定的,在SRAM中除去堆、栈占用的大小空间,剩下的就是静态存储区?
回复 支持 反对

使用道具 举报

  离线 

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2014-3-10 15:02:06 | 显示全部楼层
回复【63楼】正点原子:
---------------------------------
那么这句话是不是要修改一下啊?
“静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量”
(这里最后的常量是怎么回事呢)
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-11 23:44:04 | 显示全部楼层
回复【66楼】烂泥桑:
---------------------------------
对于单片机来说,常量都是存储在FLASH的。
常量就是比如宏定义的值,比如a=30,这个30的数值。之类的固定的值。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-13 20:56:12 | 显示全部楼层
函数的局部变量,都是存放在"栈"里面,栈的英文是:STACK.STACK的大小,我们可以在stm32的启动文件里面设置,以战舰stm32开发板为例,在startup_stm32f10x_hd.s里面,开头就有:

Stack_Size      EQU     0x00000800

表示栈大小是0X800,也就是2048字节.

图中,我们可以看到,程序总共占用内存:20+2348字节=2368=0X940
那么程序刚开始运行的时候:MSP=0X2000 0000+0X940=0X2000 0940.

原子这是开始时候你的分析,这时候的940>800了没有问题么? 全局变量和给局部变量留着的0x800没有关系?那MSP不应该加上0X800,因为它是向下增长的么

后来的49楼您又说:
第二种情况(不使用malloc):
STM32的内存分配规律:
从0X20000000开始依次为:静态存储区+栈区

第二种情况不存在堆区。
所以,一般对于我们开发板例程,实际上,没有所谓堆区的概念,而仅仅是:静态存储区+栈区。
无论哪种情况,所有的全局变量,包括静态变量之类的,全部存储在静态存储区。
紧跟静态存储区之后的,是堆区(如没用到malloc,则没有该区),之后是栈区。
那MSP=0X2000 0000+0X940=0X2000 0940.又是什么情况?
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-13 21:10:18 | 显示全部楼层
根据第二种情况,不存在堆,只有静态区和栈,
静态区从0X20000000开始向上增长

栈从MSP开始向下增长?栈只是给局部变量用,任何局部变量都是栈,任何全局变量(初始化和未初始化)都是在静态区。
这个理解对么?

那么0X2000 0000总是存放:0X2000 0398 这个到底存放是是什么啊原子哥,看了好几遍还没没领悟。
之前看到的:MSP=0X2000 0000+0X940=0X2000 0940. 又是怎么回事,“图中,我们可以看到,程序总共占用内存:20+2348字节=2368=0X940 ”这俩RW+ZI,应该都属于全局变量,也就是属于静态区吧,和栈没关系吧
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-13 21:30:43 | 显示全部楼层
Total RO  Size (Code + RO Data)                43112 (  42.10kB)
    Total RW  Size (RW Data + ZI Data)              2400 (   2.34kB)
    Total ROM Size (Code + RO Data + RW Data)      43404 (  42.39kB)
     我们的ROM Size不要超过芯片的Flash Size就是OK的吧
      对于 RAM,我们的 Total RW  Size (RW Data + ZI Data)    2400 (   2.34kB)  + Stack_Size      EQU     0x00000800  不要超过RAM程序应该就是OK的吧,当然在写代码时候局部变量里面不要定义大数组,不要超过0x00000800  ,这个地方可能会内存泄露是不
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-13 23:56:31 | 显示全部楼层
回复【68楼】wwjdwy:
---------------------------------
0X940只是栈顶罢了。。。
0X800是大小。
一个是大小,一个是地址,不具可比性....
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-14 11:02:45 | 显示全部楼层
回复【71楼】正点原子:
---------------------------------
那么0X2000 0000总是存放:0X2000 0398 这个到底存放是是什么啊原子哥,看了好几遍还没没领悟。
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-14 11:04:57 | 显示全部楼层
觉得这个文章也不错
http://blog.csdn.net/slj_win/article/details/16906141
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-14 11:35:09 | 显示全部楼层
回复【71楼】正点原子:
---------------------------------
0X2000 0940是RW和ZI,与栈区给局部变量预留的0X800无关是么?
回复 支持 反对

使用道具 举报

  离线 

2

主题

1405

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1953
金钱
1953
注册时间
2010-12-16
在线时间
124 小时
发表于 2014-3-14 12:44:15 | 显示全部楼层
按照MDK现在的处理,栈属于ZI的子集.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

  离线 

2

主题

1405

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1953
金钱
1953
注册时间
2010-12-16
在线时间
124 小时
发表于 2014-3-14 12:44:26 | 显示全部楼层
回复【74楼】wwjdwy:
---------------------------------
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-14 14:19:31 | 显示全部楼层
回复【74楼】 wwjdwy :
---------------------------------



我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-14 14:22:27 | 显示全部楼层
回复【72楼】wwjdwy:
---------------------------------
可能是某个变量的值。不同的工程,0X20000000地址处的值是可能不一样的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

33

主题

209

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
361
金钱
361
注册时间
2014-1-20
在线时间
0 小时
发表于 2014-3-14 14:34:01 | 显示全部楼层
大爱原子哥
回复 支持 反对

使用道具 举报

  离线 

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2014-3-14 15:05:25 | 显示全部楼层
回复【77楼】正点原子:
---------------------------------
明白了,74楼说的“按照MDK现在的处理,栈属于ZI的子集”再加上你的图理解了。

我的MD,RAM20k,从你这个来看只用了0X940的RAM对吧。还有很大的空间可以给RW用
清晰多了呵呵呵。多谢多谢。
回复 支持 反对

使用道具 举报

  离线 

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-3-20 19:13:24 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
终于看懂了点RAM了~~

so 3Q
回复 支持 反对

使用道具 举报

  离线 

2

主题

4

帖子

0

精华

新手入门

积分
39
金钱
39
注册时间
2013-1-10
在线时间
2 小时
发表于 2014-3-21 10:25:01 | 显示全部楼层
栈生长的方向与具体CPU无关的吧
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 11:42:05 | 显示全部楼层



如上面原子大哥说的,我仿真了,确实是这样,可是,有一个问题,MSP=0x20000940,可是已经超出了我们设定的  Stack_Size       EQU     0x00000800,这是怎么回事呢?这样会不会出现问题呢?

我的工程:Program Size: Code=53804 RO-data=620 RW-data=104 ZI-data=12168  
仿真时,MSP= 0x20002ff0 ;而我刚才看了下启动文件:Stack_Size       EQU     0x00000400
请原子大哥帮忙分析下,难道MDK,在编译时,不管  Stack_Size       EQU     0x00000400,那么这个值是不是没有意义呢?













回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-21 11:43:36 | 显示全部楼层
回复【83楼】kang_zhenyi:
---------------------------------
看76楼的图片。还不懂就看附近几楼的讨论。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 13:39:52 | 显示全部楼层
有点明白了,仿真了下,确实如此,全局变量(包括已初始化的和未初始化的)都是以内存起始地址开始的,用到多少开多少,

而程序总共占用内存:20+2348字节=2368=0X940,那么程序刚开始运行的时候:MSP=0X2000 0000+0X940=0X2000 0940.


那么我还想问下原子大哥,这样把程序写入到单片机中,运行过程中,会不会用到大于0X2000 0940的内存空间,如果不会用到的话,是不是在单片机最终编译的情况下,尽量让MSP地址接近我单片机的最大内存地址(获取最大的栈空间),是否可以这样做呢?
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 13:47:32 | 显示全部楼层
我搞STM32搞了好几年了,可是有些基础的东西还不明白,比如说,开多大栈空间合适?如果大于0X2000 0940的内存空间不用的话,我想把那些空间全部加入到栈空间!
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 13:54:34 | 显示全部楼层
还有个问题想问下原子大哥,那个STM32在处理中断时,是不是也要用到栈,而函数链是否也要用到,这两个是不是在同一个栈?
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-21 14:02:29 | 显示全部楼层
回复【85楼】kang_zhenyi:
---------------------------------
1,正常情况下,是不可能用到大于0X2000 0940的内存空间的。
2,完全不用担心这个问题,这个编译器帮你做的事情,你强行让MSP接近最大内存地址,是没有意义的。单片机提供你多少内存,不是说你全部用到,就是好程序员。好的程序员是如何用到最少的资源,来达到同样的效果。这样,你可以选择内存少的单片机,从而节省成本,正是程序员价值的体现.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 14:12:29 | 显示全部楼层

Cortex-M3中断机制

    在STM32处理器中有43个可屏蔽中断通道(不包含 16个 Cortex?-M3的中断线)。共设置了16个可编程的优先等级(使用了 4位中断优先级);它的嵌套向量中断控制器(NVIC)和处理器核的接口紧密相连,可以实现低延迟的中断处理和有效处理地处理晚到的中断。嵌套向量中断控制器管理着包括核异常等中断。

    Cortex—M3是一个32位的核,在传统的单片机领域中,有一些不同于通用32位CPU应用的要求。比如在工控领域,用户要求具有更快的中断速度,Cortex-M3采用了Tail-Chaining中断技术,完全基于硬件进行中断处理,最多可减少12个时钟周期数,在实际应用中可减少70%中断。  
    异常或者中断是处理器响应系统中突发事件的一种机制。当异常发生时,Cortex—M3通过硬件自动将编程计数器(PC)、编程状态寄存器(XPSR)、链接寄存器(LR)和R0~R3、R12等寄存器压进堆栈。在Dbus(数据总线)保存处理器状态的同时,处理器通过Ibus(指令总线)从一个可以重新定位的向量表中识别出异常向量,并获取ISR函数的地址,也就是保护现场与取异常向量是并行处理的。一旦压栈和取指令完成,中断服务程序或故障处理程序就开始执行。执行完ISR,硬件进行出栈操作,中断前的程序恢复正常执行。图1为Cortex—M3处理器的异常处理流程。

回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 14:20:44 | 显示全部楼层
回复:[87楼] 正点原子大哥,那个局部变量,是不在“Program Size: Code=1652 RO-data=336 RW-data=4 ZI-data=2148  ” 这些数据里面的,在网上看了下,可以在工程里的一个“(.htm)“ 里知道程序最长嵌套时用到的最大栈空间,而我打开那个文件来看了下,还是没看明白,也就是说,我程序使用到的最大栈空间是多少,会不会超我设定的最大栈空间?
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 14:22:59 | 显示全部楼层
请教原子大哥,那个栈空间开多少合适,因该怎么来确定呢?原子大哥,可以看下工程里的那个“(.htm)“,帮我们解说一下,先谢了!
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-3-21 14:34:35 | 显示全部楼层
回复【90楼】kang_zhenyi:
---------------------------------
设置小了,程序会跑飞,也就是说,会死机...
以不死机为准则,就可以了。

一定要个准,就比较麻烦了,函数嵌套的越深占用的堆栈就越多,这个不太好测试,因为你得考虑所有情况,一旦有的没考虑到,就不准确了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 14:43:47 | 显示全部楼层
所以我的意思就是,如果单片机型号已经定了的,最终写入到单片机的程序,何不把用不完的内存容间全部加到栈空间去呢?
回复 支持 反对

使用道具 举报

  离线 

0

主题

9

帖子

0

精华

新手入门

积分
29
金钱
29
注册时间
2014-3-21
在线时间
0 小时
发表于 2014-3-21 14:46:26 | 显示全部楼层
当然,最好是要知道用到的最大栈深度,原子大哥,研究下这个问题,看下怎么知道设置的栈空间是否合适!
回复 支持 反对

使用道具 举报

  离线 

8

主题

88

帖子

0

精华

初级会员

Rank: 2

积分
140
金钱
140
注册时间
2012-7-27
在线时间
0 小时
发表于 2014-3-23 19:30:06 | 显示全部楼层
赞一个
回复 支持 反对

使用道具 举报

  离线 

7

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2014-3-11
在线时间
0 小时
发表于 2014-4-8 20:05:30 | 显示全部楼层
mark一下~~很有用,多观摩
回复 支持 反对

使用道具 举报

  离线 

7

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
65
金钱
65
注册时间
2014-4-15
在线时间
0 小时
发表于 2014-4-23 15:13:12 | 显示全部楼层
写得浅显易懂,赞一个
回复 支持 反对

使用道具 举报

  离线 

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-4-26 11:09:34 | 显示全部楼层
回复【63楼】正点原子:
---------------------------------
常量不是放在静态存储区里面的吗?而静态存储区又在SRAM里面,那就是常量放在SRAM里面的啊
回复 支持 反对

使用道具 举报

  离线 

497

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
128160
金钱
128160
注册时间
2010-12-1
在线时间
1131 小时
 楼主| 发表于 2014-4-26 16:58:18 | 显示全部楼层
回复【98楼】STM32学徒:
---------------------------------
不加const的常量,就是变量,所有变量都是存放在SRAM里面的。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

  离线 

15

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
159
金钱
159
注册时间
2014-3-14
在线时间
0 小时
发表于 2014-4-27 09:26:25 | 显示全部楼层
回复【82楼】denghongcai:
---------------------------------
"事实上,一般CPU的栈增长方向,都是向下的." 相关吧
回复 支持 反对

使用道具 举报

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

本版积分规则




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

GMT+8, 2018-6-20 09:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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