Your browser does not seem to support JavaScript. As a result, your viewing experience will be diminished, and you have been placed in read-only mode.
Please download a browser that supports JavaScript, or enable it if it's disabled (i.e. NoScript).
MCU在启动后运行一到两个小时后会发送PUTDATA函数中直接进入到HARDFAULT中去,试过在UART_ERROR_HANDLE中打断点,但是从来没进去过。调用堆栈和寄存器情况如图。 在进入错误之前MCU还会发送一段时间的错误数据,之后才会进入到错误中,并且只有头部数据正常。 下图为异常数据: 下图为正常数据: 并且MCU内的数据也能正常接收到这些异常数据: 该问题困扰了我几天,求指教。
看一下 hardfault 原因是什么 看起来像溢出了
Diga 你好,我这边暂时没有头绪查出hardfault原因,因为是直接跳转进去的,尝试过把堆栈加大,而且传输结束后都会清除buf里面的数据。能请教一下怎么查看这个原因吗?
IAR 应该是有个可以查看 hardfault 原因的,另外可以看一下 Core 的寄存器,SCB->SHCSR
Diga 附上CPU和Core寄存器的情况
初步看是 bus fault,bus fault 的错误地址是 0x20010000 看起来像是你的 tx buff 这个指针在野蛮生长,已经超出 RAM 范围了
Diga 我这边查看的linflexd_uart_config1_State的txBuff确实是越界了,但是重复几次现象也没有看到这个txbuff在疯狂变化,直接就从正常指针地址跳到 0x20010000。进错误之前传进去的数据还是正常的。这边检查了有操作linflexd_uart_config1_State.txBuff的也只有这个发送回调函数。
看起来像 state->txBuff 指向的是一个局部变量,位置应该是在栈内,然后这个位置被你的代码冲掉了 你可以把你的 txDataAddr 拿出来当全局变量,固定占一个坑
Diga 刚刚尝试了把这个txDataAddr 修改为全局变量还是会出错。
Debug排查到,主函数与中断都有调用“LINFlexD_UART_DRV_PutData()”函数,存在函数重进入的情况;机缘巧合下txsize会自减2次,如果txsize是1,则会自减为0xffffffff(0D4,294,967,295),最终导致txbuff爆掉,进入Hardfault。
解决方法:①避免中断和主函数都调用同一个函数,②通过其他方式做好逻辑管理。
发帖前请查看
帮助没办法联网的电脑使用YCT
帮助改进和优化YT CONFIG TOOL,有机会抽取YTM32B1ME0 EVB哦...