2707|23

10

帖子

0

TA的资源

一粒金砂(中级)

keil数组长度问题 [复制链接]

 

一共定义了两个全局数组,数组长度定义为8000时,程序正常运行且能通过串口打印输出,但是将数组长度定义为9000时,程序能正常运行不报错但是串口无法打印输出,用示波器也观察不到输出。请问这种情况该怎么解决?(mcu型号STM32ZET6)

谢谢!

keil存储设置如下图。

  image.png  

image.png  

数组定义以及对应的program size如下图。

image.png  

image.png

image.png  

image.png  

 

此帖出自模拟电子论坛

最新回复

一看就是超堆栈了,9000x4x2/1024,大于65536了吧。   详情 回复 发表于 2024-5-20 16:21

回复
举报

1万

帖子

24

TA的资源

版主

定义了两个大数组,堆栈溢出了吧。

此帖出自模拟电子论坛

点评

堆栈溢出开发工具编译应该可以检测出来吧    详情 回复 发表于 2024-5-16 09:32

回复

5762

帖子

5

TA的资源

版主

dcexpert 发表于 2024-5-16 09:19 定义了两个大数组,堆栈溢出了吧。

堆栈溢出开发工具编译应该可以检测出来吧  

此帖出自模拟电子论坛

点评

如果分配时就超出可以,运行中溢出是检测不出来的。  详情 回复 发表于 2024-5-16 09:42
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引


回复

1万

帖子

24

TA的资源

版主

秦天qintian0303 发表于 2024-5-16 09:32 堆栈溢出开发工具编译应该可以检测出来吧  

如果分配时就超出可以,运行中溢出是检测不出来的。

此帖出自模拟电子论坛

点评

那请问有什么解决办法吗?  详情 回复 发表于 2024-5-16 11:28

回复

6044

帖子

4

TA的资源

版主

本帖最后由 damiaa 于 2024-5-16 09:53 编辑

堆区  程序员申请和释放 比如 malloc函数

栈区   编译器自动分配和释放 局部变量和函数参数等

静态内存区  全局变量 静态变量

代码区 代码

 

int32_t buffer[9000] 就是9000*4 30多k

float ads_voltage[9000] 也是 9000*4 30多k

堆栈 4*256+2*256

 

STM32F103xC、STM32F103xD和STM32F103xE高性能系列,集成了工作频率为72 MHz的高性能ARM® Cortex®-M3 32位RISC内核、高速嵌入式存储器(高达512 KB的Flash存储器和高达64 KB的SRAM存储器)

 

E%X9BHZZEE1(H(}MT1P)E2G.png  

 

此帖出自模拟电子论坛

点评

请问这个问题该怎么解决呢?  详情 回复 发表于 2024-5-16 11:30

回复

10

帖子

0

TA的资源

一粒金砂(中级)

dcexpert 发表于 2024-5-16 09:42 如果分配时就超出可以,运行中溢出是检测不出来的。

那请问有什么解决办法吗?

此帖出自模拟电子论坛

点评

换更大容量的芯片,或者优化程序,减少数组大小。  详情 回复 发表于 2024-5-16 13:57

回复

10

帖子

0

TA的资源

一粒金砂(中级)

damiaa 发表于 2024-5-16 09:47 堆区  程序员申请和释放 比如 malloc函数 栈区   编译器自动分配和释放 局部变量和函数 ...

请问这个问题该怎么解决呢?

此帖出自模拟电子论坛

点评

你申请不了这么大全局数组,如果要这么做,得换大内存的芯片。  详情 回复 发表于 2024-5-16 12:19

回复

144

帖子

0

TA的资源

一粒金砂(高级)

8000的长度,需要这么长吗,最好提前分配一下内存

此帖出自模拟电子论坛

点评

我希望采集1s的数据,然后采样率可以达到几十k,我就想着用数组去暂存每秒的数字量和模拟量,数组用于存放模数转换后的数据,所以想定义两个这么长的数组。另外提前分配内存是指?谢谢  详情 回复 发表于 2024-5-16 14:43

回复

6044

帖子

4

TA的资源

版主

本帖最后由 damiaa 于 2024-5-16 12:22 编辑
wyyyyy0518 发表于 2024-5-16 11:30 请问这个问题该怎么解决呢?

你申请不了这么大全局数组,如果要这么做,得换大内存的芯片。 有必要整这么大数组吗?不可以变通吗?

此帖出自模拟电子论坛

点评

也就是我数组长度定义了8000时一共60k+的字节,而芯片只有64k的SRAM,已经到极限了?我原本想着采集1s的数据暂存用于后续数据的处理,这么看这个mcu内存满足不了我的要求了?谢谢  详情 回复 发表于 2024-5-16 14:49

回复

78

帖子

0

TA的资源

一粒金砂(中级)

解决的方法与具体应用有关。

LZ 能否描述下这两个大数组的使用过程?

 

先放个网上的资源,不一定对路。

STM32内部RAM不够怎么办?

https://blog.csdn.net/linsp1314/article/details/113538672

此帖出自模拟电子论坛

点评

具体就是想定义两个数组用于存储采集的数字量和转换后的模拟量,用于后续的数据处理。数据采样率可以达到30k,想要对1s的数据进行采集分析。我看看您分享的资源,谢谢。  详情 回复 发表于 2024-5-16 14:53

回复

1万

帖子

24

TA的资源

版主

wyyyyy0518 发表于 2024-5-16 11:28 那请问有什么解决办法吗?

换更大容量的芯片,或者优化程序,减少数组大小。

此帖出自模拟电子论坛

点评

如果数组长度和大小已定,只能更改芯片吗?或者是否有芯片扩容的办法呢?谢谢  详情 回复 发表于 2024-5-16 14:56

回复

10

帖子

0

TA的资源

一粒金砂(中级)

qzc飘曳 发表于 2024-5-16 12:13 8000的长度,需要这么长吗,最好提前分配一下内存

我希望采集1s的数据,然后采样率可以达到几十k,我就想着用数组去暂存每秒的数字量和模拟量,数组用于存放模数转换后的数据,所以想定义两个这么长的数组。另外提前分配内存是指?谢谢


此帖出自模拟电子论坛

回复

10

帖子

0

TA的资源

一粒金砂(中级)

damiaa 发表于 2024-5-16 12:19 wyyyyy0518 发表于 2024-5-16 11:30 请问这个问题该怎么解决呢? 你申请不了这么大全局数组,如果要 ...

也就是我数组长度定义了8000时一共60k+的字节,而芯片只有64k的SRAM,已经到极限了?我原本想着采集1s的数据暂存用于后续数据的处理,这么看这个mcu内存满足不了我的要求了?谢谢


此帖出自模拟电子论坛

回复

10

帖子

0

TA的资源

一粒金砂(中级)

Jack315 发表于 2024-5-16 13:04 解决的方法与具体应用有关。 LZ 能否描述下这两个大数组的使用过程?   先放个网上的资源, ...

具体就是想定义两个数组用于存储采集的数字量和转换后的模拟量,用于后续的数据处理。数据采样率可以达到30k,想要对1s的数据进行采集分析。


我看看您分享的资源,谢谢。


此帖出自模拟电子论坛

点评

采样率 30 KSa/s,一个数据 16 位(12 位 ADC),一秒的数据共 60 KB。 如果数据处理可以使用定点小数,则不需要 float 数组,甚至有可能将所有 ADC 数据放在一个 uint16_t 的数组里。 另外一种可能的方法是将  详情 回复 发表于 2024-5-16 23:10

回复

10

帖子

0

TA的资源

一粒金砂(中级)

dcexpert 发表于 2024-5-16 13:57 换更大容量的芯片,或者优化程序,减少数组大小。

如果数组长度和大小已定,只能更改芯片吗?或者是否有芯片扩容的办法呢?谢谢


此帖出自模拟电子论坛

点评

改动最小的方式扩容有铁电FRAM、PSRAM,SPI接口。不过还不如换芯片,成本更低。  详情 回复 发表于 2024-5-16 18:02
可以试试存flash,最好外置的flash.512 byte存一次。速度应该满足要求。如果用内置flash可能还需要优化程序。  详情 回复 发表于 2024-5-16 17:17

回复

407

帖子

3

TA的资源

纯净的硅(初级)

不能100ms采集处理一次吗,个人意见扩容还不如换芯片合适。

此帖出自模拟电子论坛
个人签名我在想
我知道什么

回复

41

帖子

0

TA的资源

一粒金砂(中级)

wyyyyy0518 发表于 2024-5-16 14:56 如果数组长度和大小已定,只能更改芯片吗?或者是否有芯片扩容的办法呢?谢谢

可以试试存flash,最好外置的flash.512 byte存一次。速度应该满足要求。如果用内置flash可能还需要优化程序。

此帖出自模拟电子论坛

回复

1万

帖子

24

TA的资源

版主

wyyyyy0518 发表于 2024-5-16 14:56 如果数组长度和大小已定,只能更改芯片吗?或者是否有芯片扩容的办法呢?谢谢

改动最小的方式扩容有铁电FRAM、PSRAM,SPI接口。不过还不如换芯片,成本更低。

此帖出自模拟电子论坛

回复

4668

帖子

12

TA的资源

版主

这个简单啊, 二分尝试法,先试试4000能行不,不行就2000.这个能试出来上限是多少。就知道这个地方分配了多大的内存了。
此帖出自模拟电子论坛

回复

78

帖子

0

TA的资源

一粒金砂(中级)

wyyyyy0518 发表于 2024-5-16 14:53 具体就是想定义两个数组用于存储采集的数字量和转换后的模拟量,用于后续的数据处理。数据采样率可以达到 ...

采样率 30 KSa/s,一个数据 16 位(12 位 ADC),一秒的数据共 60 KB。

如果数据处理可以使用定点小数,则不需要 float 数组,甚至有可能将所有 ADC 数据放在一个 uint16_t 的数组里。

另外一种可能的方法是将两个大数组用 union 定义,使得 int32_t 数组与 float 数组共享同一块 RAM。这样 RAM 使用量就可以降低一半,而数组的大小就可以从 8000 扩大到 16000。只是不知道这个大小的数组是否够用。

此帖出自模拟电子论坛

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

猜你喜欢
随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表