0

我正在将 megaAVR 用于一个用 C 编码的嵌入式项目。设备有时会无缘无故地崩溃。这意味着代码中没有逻辑错误。

所以我的问题是,如果你有这种类型的崩溃,要检查什么?

我的建议:堆栈 - 使用太多堆栈。内存 - 不适用,不使用 malloc。

更多的?它可能是哪种 AVR 专用?

4

1 回答 1

2

AVR MCU 崩溃,[...]。我应该检查什么?

MCU 不会“崩溃”。满足硬件重置条件之一并导致定义的重置,或者它与软件相关的问题导致未定义的行为,这可能会导致完全重置。

尝试确定是否发生了实际重置和潜在原因。第一步可能是评估 MCU 控制和状态寄存器 MCUCSR。它提供有关最近重置源的信息。

要使用复位标志来识别复位条件,用户应在程序中尽早读取并复位 MCUCSR。如果寄存器在另一个复位发生之前被清除,则可以通过检查复位标志找到复位源。

重置来源:

  1. 上电复位:Vcc 降至最低要求值以下
  2. 外部复位:复位引脚上的低电平断言
  3. 看门狗复位:看门狗定时器到期
  4. 掉电复位:Vcc 低于配置的掉电值
  5. JTAG AVR 复位:来自 JTAG 编程器的复位命令

查看:

  • 如果没有设置这些重置标志,或者您的“重置”甚至没有到达您进行检查的应用程序入口点,那么您将寻找与软件相关的问题。
  • 如果你还没有使用看门狗,那就去做吧。
  • 检查您当前的静态 SRAM 要求(使用 avr-size.exe)并在运行时估计您的堆栈要求。您应该考虑几百字节的安全边距。
  • 减少代码以缩小问题范围。
于 2013-10-31T08:24:08.617 回答