【问题标题】:AVR MCU crashes, no logical error in code. What should I check?AVR MCU 崩溃,代码中没有逻辑错误。我应该检查什么?
【发布时间】:2013-10-30 21:03:25
【问题描述】:

我正在将 megaAVR 用于使用 C 编码的嵌入式项目。设备有时会无缘无故地崩溃。表示代码中没有逻辑错误。

所以我的问题是,如果您遇到这种类型的崩溃,需要检查什么?

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

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

【问题讨论】:

  • 当设备无缘无故崩溃时,它很确定是代码中的逻辑错误。老实说,它几乎可以是任何东西。您是否在 ISR 和主代码之间同步数据?你是对的,检查你的堆栈使用情况。是否存在未处理的中断?中断触发太快了吗?当你的设备崩溃时,你可以附加一个调试器来找出它挂在哪里吗?您是否使用了未初始化的变量?你在某处有悬空指针吗?
  • 这是一个大胆的声明,没有代码错误。奥卡姆剃刀建议相反。你有debug hardware 对吗?这就是开始的地方。我不确定不使用 malloc() 如何意味着没有内存错误 - 这是对可能的内存错误的非常狭隘的看法。我想没有人会在没有证据证明您的“完美代码”断言(即发布代码)的情况下有效地尝试回答这样一个模糊而广泛的问题。例如,考虑缓冲区溢出和未初始化的索引和指针。
  • 它可能与软件有关,但也可能是由硬件问题引起的。你的环境是什么?你用的是开发板吗?确切的 MCU 类型是什么?
  • 我也希望看到一些完美的代码,请发布...

标签: c embedded avr


【解决方案1】:

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

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

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

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

重置来源:

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

检查:

  • 如果没有设置这些重置标志,或者您的“重置”甚至没有到达您进行检查的应用程序入口点,则您需要寻找与软件相关的问题。
  • 如果您还没有使用 Watchdog,请使用。
  • 检查您当前的静态 SRAM 要求(使用 avr-size.exe)并在运行时估计您的堆栈要求。您应该考虑几百字节的安全边距。
  • 减少代码以缩小问题范围。

【讨论】:

  • crash != reset 虽然这可能是结果(尤其是看门狗,或者如果触发器是硬件故障,例如电源问题),但其他可能的结果是一个停止或失控的程序,可能会在某个地方循环结束。
  • @ChrisStratton:我不明白你为什么指出crash != reset,因为我的回答没有什么不同(那为什么要投反对票?)。您介意解释一下您在哪里发现问题以便我纠正吗?
  • 反对票不是来自我,但您的回答是基于实际或明显的重置,这不是唯一可能的结果,也不是问题所述的特定症状。
  • @ChrisStratton:嗯,我认为“...与软件相关的问题会导致未定义的行为,这似乎会导致完全重置。”指出结果不一定是重置。 - 对帖子进行了小幅编辑。我希望那会更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-06
  • 2016-03-26
相关资源
最近更新 更多