总结:在硬故障中,我可以在哪里发出调试信息?
详细信息:
我遇到的问题是错误处理程序会被触发一次,而不是可重现的。我怀疑这是一个很难的错误,就像Error_Handler()我打印到USB端口但没有收到任何东西。
公开硬故障信息的标准方法是printf到调试端口。但是,由于这种情况发生在移动设备上,并且只在几小时内发生一次,我无法一直连接调试器。 我认为在一个硬故障中只能做很多事情,例如USB不再工作,UART不工作,也不通过SPI写入EEPROM。那是对的吗?如果是的话,你会做什么?
答案 0 :(得分:3)
hardfault处理程序正在执行代码,你可以按照自己的意愿执行代码,但要注意,因为你在那里出了点问题。如果您使用USB,可能是您的堆栈处于错误状态,因此,您可能需要完全重新初始化它和外围设备。您可能已经溢出了堆栈,因此可以对其进行消毒。
没有什么可以阻止您在异常处理程序中运行复杂的代码。但是,处理程序具有-1
的固定优先级,因此您无法为任何中断提供服务,因为它们不会中断异常处理程序。这可能是外围设备无法工作的原因,请尝试轮询它们。
如果你无法解决问题的解决方案是在链接器脚本中定义一块内存块,该内存块在重置时未初始化,存储您在那里的任何相关信息,重置,并在主代码中重置检查存储区域并输出您希望存储的任何介质。如果它没有太多数据并且你还没有使用它们,STM32中的RTC外设有一些寄存器可以随意用于任意数据,并且不受复位的影响。 / p>
答案 1 :(得分:1)
您当然应该假设系统内存和外围设备处于不可预测的状态,并重新初始化将在处理程序中使用的所有内容。
printf()
和stdio
基础设施有太多内部状态,例如输出缓冲区和工作区分配有malloc()
,因此最好不要使用它们,而是简单的输出函数用于文本和十六进制数字。