OpenEdv-开源电子网

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

探讨下,超大数组的定义问题。

[复制链接]

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
发表于 2012-10-17 10:16:32 | 显示全部楼层 |阅读模式
做个项目不容啊,原来出现了HardFaultException,现在又冒出来了。
就是修改了几个中断的优先级,问题又来了。
我在程序中定义了2个超大的数组。uint16_t Adc_Lp[2048],uint16_t Adc_Rp[2048].
为什么选择了2048,因为我看到仿真器会将数组2048以外的数据截断,没搞太明白,所以先定义这么大,其实我想定义更大
现在在函数体内,我定义了一个稍微大点的结构体(就是有那么30个 uint16_t的数据),就是将有关参数全整合进来使用。
我发现,在一个函数中访问其中的一个变量时会进入HardFaultException。
因为代码是从原设计中搬过来的,我又重新建立了一个函数,这个函数定义了这个结构体并访问其中的数据,并未出现HardFaultException。
这下,糊涂了。

请问下 STM32F407ZGT6,可以定义的最大数组数是多少。我试图修改过stack的大小,似乎没改善。
我用的ST—Link/v2。如果用单步执行函数跳转呢,这个问题倒是可以跳过去,只要一自动运行,就出问题。
我用了TIM5,TIM2,SPI,DMA中断。DMA访问外扩SRAM.
用了ucosII+ucgui。

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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-31 14:31:53 | 显示全部楼层
可以采用双缓冲,2个缓存,A,B,各512字节。
当A收满512字节的时候,接收数据存放到B,同时,将A的数据写入SD卡。
等待B满的时候,接收数据存放到A,同时将B的数据写入SD卡。
依次循环。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 1 反对 0

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2012-10-17 10:24:57 | 显示全部楼层
回复【楼主位】maninman1981:
---------------------------------
不要在函数里面定义超过几十个字节的数组,不然很容易出问题。
定义全局变量,或者用内存管理。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2012-10-17 10:25:39 | 显示全部楼层
ucosII 有宏开关的就是 栈的最大值,仔细看看吧
1-1
回复 支持 反对

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-10-17 11:04:23 | 显示全部楼层

会不会和 PendSV与Systick的优先级配置有关。

我就是改了其他的中断优先级,这个问题就再次跳出来了。

程序中PendSV/Systick 似乎配置成了最低,且优先级一样。
PendSV:0xff
Systick :(1<<4)-1 = 15 = 0x0f
莫非这里有猫腻?

回复 支持 反对

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-10-17 16:50:44 | 显示全部楼层
回复【4楼】maninman1981:
---------------------------------
顶住! 不能沉!
回复 支持 反对

使用道具 举报

27

主题

148

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
276
金钱
276
注册时间
2012-7-25
在线时间
0 小时
 楼主| 发表于 2012-10-17 18:53:40 | 显示全部楼层
我把I2C初始化的代码去掉就OK了,但这段代码除了什么问题现在还不得而知。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-31 10:25:15 | 显示全部楼层
回复【7楼】zgzzlt:
---------------------------------
我想问问,你定义了超大数组之后,想怎么用?存储串口数据?然后呢?然后怎么办?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-3-31 10:29:39 | 显示全部楼层
超大的数组是定义在函数体内的局部变量吗?会不会是堆栈溢出了?
业余程序玩家。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-31 12:00:51 | 显示全部楼层
回复【10楼】zgzzlt:
---------------------------------
如果你的超大数组不够存怎么办?
换超大内存的芯片?
如果超大内存的芯片也不够存,怎么办?
换电脑?

回复【11楼】zgzzlt:
---------------------------------
超过了,编译器会报错的。
只要编译器不报错,你的全局数组就可以奔着你的最大值去...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-31 12:01:14 | 显示全部楼层
回复【9楼】ofourme:
---------------------------------
定义成局部变量必死。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

24

主题

60

帖子

0

精华

初级会员

Rank: 2

积分
186
金钱
186
注册时间
2012-12-19
在线时间
3 小时
发表于 2013-3-31 16:00:55 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
全局变量我懂,什么叫内存管理
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-31 16:40:31 | 显示全部楼层
回复【16楼】zjtzlqr:
---------------------------------
百度
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

6

主题

58

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2014-11-3
在线时间
0 小时
发表于 2014-11-7 12:00:05 | 显示全部楼层
回复【15楼】正点原子:
---------------------------------
请问原子哥,如何避免数据存入SD卡这段时间内,AD转换终止的问题。我的意思就是,如何能使数据存入SD卡的同时,AD采集也在进行。因为如果AD采集终止的话,会影响数据采集的准确性。
希望原子哥指教,感谢感谢!!!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2014-11-7 15:07:51 | 显示全部楼层
回复【18楼】Mars_man:
---------------------------------
用dma采集。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

10

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2014-8-26
在线时间
0 小时
发表于 2014-11-12 16:48:15 | 显示全部楼层
启动文件里面对栈的大小有固定的值。函数里面的数组是在调用该函数的时候,才给你分配空间。数组过大,栈溢出了,有可能覆盖了其他全局变量的值。如果使用很大的数组,可以定义成一个全局变量。如果使用的有os。就使用内存管理。
每天进步1%.
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-7-7 17:10:31 | 显示全部楼层



定义长度为3971的数组,2048后被截断了。这个数组是用来接收上位机发来的内容,然后把这个内容转发出去用的。这个该如何解决?
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-7-7 17:18:11 | 显示全部楼层
回复【19楼】正点原子:
---------------------------------
原子哥  我的问题在20楼
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-7 23:16:09 | 显示全部楼层
回复【22楼】justin_1ee:
---------------------------------
定义全局变量。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2014-12-5
在线时间
6 小时
发表于 2015-7-8 08:55:35 | 显示全部楼层
回复【23楼】正点原子:
----------------------------
我定义的就是全局数组
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2015-7-9 23:11:22 | 显示全部楼层
回复【24楼】justin_1ee:
---------------------------------
那就检查其他地方的问题,数组这里肯定没问题了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2016-1-25
在线时间
4 小时
发表于 2016-12-17 14:26:45 | 显示全部楼层
justin_1ee 发表于 2015-7-7 17:10
定义长度为3971的数组,2048后被截断了。这个数组是用来接收上位机发来的内容,然后把这个内容转发出去 ...

请问最后怎么解决的?我遇到了同样的问题
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-26 08:44

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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