OpenEdv-开源电子网

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

数组过大程序不能正常运行

[复制链接]

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
发表于 2016-1-8 15:05:51 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 stm32我爱你 于 2016-1-8 15:19 编辑

u16 color_buf[1920];
u8 color_buf1[3840];
如上图所示,这两个数组是在子函数里定义的局部变量,程序开始能正常运行;如果把第一个数组的大小从1920改为2048,则程序会卡死在这个函数里面,谁知道这是什么原因吗?如果一定要定义一个2048甚至是4096大小的数组,应该怎么解决这个问题呢?谢谢各位了。



untitled.png

最佳答案

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

堆栈小了,把堆栈开大,或者放全局里
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12989
金钱
12989
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-1-8 15:05:52 | 显示全部楼层
堆栈小了,把堆栈开大,或者放全局里
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2016-1-8
在线时间
4 小时
发表于 2016-1-8 15:21:24 | 显示全部楼层
能不能把函数代码给全呢,这样看不出什么来
回复

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2016-1-8 15:31:24 | 显示全部楼层
启动文件里面定义下堆栈大小,再说没有什么是一定的吧
我的博客:http://blog.csdn.net/itdo_just
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-8 15:34:59 | 显示全部楼层
jermy_z 发表于 2016-1-8 15:05
堆栈小了,把堆栈开大,或者放全局里

开大了
把       Heap_Size       EQU     0x00000200
修改为Heap_Size       EQU     0x00000400
就可以了
之前我记得也试过,不知道怎么就不行的,这次就可以了,奇怪。
另外想问一下,这个栈大小和程序的临时变量大小怎么对应呢?具体应该怎么算啊?
例如,我把数组大小再改大一点,变成1000 000 或其他数值,那么这个栈应该是多大呢?
谢谢了
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12989
金钱
12989
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-1-8 15:41:54 | 显示全部楼层
stm32我爱你 发表于 2016-1-8 15:34
开大了
把       Heap_Size       EQU     0x00000200
修改为Heap_Size       EQU     0x00000400

自己思考去,别什么都想着伸手
学无止境
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-8 15:49:36 | 显示全部楼层
jermy_z 发表于 2016-1-8 15:41
自己思考去,别什么都想着伸手

自己找答案没问题,我也不想什么都拿现成的,只是不知道应该从哪里来找答案,或者说从哪些相关资料上可以找到,我看了半天stm32中文参考手册,都没找到答案,网上也没找到,很是焦心,这个问题其实早段时间就有了,只是这一两个星期没空,所以就放到现在了,如果能告诉我从哪些资料上可以找到答案,也非常感谢。
谢谢了。
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12989
金钱
12989
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-1-8 15:56:15 | 显示全部楼层
stm32我爱你 发表于 2016-1-8 15:49
自己找答案没问题,我也不想什么都拿现成的,只是不知道应该从哪里来找答案,或者说从哪些相关资料上可以 ...

www.baidu.com
学无止境
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-8 16:01:27 | 显示全部楼层

哈哈  哥 你这是逗我吗   百度都没找过  会上到原子哥这里来找答案吗   
真是服了你了
还望高手指点啊    各位大神  快点出来吧
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12989
金钱
12989
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-1-8 16:10:12 | 显示全部楼层
stm32我爱你 发表于 2016-1-8 16:01
哈哈  哥 你这是逗我吗   百度都没找过  会上到原子哥这里来找答案吗   
真是服了你了
还望高手指点啊  ...

嗯,呵呵
学无止境
回复

使用道具 举报

19

主题

702

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3339
金钱
3339
注册时间
2013-7-30
在线时间
708 小时
发表于 2016-1-8 16:22:07 | 显示全部楼层
你为什么要在函数内部开这么大的buff?有外扩SRAM吗?没有的话,无论在全局还是局部,SRAM较少的MCU都不建议开这么大的buff,(除非你任务少而且只是玩玩而已),至于把更改堆和栈的大小,呵呵,不建议这样做
思想很重要,无论做人还是编程!
我的技术公众号【微联智控工作室】
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-1-8 16:23:16 来自手机 | 显示全部楼层
stm32我爱你 发表于 2016-1-8 15:49
自己找答案没问题,我也不想什么都拿现成的,只是不知道应该从哪里来找答案,或者说从哪些相关资料上可以 ...

内核的东西看cortex-m3手册。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-1-8 16:26:52 来自手机 | 显示全部楼层
临时局部变量和程序返回地址等都存放在栈里面。当然,少量的局部变量,编译器会将其存放在寄存器上。
回复

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1863
金钱
1863
注册时间
2011-3-29
在线时间
139 小时
发表于 2016-1-8 16:29:29 来自手机 | 显示全部楼层
jermy_z 发表于 2016-1-8 16:10
嗯,呵呵

哥们,淡定…
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-8 16:44:40 | 显示全部楼层
小温 发表于 2016-1-8 16:22
你为什么要在函数内部开这么大的buff?有外扩SRAM吗?没有的话,无论在全局还是局部,SRAM较少的MCU都不建 ...

需要读取外部SD卡的图片数据存储到外扩SRAM里,目前不知道有没有更好的办法,所以就弄一个大的数组来暂时存放这些数据,
不知道有没有更好的方法   还请不吝赐教啊
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

3

主题

2178

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3323
金钱
3323
注册时间
2013-7-19
在线时间
195 小时
发表于 2016-1-8 16:45:12 | 显示全部楼层
stm32我爱你 发表于 2016-1-8 15:34
开大了
把       Heap_Size       EQU     0x00000200
修改为Heap_Size       EQU     0x00000400

堆栈直接跟你的芯片RAM相关,同时也跟你的程序代码,比如数组大小,中断嵌套深度等相关,如果用汇编这个值应该是能精确计算的。相关堆栈知识在ST的官方文档里面应该能找到。
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-8 16:45:43 | 显示全部楼层
ofourme 发表于 2016-1-8 16:23
内核的东西看cortex-m3手册。

好的   感谢感谢  
我去找找
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-8 17:19:08 | 显示全部楼层
你的keil工程肯定有startup***.s的汇编启动文件吧?

打开它,找到Stack_Size那一行,默认好像是1k,把值该大些就行了
另外,函数内定义大数组实在不是好习惯,如果非要用,最好放函数外或定义成静态的
QQ截图20160108171850.png
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-8 17:31:49 | 显示全部楼层
xkwy 发表于 2016-1-8 17:19
你的keil工程肯定有startup***.s的汇编启动文件吧?

打开它,找到Stack_Size那一行,默认好像是1k,把值 ...

默认是1K的,Stack_Size和Heap_Size是不是共用0x0200 0000开始的64M地址呢?是不是最大可设置到64M啊,看了Cortex_M3权威指南,还是没搞明白
麻烦再指点下,最好是能说详细明白点,谢谢
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-1-8 17:42:43 | 显示全部楼层
堆、栈,都是具有可读可写属性的,当然是放在内存里啦

坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

2

主题

10

帖子

0

精华

新手上路

积分
40
金钱
40
注册时间
2015-11-6
在线时间
0 小时
发表于 2016-1-9 23:12:30 | 显示全部楼层
看  局部变量和全局变量之类的位置在哪里就可以了
回复

使用道具 举报

3

主题

130

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
金钱
373
注册时间
2015-3-7
在线时间
43 小时
发表于 2016-1-9 23:19:49 | 显示全部楼层
stm32我爱你 发表于 2016-1-8 15:34
开大了
把       Heap_Size       EQU     0x00000200
修改为Heap_Size       EQU     0x00000400

你要变成1000 000,如果是u8类型的,1000 000字节,除1024是多少k了?超过设置的栈了。在初始化代码里,栈默认设置的是1k。
为人莫作千年计,三十河东四十西,莫欺少年穷。
回复

使用道具 举报

2

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
93
金钱
93
注册时间
2015-12-29
在线时间
13 小时
 楼主| 发表于 2016-1-10 17:34:24 | 显示全部楼层
Mcu_learning 发表于 2016-1-9 23:19
你要变成1000 000,如果是u8类型的,1000 000字节,除1024是多少k了?超过设置的栈了。在初始化代码里, ...

默认是1K    但是  最大可以设置成多少K的栈大小呢   是64M吗   
我看stm32f10x.h里的设置是可以到0xFFFF FFFF的   最大值就是这个吗
路漫漫,书多多,stm32的朋友请加群383260480交流,一起进步
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 00:08

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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