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