在开发嵌入式系统时,您认为应该遵循哪些“最差实践”?
我对不该做什么的一些想法是:
我敢肯定有很多关于不该做什么的好主意,让我们听听!
在开发嵌入式系统时,您认为应该遵循哪些“最差实践”?
我对不该做什么的一些想法是:
我敢肯定有很多关于不该做什么的好主意,让我们听听!
我还有很多,但这应该让我们开始......
在我伤害自己之前有人阻止我。
顺便说一句,我意识到并非所有这些都严格特定于嵌入式开发,但我相信它们中的每一个在嵌入式世界中至少与现实世界一样重要。
在制定时间表时,请继续并假设一切都会在第一次工作。
无需示波器和/或逻辑分析仪即可启动电路板。特别是。范围,那永远没用。
设计时不要考虑电源。热量、效率、纹波对 ADC 读数和系统行为的影响、EMF 辐射、启动时间等问题并不重要。
无论您做什么,都不要使用复位控制器(5 美分 IC 类型),只需使用 RC 电路(希望其中耦合有大量高频交流噪声)
拥抱大爆炸!!!不要逐步开发小块并经常集成,傻瓜!!!只需与同事一起编写几个月的代码,然后在大型贸易展演示的前一天晚上将它们全部放在一起!
不要使用调试/跟踪语句检测代码。能见度很差。
在你的 ISR 中做很多事情。冒泡排序、数据库查询等......嘿,可能没有人会打扰你,你有发言权,好好享受吧,伙计!
忽略设计中的电路板布局。让自动布线器在那些匹配的阻抗走线和大电流、高频电源上发挥作用。嘿,你还有更重要的事情要操心,伙伴!!!
使用全新的、测试版的、未发布的、早期采用者的芯片,特别是如果它对安全至关重要(航空、医疗)或大批量(召回 100 万个单元很有趣)。当 4 核 300 MHz 7 级流水线芯片上有新的硅采样时,为什么还要去拉斯维加斯?
好的第 2 轮....还有一些:
不要使用看门狗定时器(尤其是内置的!)
当缩放整数数学就足够时使用浮点类型和例程
在没有保证时使用 RTOS
真正有意义时不要使用 RTOS
永远不要查看生成的汇编代码来了解幕后发生的事情
编写固件,使其无法在现场更新
不要记录你所做的任何假设
如果您在测试/调试时看到奇怪的东西,请忽略它,直到它再次发生;这可能不是什么重要的事情,比如掉电、错过的中断、堆栈损坏的迹象或其他一些短暂和间歇性的问题
在调整堆栈大小时,最好的理念是“从小处着手并不断增加,直到程序停止崩溃,然后我们可能就可以了”
不要利用像 Micrium 的 uC/Probe 这样的运行时分析工具(我相信还有其他工具)
在运行主应用程序之前不要包括硬件的开机自检 - 嘿,启动代码正在运行,什么可能不工作?
绝对不要在您不会实施的 POST(上图)中包含 RAM 测试
如果目标处理器有一个 MMU,尽管如此,不要使用那个可怕的 MMU!尤其是不要让它保护您免受对代码空间的写入、从数据空间的执行等...
如果您一直在测试、调试和集成一组特定的编译器选项(例如无/低优化),请务必在最终版本构建之前打开全面优化!!!!但只有在您不打算测试时才打开优化。我的意思是,您已经测试了几个月 - 会出什么问题?!??!
初始化后的动态内存分配。系统启动并运行后,内存池应保持静态。
尝试在不访问您正在开发的实际硬件的情况下进行开发。
在您的解决方案中使用多个处理器并确保它们具有相反的字节序。然后确保它们之间的接口是其中一个可以直接访问另一个内存。
是的,我之前已经对这种架构进行了编程。
假设字节序将永远相同。
(将其扩展到寄存器的大小以及有关硬件规格的任何内容)
(评论中的案例解释)。
如果没有更多地定义“嵌入式编程”,那么就不可能说出什么是好的或坏的做法。
例如,在 CE 或 XPe 平台上,您可能使用的许多技术在 CE 或 XPe 平台上完全不适合使用狡猾的非标准方言“C”对 8 位微控制器进行编程。
在许多情况下,抽象是一种(过度)昂贵的奢侈品,因此“避免它”可能是好事而不是坏事。
这里有几个:
不要设计一个您的开发人员、经理和客户都能理解的易于解释的架构。
嵌入式系统几乎总是对成本敏感的平台。不要计划硬件变得更慢(更便宜),也不要计划关键数据路径中的新功能。
大多数嵌入式系统是“无头的”(没有键盘或鼠标或任何其他 HID)。不要在你的日程安排中计划编写调试工具。并且不要资源至少一名开发人员来维护它们。
请务必低估获得提示所需的时间。这就是让核心 CPU 达到可以与您和您与它对话的程度所需的时间。
始终假设硬件子系统可以开箱即用,例如内存、时钟和电源。
不:
留下没有指向任何地方的未使用的中断向量(毕竟,它们永远不会被触发,所以这有什么危害......),而不是让它们跳转到一个默认的未使用的中断处理程序,它会做一些有用的事情。
不熟悉您正在使用的处理器的细节,特别是如果您正在编写任何低级驱动程序。
选择闪存量最少的处理器系列版本,理由是您始终可以“稍后升级”,除非成本无法避免。
一些额外的注意事项:
将您的固件模块编写为完全通用的,接受每个可能的参数作为变量,即使您上面的层总是使用相同的参数调用。
即使系统中有 DMA 引擎(为什么要打扰硬件),在代码中的任何地方都使用memcpy 。
设计一个复杂的分层固件架构,然后让模块直接访问更高级别模块拥有的全局变量。
选择一个 RTOS,但不要费心去测试它的实际性能(我们不能相信供应商给出的数字吗?)
嵌入式系统中的一件重要事情是独立于您的应用程序评估技术,包括软件(编译器、库、操作系统)和硬件(芯片组)。避免使用这些测试台是危险的。一个人应该要么购买评估套件,要么建立他/她自己的测试台。
打印。
如果您的跟踪工具需要上下文切换和/或中断,那么您将永远无法调试任何与时间相关的内容。
写入内存缓冲区(memcpy'ing enums 而不是 s(n)printf 的奖励点),并在其他时间读取它。
这可能更像是一个硬件解决方案——但对于从头开始的新项目,低估资源需求是一个大问题,尤其是在使用没有简单方法扩展代码/存储大小的小型独立微控制器时。
从软件的角度来看,没有花时间学习硬件。
这不仅适用于嵌入式系统,而且将所有这些时间都花在寻找错误(调试)上,而不是通过诸如代码审查之类的酷东西来避免错误,这绝对是一种最常见的最坏做法。
另一种方法是让一个巨大的处理器完成所有工作,而不是将问题分解为小问题,例如使用更多的小处理器。还记得可可吗?
这在很大程度上取决于您正在为其编程的控制器类型。有时成本是最重要的事情,你试图用尽可能少的钱过日子。那是我通常乘坐的船。以下是我使用过的一些最糟糕的做法:
我在嵌入式系统工作超过 8 年并教授嵌入式系统的经验中的一些最糟糕的做法:
错误的数据类型也可能是灾难性的。
在 ISR 中做大量工作- ISR 应该尽可能短。我见过一些人在 ISR 中实现了整个逻辑,这非常非常糟糕。太糟糕了,它应该被列为犯罪。改用标志
使用整数作为标志- 这更像是第 1 点的扩展。您只需要一位。不要为此使用 16 位或 32 位。
但我所见过的最糟糕的是一遍又一遍地思考算法以获得最好和最完美的方法。停止!!牢记最佳实践,让系统首先运行。
还有很多。你可以在这里阅读其中的一些