完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我使用MPLABX 3.45,XC32编译器1.42。我正在使用PIC32开发板初学者工具包上的调试器。数据存储器为33%,程序空间为6%。在一个函数中,我声明了多个二维数组,开发进展顺利。然后,我声明了太多的大型二维阵列(当时我不知道),调试器突然开始崩溃,因为1)我的心跳LED会停止闪烁,2)当我停止调试器时,它是在定时器中断例程。经过调试,我发现数组已经超出了我的内存。从那时起,我就对它进行修复和重新修改,作为调试的一部分,我在0到1之间改变优化级别,并且注意到在最优化级别1中,有时它不会根据阵列的大小而崩溃,但是在优化级别0时,它总是崩溃。因此,优化级别0变成了我的实际级别,以确保我没有做不好的事情,稍后我使用优化级别1时必须修复。我的问题是,MPLAB是否可以提前告诉我,我已经创建了可能导致崩溃的大内存数组(它们不是静态的,否则我会在早期从内存中脱离出来)?在编译时间之前的警告消息将帮助我在大内存上拥有优化器掩码的条件,或者它只是彻底崩溃,没有迹象表明发生了什么。感谢您的帮助。吉姆
|
|
相关推荐
6个回答
|
|
你把它们弄错了吗?堆栈溢出的局部变量?
|
|
|
|
你应该至少在这里展示这些数组的函数块和声明,并展示你是如何使用它们的。此外,你应该计算所有这些数组的总大小。并且您应该检查为堆栈保留了多少内存(例如,在项目设置、xc32-ld、.tic和检查编译输出中打开“DisplayMemoryusage”)。阿拉伯人。自动变量放置在堆栈上。而且这不会影响数据存储器或程序存储器的百分比,因为这是在运行时发生的。正如已经指出的,堆栈可能溢出。xc32没有提供堆栈溢出检测。但是请注意,您实际上可以指定堆栈的最小大小。运行时堆栈从较高地址向下扩展到较低地址。链接器试图在KSEG0/KSEG1数据存储区。您可以在XC32 C编译器用户指南中找到关于这些的更多信息。优化级别0的内存使用量很可能大于级别1。因此,大型数组可能更容易导致堆栈溢出。
|
|
|
|
嗨,如果您声明的大数组没有被声明为静态的,那么Linker将无法判断您的程序将不可能运行。链接器/IDE报告的数据内存仅声明为静态或全局的,加上堆和堆栈的指定大小。如果本地数组在函数中声明(并且不由malloc分配),则它们将被添加到堆栈中。如果堆栈存储失去控制,它将覆盖堆。存储器,以及最终属于函数的静态或全局变量。在PIC32MX中,我不知道硬件如何检测堆栈存储器的存储量增长过大。可以编写代码来检查堆栈存储器是否增长为静态变量使用的存储器,但执行以下操作对于所有函数调用,自动执行o将花费大量处理时间,据我所知,这样做还不够。YOUT是重置处理器。问候,Mysil
|
|
|
|
嗨,谢谢你的反馈,它非常有用,解释了为什么我将来应该做什么。这段代码是导致崩溃的原因,我已经重写了,它现在工作,但是,任何建议,您想提供关于如何编写这个在未来保护我自己。而且,所有的易失性都消失了,我在调试期间添加了它们,看看它们是否解决了问题。关于JimSTATUS ALGORITHM_d(const uint16_t ir[ALGORITHM_ROWS][ALGORITHM_COLUMNS],const uint16_t nv[ALGORITHM_ROWS][ALGORITHM_COLUMNS]){volatile int16_t._b3[ALGORITHM_ROWS][ALGORITHM_ROWS][ALGORIRIRIRIT]HM_COLUMNS];挥发性int32_t算法_32_t算法_b6[算法_ROWS][算法_RO][算法_COLU][算法_COLUMNS];易失性int32_t32_t算法_32_t算法_b32_t算法_temp32_t算法_temp[算法_ROWS][ALGORITHM_ROWS][算法_ROGORITHM_ROWS][ALGORITHM_COLUMNS];挥发性int16_t_t_t_t_t_t_t_t nv_t16_t_t nv_t_t16tnv_t_t_nv_d[算法_nv_d[算法_ROWS][ALGOGOGOGORITHM_int32_t算法_b3=0;vola平移算法32;
|
|
|
|
HiA“程序崩溃”可能意味着一个未处理的异常。我不确定XC-32,但是通常堆比堆栈有更多的空间。我建议使用动态分配(malloc/free)而不是依赖自动存储引擎。至少有一个人能够编写代码,当malloc返回“null”时该怎么做,所以在之前应该这样做宣泄一个例外。只是我的2分钱…最好
|
|
|
|
堆和堆栈的大小与您自己做的一样大。堆的唯一优点是您将知道分配失败。无论采用哪种方式,都需要管理堆栈。
|
|
|
|
只有小组成员才能发言,加入小组>>
5243 浏览 9 评论
2035 浏览 8 评论
1955 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3208 浏览 3 评论
请问电源和晶体值之间有什么关系吗?PIC在正常条件下运行4MHz需要多少电压?
2258 浏览 5 评论
778浏览 1评论
671浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
597浏览 1评论
PIC Kit3出现目标设备ID(00000000)与预期的设备ID(02c20000)不匹配。是什么原因
679浏览 0评论
577浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 10:51 , Processed in 1.635578 second(s), Total 57, Slave 51 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号