OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5400|回复: 13

STM32F103RCT6的SRAM分区的疑惑

[复制链接]

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
发表于 2015-8-27 09:20:57 | 显示全部楼层 |阅读模式
5金钱
根据我的了解,STM32F103RCT6的SRAM是分为四个区:堆区、栈区、全局变量区(静态变量区)、字符串常量(有些人说没这个区,说字符串常量存在flash里面,但是操作的时候肯定还是要读入内存操作啊)

1.全局变量区的起始地址是多少?总共多大的容量?容量是否可配置?是向上增长还是向下增长?
2.字符串常量是否在SRAM中真的有一个单独的分区?如果有,这个分区的起始地址是多少?容量是否可配置?
3.据我了解,堆区的起始地址是0x2000 0000,是向上增长的方式,栈区默认的大小是2K字节,起始地址是0x2000 0940,是向下增长方式,现在有个疑惑,堆区是否是连续的?如果堆区的地址一直增大,栈区的一直减小,那么他俩会不会在0x2000 000~0x2000 0940之间的某个地址发生碰撞?那这样的话,地址>0x2000 0940的地址是干嘛用的?堆区是不是会绕过栈区,直接访问地址>0x2000 0940的内存区域(链表组织,无需连续)?


望大侠、大神们能解答下我的疑惑,不甚感激啊!

最佳答案

查看完整内容[请看2#楼]

回复【2楼】Fliger: --------------------------------- 经常我的测试,感觉2楼说的有点问题,修改如下,这个说法应该是正确的了 SRAM总共三个区:静态区、堆区、栈区。  静态区:存放全局变量和静态变量。  堆区:  系统malloc函数管理的一个区,IDE为堆区默认分配了一定尺寸的空间,我在hd.s 文件里面看默认是512字节。  栈区:  局部变量和函数参数存储的一个区,由系统指令集来管理 ...
合肥-文盲
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-27 09:20:58 | 显示全部楼层
回复【2楼】Fliger:
---------------------------------
经常我的测试,感觉2楼说的有点问题,修改如下,这个说法应该是正确的了

SRAM总共三个区:静态区、堆区、栈区。 

静态区:存放全局变量和静态变量。 
堆区:  系统malloc函数管理的一个区,IDE为堆区默认分配了一定尺寸的空间,我在hd.s 文件里面看默认是512字节。 
栈区:  局部变量和函数参数存储的一个区,由系统指令集来管理,用的时候系统自动申请,用完系统自动释放。IDE为栈区默认分配了一定尺寸的空间,我在hd.s 文件里面看默认是1024字节。 

从0x2000 0000开始,依次是静态区(0x2000 0000开始的)、堆区、栈区(栈顶:不是固定的)

栈顶地址 = 0x2000 0000 + RW + ZI
合肥-文盲
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-27 09:20:58 | 显示全部楼层




合肥-文盲
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-27 09:20:58 | 显示全部楼层
原子的malloc函数管理的静态区,他定义了一个全局大数组作为内存池
合肥-文盲
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-8-27 10:37:26 | 显示全部楼层
帮顶,有人知道的 记得@圈我一下
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-27 14:21:43 | 显示全部楼层
回复【2楼】Fliger:
---------------------------------
我觉得是这样的,不知道可对
SRAM总共三个区:静态区、堆区、栈区。

静态区:存放全局变量和静态变量。
堆区:  系统malloc函数管理的一个区。
栈区:  局部变量和函数参数存储的一个区,由系统指令集来管理,用的时候系统自动申请,用完系统自动释放。

从0x2000 0000开始,依次是静态区(0x2000 0000开始的)、堆区、栈区(栈顶:0x2000 0940)、静态区(0x2000 0940的 < 地址 < sram总尺寸-1)
合肥-文盲
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-8-27 15:47:29 | 显示全部楼层
回复【6楼】合肥-文盲:
---------------------------------
那malloc函数管理 内存 有什么优势呢?  我有点不理解?如果不用外部sram是不是就不需要管理了?
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-27 16:14:45 | 显示全部楼层
回复【7楼】Fliger:
---------------------------------
原子的malloc管理的不是外部SRAM,他管理的就是内部SRAM

当然有优势了,比如你要在函数内部用到一个大数组,比如u8 table[2048]; 因为函数内部的变量是局部变量,局部变量是存在SRAM的栈区的,我看了下STM32启动文件hd.s里面,默认定义的栈区就1024个字节,那这样就是栈区越界了,程序肯定不能正常运行了,如果你用malloc在静态区申请个2048字节给这个数组用,那么就不占栈区空间,程序就能顺利运行啊
合肥-文盲
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2015-8-27 17:04:45 | 显示全部楼层
程序里面没有 malloc 是不是不用分配堆区? 栈区分配大 对程序运行有什么影响?
回复

使用道具 举报

20

主题

122

帖子

0

精华

高级会员

Rank: 4

积分
639
金钱
639
注册时间
2014-6-20
在线时间
169 小时
发表于 2015-8-27 18:26:01 | 显示全部楼层
回复【8楼】合肥-文盲:
---------------------------------
有外部sram管理啊。不过你后面那个知识受教了,多谢
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-28 08:46:52 | 显示全部楼层
回复【10楼】Fliger:
---------------------------------
嗯,我看的原子的内存管理的内部的SRAM
合肥-文盲
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-28 08:50:52 | 显示全部楼层
回复【9楼】huishun1314:
---------------------------------
堆区是系统的malloc管理的,在启动文件里面有个配置堆区大小的语句,如果不用系统的malloc,可以把堆区的大小配置为0,栈区是系统的汇编指令管理的,不受用户的控制,堆区是给局部变量和函数参数用的,使用时由系统自动分配,函数运行结束由系统自动回收,栈区越大,局部变量可以用的更多,栈区大小也是在启动文件里面可以更改的
合肥-文盲
回复

使用道具 举报

22

主题

213

帖子

0

精华

高级会员

Rank: 4

积分
682
金钱
682
注册时间
2015-2-13
在线时间
74 小时
发表于 2015-8-28 10:00:27 | 显示全部楼层
回复【12楼】合肥-文盲:
---------------------------------
我看你的那个代码 在启动文件里面将 堆区和栈区的大小修改了,这样修改会不会有什么问题? 是不是我程序里面没有 malloc  那堆区就可以设置为0?
回复

使用道具 举报

86

主题

983

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1848
金钱
1848
注册时间
2013-4-15
在线时间
163 小时
 楼主| 发表于 2015-8-28 10:26:13 | 显示全部楼层
回复【13楼】huishun1314:
---------------------------------
不会有问题,是的
合肥-文盲
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-15 11:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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