另一种观点:微控制器不会耗尽内存。
至少,在正确编程时不会。对微控制器进行编程与通用编程并不完全一样,要正确地进行编程,您必须了解其约束并相应地进行编程。有一些工具可以帮助确保这一点。搜索它们并学习它们 - 至少如何阅读链接器脚本和警告。
然而,正如 Majenko 和其他人所说,一个编程不当的微控制器可能会耗尽内存,然后做任何事情,包括无限循环(这至少让看门狗定时器有机会重置它。你确实启用了看门狗定时器,不是吗? )
微控制器的通用编程规则避免了这种情况:例如,所有内存要么在堆栈上分配,要么静态(全局)分配;禁止使用“new”或“malloc”。递归也是如此,因此可以分析并显示子程序嵌套的最大深度以适合可用堆栈。
因此,可以在编译或链接程序时计算出所需的最大存储空间,并与您所针对的特定处理器的内存大小(通常在链接描述文件中编码)进行比较。
那么微控制器可能不会耗尽内存,但您的程序可能会。在这种情况下,你可以
- 重写它,更小,或
- 选择更大的处理器(它们通常具有不同的内存大小)。
一组常见的微控制器编程规则是MISRA-C,被电机行业采用。
在我看来,最佳实践是使用Ada的SPARK-2014子集。Ada 实际上很好地针对 AVR、MSP430 和 ARM Cortex 等小型控制器,并且本质上为微控制器编程提供了比 C 更好的模型。但是 SPARK 以注释的形式在程序中添加了注释,描述了程序正在做什么。
现在 SPARK 工具将分析程序,包括那些注释,并证明它的属性(或报告潜在的错误)。您不必浪费时间或代码空间来处理错误的内存访问或整数溢出,因为它们已被证明永远不会发生。
尽管 SPARK 涉及更多的前期工作,但经验表明它可以更快、更便宜地获得产品,因为您无需花时间去追逐神秘的重启和其他奇怪的行为。
MISRA-C 和 SPARK 的比较