打印
[应用相关]

STM32堆栈溢出导致硬件中断问题解决

[复制链接]
2302|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quray1985|  楼主 | 2016-4-19 19:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
首先要说一个问题,就是在写文件(f_write)的时候跳硬件中断的问题。堆栈不够,使用的开发板是奋斗v3.0,芯片是stm32f103vet6,有64K的ram,但是在startup_stm32f10x_hd.s的启动代码文件里对堆栈的定义却很小,不知道为什么,是因为别的硬件资源自己去分配么?现在还没有搞明白。下面有图为证:



原来是512个字节,现在我把他修改成了 2048个字节(2kb)。就可以使用了,在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。


另外一个问题,在写操作的时候程序会在SD卡的写操作上面死掉,现在还找到原因,需要仔细看下DMA和SDIO直接的访问情况。

给注释掉就可以正常的写文件了。


2011年1月12日 11:40:54
下面写下我的理解和解决办法:
首先分析了下代码造成在上述地方程序死循环的不是下面的读操作而是写操作的f_close()函数。
在sdcard.c文件的开始定义了 volatile SD_Error TransferError =SD_OK;(即0x2A)
那么分析这句话的意思
   while ((TransferEnd == 0) &&(TransferError == SD_OK))
   {}

当传输结束并且没有错误的时候进入死循环?!说不通啊,但是在IAR的编译器里就可以运行,现在要查找从定义到死循环之间有没有什么操作可以改变这两个变量的值。初步看没有什么会变化的情况,要对照IAR的仿真运行一起看。


问题已经解决,要谢谢网友stm32!
要在stm32f10x_it.c里把SDIO的中断服务函数加上,



void SDIO_IRQHandler(void)
{
   SD_ProcessIRQSrc();
}

然后就ok了。

沙发
yiyigirl2014| | 2016-4-19 23:19 | 只看该作者
这两天遇到一个很奇怪的问题,在串口通信时串口缓冲区写指针出现异常改变,使用一个vu32的变量累积穿插中断产生的次数,发现该变量变化也异常。并且最终导致Hard_Fault。

一开始怀疑是数组越界,仔细检查没有发现数组访问越界的问题;后来怀疑是系统时钟配置或NVIC配置异常,检查后也没发现问题。

最后整理代码,删掉main函数开始的一个500字节的数组定义(该数组并没有使用到),程序恢复正常。

检查工程的linker配置,发现stack(栈)配置为0x0800(2048)Bytes,heap(堆)配置为0x0200(512)Bytes,所以在main函数中定义500字节数组很可能导致程序运行时堆空间溢出了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1488

帖子

5

粉丝