从我的历史知识的固工程工具、做法等。它一直落在后面,该软件工程领域通过若干年。例如,我可以告诉仍有相当数量的辩论中的固世界是否C++实际上是值得的使用对于我们应用,以及某些C++编译器明显缺席(微型芯片?!?).我想象,在大部分,这是由于差异,在要求之间的固件和软件。再次,从历史上看,似乎它只是一个时间问题之前,正常的审查工具和技术,使它成为固的世界。

什么方法、工具、最佳做法等,现代化软件工程师经常使用,可能固工程师还杠杆作用,以提高他们的手艺?

具体地说,我想沿下列轴线(但不要让他们限制):

  • 改善码的清洁/维修性
  • 降低缺陷引进和改善检测
  • 改进文件
  • 要求管理
  • 提高可重复使用性

我也喜欢看到嵌入商店的答复或评论的答案提供反馈,关于理论上的可行性,或者更好的是,个人经验。

更新
我特别感兴趣的是在跳跃在曲线之前一点点。所以相对较新的东西,已经过审查的合理(适用于大多数人)、C++、求等。你用什么所有的时间和爱吗?

更新2
我得到很多好的一般程序的建议在回答迄今为止,这是很大的,但是我真的在寻找更为非传统的方法已证明是成功的人。我想梳理出敏捷的从业人员,TDDers,其余的你们已经尝试的东西和看到了它支付在黑桃或失败得很惨作为一个软件工程师已经有一个工具或实践中,你已经通过了在过去几年来,已经有一个非常积极的或消极的影响?

有帮助吗?

解决方案

有什么可以固工程学习软件工程师?很多!

我很惊讶如何类似的固发展是实行今天作为这是25年前,当我们第一次开始使用C嵌入式发展。C是向前迈出的一大步从汇编,但还有更多的经验教训,固工程师可以并应该从中学习。是啊,一些工具更好,但许多做法被卡在70年代和80年代。

嵌入式软件开发并增加一些额外的挑战上所面临的挑战非嵌入开发。但所有原则和实践技能的软件开发人员使用是适用于嵌入式发展。顺便说一句:这不仅仅是嵌入式软件开发人员不是对这些国家的艺术实践,但许多非嵌入式软件开发商。

我知道和有见过这样做固是一个非常技术小组的工作,以解决困难问题。不幸的是,无论出于何种原因,许多不能跟上事态发展软件的世界。我想它已经做一个假想的隔竖立由固件工程师。

嵌入式和非嵌入开发讲不同的语言,但是解决类似的问题。保持嵌入的代码独立硬件设备基本上是相同的保留的应用程序代码独立的UI或数据库。基本原则是相同的。

这里有一些东西,我认为嵌入开发者应当付出更多的注意。这些原则和做法可以使用的,而其他人则可能需要一些调整,以处理嵌入式的挑战。如果你想替代词的固件为软件下,继续前进,我并不真的将两者区分开来。

依赖管理

之间的依赖关系的模块,必须加以管理。依赖软件,硬件是一种特殊的情况,必须积极设法通过的嵌入式软件开发商。如果你不管理的依赖,它将管理。

在实践中,这意味着,只有有限的子集软件模块应该具有知识的基础硬件(和操作系统)。作为硬件的演变,和它总是这样,投资硬件的独立代码可以被保留。看到我的 啊哈! 时刻。

罗伯特*马丁已经撰写了关于固体设计原则。嵌入式的开发者应该知道它们并将它们应用到他们的设计。

  • S-挑的责任原则
  • O-打开封闭的原则
  • L-里氏替换原则
  • 我接口隔离原则
  • D依赖倒置的原则

这些原则导致的设计,更好的忍受时间的考验。固体原则,鼓励创建有凝聚力的和独立的模块。他们是建立在面向对象的观念,但可以适用于C。我们必须停止功能呼叫数据结构免费为所有这一切都太常见于嵌入式C的代码。

C++和OO语言

为什么你不能使用C++和OO?因为他们太缓慢或者太大。什么是事实吗?C++是一个很大,神秘语言,但是你没有使用这一切。看看 为什么你仍然使用C?

C++弥补了一些问题,C并没有多大帮助用,如:

  • 封装和信息隐藏
  • 编程接口
  • 可取代的对象
  • 特设初始化

C++可以有效地使用嵌入式发展。好的你需要一个C++编译器,余裕。也许这是不可能的在你的世界,或者也许是企业经营成本。开始通过学习:

  • 班-这些都是结构与功能的构件,以及作为成员的数据。
  • 造-这些使它能够获得初始化的权利,所有的时间。
  • 析构-如果你学会构造,你也必须学习析构保持宇宙中的平衡。
  • 继承使用该主要为定义接口中只包含纯粹的虚拟功能。接口提供重要的依赖性休息时间和灵活点。这些通常是不公正的气馁在嵌入。应该没有神秘或损害;虚拟功能的功能,指引擎盖下。替代有效的使用的接口是复杂的有条件的逻辑,一些嵌入式C的程序通常已经太多。

如果嵌入开发人员使用的那些部分C++他们能建立更多的灵活设计并不会产生很高的费用。

测试驱动的发展

这可能是最大的改变游戏规则。我很高兴看到其他的员额提它了。TDD可以帮助防止缺陷的现在和未来。看看为什么TDD可能有助于采取一个看看 物理学使用.

嵌入式的确存在一些独特的挑战影响。例如,TDD需要一个非常快速的增编辑/编译/link/运行周期。对于许多嵌入开发这意味着谨慎 依赖管理 并运行单位测试第一个目标。看到更多关于 适应TDD用于嵌入式.

与求创建代码,是彻底的测试。《全面自动化测试的复盖面行为作为一个安全网,允许代码被改变的安全要求方面的变化。意想不到的后果立刻被发现。

此外,有的测试 你几乎免费的, 让你无畏地进行重构你的代码...

持续重构

代码编写一次,但读了很多次。然后,它更改和调整,导致设计随时间降解。如果开发人员不断进行重构,以保持代码清洁的,它变成了一个烂摊子。也许你们中的一些处理这一烂摊子。TDD的自动化测试启用低成本和低风险的重构。

连续的一体化

自动化生成过程。它运行,与每一工作空间签。这一挑战的异质性的工具套,经常需要获得编码进入的目标,但它仍然是正确的目标。

越快越嵌入开发知道这一改变的是某种不符合一些其他的工作,更快,它可以修复和更少的时间将花费在痛苦的合并。

增量交付

找到方法来分裂的工作,以便大痛苦的集成的可以避免的,并设计想法可以尝试过早。避免分裂沿建筑线路,专注于提供切片可见的功能。

协作

嵌入开发!快离开那冰块和一起工作。你怎么能得到更好的时候你只能看到你自己的代码?您怎么可以改进时,你是专家在技术XXX,已经掌握它并没有获得工作机会在不同的领域。

有很多要学习。你是负责所有你可以

其他提示

我们的工作既作为一个嵌入式软件工程师和软件开发商。在那里在两个世界,我已经了解到,无论多么少的资源,系统和有什么语言编程,还有许多事情可以让你的生活更加容易。

第一件事是工具的使用。在嵌入式软件,你只处理与编译/连接的大部分时间。有超过这些。比较工具,经常表达的一个脚本语言、文档编制工具,节省很多时间。

另一件是代码的质量。一个需要遵循式的公约,通过经常重构的周期和一般必须记住,读码是多代码写的,它真的值得有更多的可读的编码。

有些时候,在嵌入式软件我们错过了设计阶段。嵌入式的项目通常不那么大,因为台式/服务器的人,但是没理由不做一个适当的设计。

软件需要测试它自己的而不是仅仅作为部分的设备。它真的可以节省很多时间来建立一个软件模拟器系统,只是测试的软件,满足所需规格。这是更昂贵,这样做时,整个事情,硬件和软件已准备就绪。

  • 源控制
  • 单元测试(TTD)
  • 连续的一体化(或夜间建立)
  • 错误跟踪

固工程师,我已经与不做任何这些。

单元测试可能不适用非常会于所有类型的固件。我像其难以单元测试的东西时,这是上运行的物理硬件。取决于如果具有模拟器提供我假设。

假设通过"固工程师"你的意思是"嵌入式软件工程师",那么我回答是:他们 软件工程师,因此他们应该在可能的-会做同样的事情,因为任何其他软件工程师。

显然,写作软件用于嵌入式系统需要一些不同的技能,诸如详细的知识的目标处理,并能够处理有限的资源(比作一个电脑或类似)。

正如其他人已经提到的、单元测试是复杂的事实,这可能必须在模拟器上运行,同时非常有用的,可以永远不能替代彻底的测试真实的系统-特别是考虑步性质的事件,一个嵌入式系统问题。

我的一个问题为什么嵌入式软件可能会出现"后面的曲线"是因为软件的工程和作为的一部分,嵌入式软件不是一般的教导任何深入在电子工程度。鉴于许多电子工程师的职业生涯是可能花费的编码如今,这似乎是一个巨大的监督。

幸运的是,有些人正在试图弥补这一点。我强烈建议阅读本条款的杰克Ganssle(上 他的网站, ,并在其定期专栏上 embedded.com).

此外, MISRA-C 创建前一段时间,以尽量避免常见的来源的错误在C软件,用于汽车工业中,他由于已经通过了许多在嵌入式软件的世界。添加一个静态的分析检查程序喜欢 PC-棉绒, 和你已经走了一些方法来提高你的代码。

该工具的供应商也没有帮助,在许多情况下,通过创建自己的IDEs,当时或许已经更好地把注意力集中在编译器,调试器,并保留IDE其他人,例如食。

顺便说一下,为更多的关于不使用C++在嵌入式系统看看 这个问题.

最后:因为固件工程师的软件工程师,我们面临许多相同的问题、挑战和关切问题,因此,我们应使用相同的资源;毕竟,没有足够的他们周围和你在读他们中的一个!

其他一些网站,我经常包括:

编辑: 在应对Gabe的评论,"什么样的工具,我们应该找到适应?", 几个例子弹,记住:

编译器独立IDEs: 还有 大量的IDEs C,但是尽我可以告诉,他们很少可以用到他们几个潜在的不兼容的编译器。我想看到的两个编译器的开发商和IDE开发人员会聚,这样,理想的是,任何编译器可用于任何IDE。

在没有一个兼容的编译器,我想要能够使用电脑-皮棉(或相等的)为我的"官方"编译器IDE我的选择。

模拟和模型制作: 模拟工具喜欢 Simulink 能让模拟、建模和测试的软件的电脑和一些高端嵌入式处理器。这样的工具将是有用的较小的芯片,因此,它将很高兴看到它们扩大到这一领域的市场。

PS:杰克Ganssle列的本周题为"是什么让嵌入式有什么不同?",并且因此是(松散的)相关的问题上。

不确定什么程度的软件被认为是固件(bios、驱动程序,或者公用事业),但该标准的投诉,我听到的是是非的标准。认识到UI事项,应当按照某些标准或传统,会是很好的事情。

尽C++进,这是可以理解的犹豫要得到它,因为有很多的开销比CC几乎是一种大会语言与libc,而在C++即使是一个简单的功能呼叫可以是虚拟的。执行全C++运行时不是那么容易,给复杂的语言。

有太多的事情要列表方面的软件开发的"最佳做法"(我讨厌这个词)。为什么不开始 乔尔*试验:12步骤来更好的代码。

乔尔的试验

  1. 你用的来源的控制?
  2. 你可以做一个建立在一个步骤?
  3. 你做的每日生?
  4. 你有一个错误的数据库?
  5. 你修正错误之前编写新的代码?
  6. 你有没有最新的时间表?
  7. 你有一个规格?
  8. 程序员做有安静的工作条件?
  9. 你使用的最佳工具的钱可以买吗?
  10. 你有没有测试?
  11. 做新的候选人编写代码,在他们的采访吗?
  12. 你做的走廊的可用性测试?

固工程是相当宽泛的。从PIC DSP他们都有不同程度的物理资源。这些天Dsp是相当强有力的(有可比性的Cpu~5年龄),可支持大量的存储等。但随后再次你有照片的其操作与几个千字节。更微薄的资源,编程人员具有使用巧妙的黑客为了获得最大的设备。并重点是'得到它的工作"而不是"写优雅的代码'.

我想看到的是良好的项目管理工具纳入编码以及文件作为你必须参考许多数据表、文档的设计这都是散布各地的网络和电子邮件blob等。

我还希望看到更好地开发的工具Dsp(TI:请CCS的一些良好做IDEs),和更多的库策者使用C++(我看着你ATEME)建立更好的图书馆。

也硬件工程师有一个更好地向对象,而不是脱口而出,'如果这是用C++它将会是缓慢的'.

让我先解决一个假设,在你的问题。所作的假定是,作嵌入式软件工程师(ESE)不知道或不知道的现代化软件工程惯例和需要学习新的做法。这个假设应该被扔出来的时候了。我相信你会找到的同样的统计分布的Ese谁让他们的技能和技术的最新作为非嵌入SEs。

所以,也许你的问题就变成了一系列这样的问题:

  1. 为什么Ese使用一个单独的编码和命令行编译器而不是一个IDE?
  2. 为什么是C优C++在大多数内嵌的项目?
  3. 为什么没有同样多的实验编程中的做法在嵌入世界?

下面的段落中回答这些问题。

  1. Ese通常使用一个特定的代码编辑的,因为它是个人偏好或者它是什么用他/她的公司。IDEs并不常见,因为Ese工作非常密切的硅,并不是所有的芯片制造商制定的一个IDE为他们的筹码。唯一的筹码,实现最高的市场的渗透,例如手臂,有足够的势头,以保证发展的基于IDE的工具。此外,IDE没有提供尽可能多的援助,以ESE,因为它不会来说,一个桌面上开发人员。IDEs提供帮助以使胶GUI或者代码的完成为大Api;无论其中是常见的或作为标准的嵌入式的世界。

  2. 我敢肯定有更好的写作什么C优先C++在嵌入式系统比我可以弥补在现场。短它是,你用什么工作。C工作和更常见的是(更多的程序员知道C比C++)。其他原因可能是,OO方法是设计来帮助程序解决的大问题,通过抽象的解决方案进管理的概念对象。在嵌入式的世界,这些问题通常削减为小问题(和解决方案)作为可能,以便嵌入式系统变得更加可靠的通过具有较小的代码。

  3. 还有小试验通过Ese因为一个嵌入的产品,在一般情况下,必须远远低容易产生错误并有可靠性高于一个桌面程序。这意味着一个硬性的应用以及经过验证的做法和更多的时间花在试验。为什么?因为通常没有可行的道路升级所固的嵌入式装置;它要么不可能的,由于该系统正在部署超出达到或不可信的,因为成本的更新数以百万计的设备。

在结论, Ese使用的工具和做法最适合他们的需要只是作为非嵌入SEs做。 作为一个实践ESE,我认为嵌入式软件的纪律是远远更多的不同于我的非ESE的朋友相信它是。因此显而易见的差异的程的做法不是一个问题Ese需要学习现代化的做法,但非Ese需要了解如何不同的嵌入程。

自动化测试
不用视觉扫描你的模拟出来检查一切是确定。你需要全面的自动化测试因为你总是会错过的东西在大规模的波形。

版本控制
你不会记得什么是工作版本。使用的版本控制软件,所以你知道什么程序,董事会。

错误跟踪
你会忘记或早或晚。一个错误记录应包含的版本(见的版本控制)的问题的第一次检测和版本,它是固定的。

哎呦 我以为你的意思是固作为在FPGA但这同样适用于嵌入式软件。如果你已经有这些进程在很大的别忘了 unconventional approaches 直到得到基本的权利。

这可能是一位出的上下文。
一个简短的参照一个固件列在 嵌入,

我总是发现好的文章上的固工程。
这可能多的感兴趣在这个问题已经太...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top