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