OpenEdv-开源电子网

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

STM32里面全局变量y的值无缘无故被改变?

[复制链接]

29

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2018-3-2
在线时间
50 小时
发表于 2018-5-29 11:15:13 | 显示全部楼层 |阅读模式
1金钱
好的,我贴一下关键代码:
u16 y[2048];
for(i=0;i<2048;i++){
y=4096/3.3*(sin(2*3.14*26000*i/100000)+1);
}
for(i=0;i<1024;i++){
buf01=y;
}
u16 buf01[1024];
float fft_inputbuf[2048];//在一个函数cre()里面定义的局部变量
接下来是cre()里面调用下面这个函数:
CCopyFill(u16 *buf01,float *fft_inputbuf){int i=0;
        float k=3.3/4096;
        for(i=0;i<BUFFERSIZE;i++){                                                        //éú3éD&#197;o&#197;DòáD
                                         fft_inputbuf[2*i]=(float)buf01*k;                //éú3éê&#228;è&#235;D&#197;o&#197;êμ2&#191;
                                         fft_inputbuf[2*i+1]=0;                                        //Dé2&#191;è&#171;2&#191;&#206;a0
                                printf("%d\r\n",i);

        }

}

问题来了,在循环里到该i等于220的时候,全局变量数组y的值变了,可是在cre()函数和CCopyFill()函数里本页面对y组任何处理或者改变啊,
而且CCopyFill()里面也跟全局变量y没有任何关系,cre()函数里没有对y的指针进行任何操作,只有将y的值赋给其他:
for(i=0;i<1024;i++){
buf01=y;
}
下面附上内存变量表:

代码较多,我大概贴了一下,大佬看一下,哪里出了问题?
@正点原子

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-29 11:28:14 | 显示全部楼层
你的启动文件里开辟的栈区大小多少?“float fft_inputbuf[2048];//在一个函数cre()里面定义的局部变量”这个数组挺大的,函数里面还有没大的数组,函数内部的数组太多栈区溢出了?
回复

使用道具 举报

29

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2018-3-2
在线时间
50 小时
 楼主| 发表于 2018-5-29 15:12:23 | 显示全部楼层
szczyb1314 发表于 2018-5-29 11:28
你的启动文件里开辟的栈区大小多少?“float fft_inputbuf[2048];//在一个函数cre()里面定义的局部变量”这 ...

局部函数的这样的数组很多,有1024点也有2048点,堆栈区专门更改?
回复

使用道具 举报

29

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2018-3-2
在线时间
50 小时
 楼主| 发表于 2018-5-29 15:27:04 | 显示全部楼层
szczyb1314 发表于 2018-5-29 11:28
你的启动文件里开辟的栈区大小多少?“float fft_inputbuf[2048];//在一个函数cre()里面定义的局部变量”这 ...

Stack_Size和Heap_Size最大能改到多少?它们分别代表什么?
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-29 15:27:07 | 显示全部楼层
启动文件栈区改大,或者使用动态内存分配malloc给你的大数组分配内存。用malloc时把你的启动文件里的堆区适当的放大点
111.jpg
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-29 15:35:59 | 显示全部楼层
调用函数是所有函数内部的局部变量存储在栈区,函数内部的数组太大又多容易导致栈区溢出发生错误。使用malloc分配的内存存储在堆区,用malloc时设置的堆区的大小要合适,malloc(2048)分配2048个byte,你的堆区肯定要比2048要大才行。
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

29

主题

99

帖子

0

精华

高级会员

Rank: 4

积分
764
金钱
764
注册时间
2018-3-2
在线时间
50 小时
 楼主| 发表于 2018-5-29 16:17:13 | 显示全部楼层
szczyb1314 发表于 2018-5-29 15:35
调用函数是所有函数内部的局部变量存储在栈区,函数内部的数组太大又多容易导致栈区溢出发生错误。使用mall ...

ram.png
请问下这里的堆和栈最大能改到多少?在哪里看?上图是我的开发板的资源,谢谢
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-29 16:35:22 | 显示全部楼层
堆、栈区分配在启动文件中;
具体的大小根据你的使用来定义的。一般分配在内部ram,总和肯定不超过内部ram大小,分配在外部ram应该也可以的,没整过,你可以在论坛问问原子哥。
32内存分配是静态存储区+堆区+栈区,这在map文件中能看到的。下图
111.jpg
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-5-30 08:40:17 | 显示全部楼层
szczyb1314 发表于 2018-5-29 16:35
堆、栈区分配在启动文件中;
具体的大小根据你的使用来定义的。一般分配在内部ram,总和肯定不超过内部ram ...

上图中有个表述错误,栈顶指针写错了,栈顶指针应该是0x2000370+0x200.
0x2000370是栈底指针,32是小端模式
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17769
金钱
17769
注册时间
2018-3-3
在线时间
523 小时
发表于 2018-5-30 08:55:20 | 显示全部楼层
本帖最后由 Psheng 于 2018-5-30 08:57 编辑

在启动代码中,在调用systenInit()函数之前    写一个 ldr sp,=0x68000000+0x40000
把栈放到外部sdram看看
/*
*
*
*
*
*
*/
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-6 20:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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