初级会员

- 积分
- 51
- 金钱
- 51
- 注册时间
- 2015-11-22
- 在线时间
- 4 小时
|
5金钱
问题描述:STM32F205,主频配置为120MHz,USART1的TX使用查询方式实现,每4ms发送15个字节数据;uart1的RX使用中断方式实现,函数内部定义了一个20字节的数组和两个char型的变量,两个函数单独频繁运行都没有问题,一起运行时,接收端接收超过17个字节的数据,运行一下就会进入void HardFault_Handler(void)。
继续跟进下,将RX接收端函数局部变量改为全局或静态就不会进入void HardFault_Handler(void)。
以为是堆栈大小问题,改大堆栈问题仍然有。
下面是堆栈大小信息:
<H3>Maximum Stack Usage = 240 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)</H3><H3>
Call chain for Maximum Stack Depth:</H3>
UART4_IRQHandler ⇒ Motorctrl ⇒ NonlineControl ⇒ sqrt ⇒ _dsqrt ⇒ __fpl_dnaninf
我设置的为:
Stack_Size EQU 0x00000800;0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
比较有问题和没有问题的htm文件差别如下:
没有问题的htm:
< ><STRONG><a name="[32]"></a>USART1_IRQHandler</STRONG> (Thumb, 400 bytes, Stack size 8 bytes, drv_uart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 24<LI>Call Chain = USART1_IRQHandler ⇒ USART_GetITStatus
有问题的htm:
< ><STRONG><a name="[32]"></a>USART1_IRQHandler</STRONG> (Thumb, 368 bytes, Stack size 24 bytes, drv_uart1.o(.text))
<BR><BR>[Stack]<UL><LI>Max Depth = 40<LI>Call Chain = USART1_IRQHandler ⇒ USART_GetITStatus
另外,开始我只是将RX中的数据改为static,如果只是使用USART1的话,是没有问题的,如果同时使用USART3,UART2就会有问题,需将另外两个布局变量也改为static。
程序逻辑是有信心没有问题的。
现在觉得中断里面的局部变量被篡改,导致越界或溢出,但是目前还是没有找到确切的问题点。麻烦各位高手指点下,谢谢!
|
最佳答案
查看完整内容[请看2#楼]
回复【4楼】Rocks:
---------------------------------
问题找到了,估计还是太自信了,定义buf时,用的宏定义,记得是用的是定义的协议大小20的,结果弄成了大小为10的一个宏定义。问题已经解决了,感谢!
|