OpenEdv-开源电子网

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

程序编译后堆栈段与数据段的空间分配上发生了冲突

[复制链接]

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
发表于 2016-7-27 17:13:43 | 显示全部楼层 |阅读模式
5金钱
今天写个程序用的单片机是STM32F103RB。使用了 microlib库在主函数中定义了一个数组类型的全局变量 double a1[2][360];  这个数据总共占用了5760字节。
这个数组的首地址为:0x2000 0B60  末尾地址为:0x2000 21D8
问题出在堆栈的初始地址为:0x2000 1AA0
这就表示堆栈段与数据段的空间分配上发生了冲突。
我我试着将全局变量数据变小 设置为 double a1[2][90]; 但发现还是会占用 堆栈区域。
我自己检查过启动文件使用的:startup_stm32f10x_md.s
编译之后RAM使用情况如下:      Code (inc. data)   RO Data    RW Data    ZI Data      Debug   Object Name

         0          0          0          0          0         32   core_cm3.o
       364         66          0          0       5760     231847   main.o
         0          0          0          0          0     201652   misc.o
        36          8        236          0       1024        756   startup_stm32f10x_md.o
       162          0          0          0          0       1740   stm32f10x_gpio.o
        18          0          0          0          0       3346   stm32f10x_it.o
       168         22          0         20          0       3677   stm32f10x_rcc.o
       214          6          0          0          0       3796   stm32f10x_usart.o
       248         24          0          0          0       1325   system_stm32f10x.o

    ----------------------------------------------------------------------
      1220        126        268         20       6784     448171   Object Totals
         0          0         32          0          0          0   (incl. Generated)
        10          0          0          0          0          0   (incl. Padding)



我尝试着把二位数组分成两个一维数据定义就不会有问题


我发现定义二位数组的: double a[2][360]  
a[1]的地址为:0x2000 0B60   
a[2]的地址为:0x2000 16A0
堆栈地址为   :0x2000 1AA0
也就是说定义的二位数据的中的a[2]中的数据占用了堆栈区   

最佳答案

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

我自己犯了低级错误了,数组越界了。今天才发现
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-27 17:13:44 | 显示全部楼层
lol 发表于 2016-7-29 08:50
那您试试把二维数组定义到外部SRAM 试试呢?

我自己犯了低级错误了,数组越界了。今天才发现
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-27 17:26:06 | 显示全部楼层
我觉的是MDK编译器的问题,我把数组定义成 flaot a[3][360]  其中的a[3]中的数据占用了堆栈区的空间
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-27 17:37:56 | 显示全部楼层
double a1[2][360];
int main(void)
{
        a1[2][359]=1;
        a1[2][358]=a1[2][359];
        while(1);
}
我用了一段这个程序,做仿真 发现还是不行。没有用任何别的东西。 只要定义全局二维数组就会和堆栈区冲突
QQ截图20160727173711.png
QQ截图20160727173726.png
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-27 17:38:31 | 显示全部楼层
@原子哥
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-27 17:40:41 | 显示全部楼层
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-28 14:39:29 | 显示全部楼层
自己顶一下,求大神
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-28 16:31:54 | 显示全部楼层
大家别光看帖子自己可以用stm32f103RB的可以试一下。我说的问题真实存在。定义全局变量的二维数组定义的大小都会占用堆栈区域的空间。
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-29 08:09:41 | 显示全部楼层
自己顶
回复

使用道具 举报

14

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
296
金钱
296
注册时间
2016-6-23
在线时间
29 小时
发表于 2016-7-29 08:50:20 | 显示全部楼层

那您试试把二维数组定义到外部SRAM 试试呢?
回复

使用道具 举报

14

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
296
金钱
296
注册时间
2016-6-23
在线时间
29 小时
发表于 2016-7-29 10:00:53 | 显示全部楼层
jie 发表于 2016-7-27 17:13
我自己犯了低级错误了,数组越界了。今天才发现

什么意思?
回复

使用道具 举报

2

主题

16

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2016-7-27
在线时间
6 小时
 楼主| 发表于 2016-7-29 21:11:59 | 显示全部楼层

就是我定义的数组是a[2][30]   ,使用时最大到a[1][29]  .如果用a[2][] 就错了。
回复

使用道具 举报

14

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
296
金钱
296
注册时间
2016-6-23
在线时间
29 小时
发表于 2016-7-31 22:51:15 | 显示全部楼层
jie 发表于 2016-7-29 21:11
就是我定义的数组是a[2][30]   ,使用时最大到a[1][29]  .如果用a[2][] 就错了。

OO  这样啊
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 03:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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