求解答:基于STM32平台的数据存储空间分配问题

在STM32平台上用IAR+JLink调试时遇到一个问题。我写了一个很简单的程序,定义了一个比较大的局部静态数组,往里面写数据。代码如下:
图片说明
调试发现一个问题,当我用JLink调试模式时(即在IAR工程的Options->Debugger->Setup的Driver里面选择J-Link/J-Trace模式),启动调试后,程序会直接跑到CPU异常中断HardFaultException(硬故障)函数中,如下图:
图片说明
而用Simulator模式(IAR工程的Options->Debugger->Setup的Driver里面选择Simulator模式)时就不存在这个问题。这两种情况下,除了模式选择不同,其它的完全一样,编译时也没有提示相关错误。
我查了芯片数据手册,说是HardFaultException(硬故障)这种情况,是由于堆栈被破坏或者数据写越界造成的,于是我追查了我的内存空间配置,如下:
图片说明
代码编译后,内存空间地址映射情况如下:
图片说明
现在很疑惑,看起来内存空间分配并没有超出预定范围,而且按道理说,局部静态数组应该是在RAM里面开辟存储空间,跟堆栈应该也没有半毛钱关系呀,为什么会破坏堆栈。我试着把栈空间该大一些,还是无济于事。
请问有哪位高手可以帮我解答一下疑惑,万分感谢!!
补充一点,我把程序里的数组大小改成很小,比如1024,就没有问题。另外,在main函数之前,会有系统初始化函数,CPU执行完初始化函数后,再调到main函数入口处,此处我就不贴代码出来了。

3个回答

看起来没有超越范围,但是不能做到接近临界值啊,需要预留大一些的空间的,否则会出现问题的。

polarisyj86
polarisyj86 确实memory空间应该预留大一些,而且尽量不同空间不要靠太近。具体编译器怎么安排存储的还不清楚,不过肯定是有越界的风险。
一年多之前 回复
polarisyj86
polarisyj86 不知道需要预留多大空间,难道在内存空间分配里面定义的空间还不够用吗,系统还会用到额外的空间?
大约 2 年之前 回复

主函数中没有while语句,系统时钟没有进行初始化

moge19
moge19 回复polarisyj86: 不加CPU就不知要运行到哪去了,while循环在单片机中是必须的,系统时钟很重要,尽管有的在启动代码中就实现了初始化,在学习过程中要学会如何倍频,实际开发中很有用
大约 2 年之前 回复
polarisyj86
polarisyj86 你是说在主函数里面加while(1)死循环吗,我是直接打断点调试的,不加会有影响吗。 系统时钟是在主函数之前的系统初始化单元函数中就已经配置完成了的。
大约 2 年之前 回复

Simulator是模拟方式,不是在单片机内运行的,jlink方式是下载到MCU内部运行的,你的程序没有做任何初始化,可能不能正常运行

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问