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