如何成为嵌入式软件开发商?


22

对于想要成为优秀嵌入式软件开发人员或希望在此领域进行改进的人,我想提供一些技巧。

我需要了解什么有关硬件,软件的信息?

最推荐哪些书?博客?

最后,我怎么能从一个初学者变成一个优秀的专业人士?

Answers:


39

到目前为止,所有答案都不错,但是我会花两分钱。

这是一些技巧的重复和一些其他的重复:

  • 学习C:仍可移植(某种程度上)的硬件的基本语言。不仅要学习它,而且要成为volatile等所有功能的专家,以及为什么它对于编写设备驱动程序很重要。
  • 首先使用像Arduino这样的优秀开发工具包,但正如之前所说的,一旦您对它有了良好的了解,就学习其他架构。幸运的是,有一些与其他处理器兼容的Arduino兼容板,这样您就可以在不同的uC上重写相同的设计,而不会弄乱整个设计,同时还能体会到新的东西。
  • 在学习阶段,可以随时重新发明设备驱动程序或其他代码段。不要只是将其他人的驱动程序代码放在那里。在学习时重新发明方向盘很有价值。
  • 挑战自己,以便在速度和内存使用方面更高效地重新编写代码。
  • 熟悉不同样式的嵌入式系统软件体系结构。从基本的中断驱动/后台循环处理开始,然后移至后台调度程序,然后是实时操作系统。
  • 获得良好的源代码控制!我本人更喜欢Mercurial
  • 甚至注册一些免费的源代码控制托管站点(如Sourceforge.netBitbucket.org)来托管您的项目,即使您是唯一从事该项目的人。他们会备份您的代码,因此您不必担心偶发的硬盘崩溃会破坏所有内容!使用分布式VCS非常方便,因为您可以签入硬盘驱动器中的更改,然后在准备好后将其上传到主机站点。
  • 很好地了解您正在使用的任何芯片的工具!了解编译器如何创建程序集至关重要。您需要了解代码的效率,因为您可能需要在汇编中进行重写。知道如何使用链接器文件并解释内存映射输出也很重要!您还怎么知道您刚才编写的例程是否占用了过多的ROM / Flash!
  • 学习新技术并在您的设计中进行尝试!
  • 调试时不做任何假设。验证一下!
  • 了解如何进行防御性编程以捕获错误并验证假设(例如使用断言)
  • 在代码中构建调试信息,例如输出内存消耗或使用计时器分析代码或使用uC上的备用引脚在O型示波器上切换和测量中断等待时间。

这是一些书:

以下是一些网站:

  • 嵌入式大师
  • Ganssle集团 Jack Ganssle有一些精彩的历史故事可以讲。阅读文章。不过,他对某些事情有点布道。
  • Embedded.com提供有关Ganssle,Barr和其他行业专家的最新技术和技巧的好信息。

1
@Adam:我喜欢那本书!务实的程序员!我简直不敢忘记!
杰·阿特金森

1
+1为水星。我喜欢它,尽管我感觉熟练使用git会更有价值。如果您想贡献或借鉴其他项目,那么了解SVN的基础知识就非常重要,因为这是许多项目所使用的。
tyblu

17
  • 记住,“没有灵丹妙药”,不要陷入相信有一种工具,方法论,语言或系统可以解决所有问题的陷阱
  • 成为C语言专家
    • 学习没有malloc()和POSIX的情况
  • 不要挂在一个架构上,很容易偶然成为PIC或AVR或ARM迷
  • 编译,调试,使其工作。实践使完美
  • 学习至少一个源代码控制系统(SVN / git / etc)并使用它
  • 始终准备测试您的假设。该错误通常在您认为有效的事情中
  • 不要太依赖调试器,它们在每个系统上都不同,可靠性也各不相同
  • 节俭地思考。解决问题时,请考虑代码占用空间,RAM占用空间和硬件成本

对于书籍,我建议您翻阅历史。当今大多数嵌入式软件技术都来自过去的前沿。

像任何东西一样,每天练习。


5
在我学到的所有东西中,版本控制(我目前使用Subversion)对我的生产力而言是最有价值的东西。我从这里开始时就拥有Microsoft的Sourcesafe,所以我使用了一个不好的解决方案,然后又选择了一个好的解决方案。
科尔图克

没有源代码控制系统,我无法想象我的生活。我目前也使用SVN。在了解SVN之前,我不知道事情如何进行。
Daniel Grillo 2010年

1
+1代表“错误通常发生在您正在假设的工作中”
JustJeff

“学习没有malloc的情况”-为什么?为了最大程度地减少堆栈/堆碰撞的风险?
rzetterberg

@rzetterberg许多嵌入式系统避免使用动态内存分配,因为它会导致堆碎片和不确定性
Toby Jaffey 2012年

8

其他答案很好,但是业余爱好者和专业人士之间的最大区别应该在于对质量的看法。因此,您的项目应该一直进行下去,当您完成80%的项目时,请不要停止。一直使用它,证明它正在运行,并正确记录它。

确保您的代码可读且可维护。

而且不要忘了也有一些乐趣:)


7

除了显而易见的知识(例如学习C语言并从一些开发人员委员会开始)之外,您还需要学习阅读微控制器数据表
制造商为微控制器增加了越来越多的功能,因此变得越来越复杂。数据表不仅提供电气特性(对于电子工程师来说,比软件开发人员更有趣),而且还提供寄存器,存储器映射等的详细说明。
初读数据表可能会令人望而却步,但却无法理解它们在调试阶段可能会导致更严重的头痛。


3

“嵌入式”是一个加载术语。

在某些方面,只要有一些硬件要控制,任何专用于运行单个应用程序的系统都可以称为嵌入式系统。如果它恰好通过本地I / O模块控制进程,那么可以说具有2GB RAM的400MHz PPC604被称为嵌入式系统,该RAM在Linux之上运行Java应用程序。另一方面,仅运行某种最小网络应用程序的arduino并不是嵌入式系统的主要组成部分。但是可能“嵌入式”使大多数人想到基于闪存的控制器,该控制器只有几百个字节的RAM,没有操作系统可言,并且有大量的片上外围设备。

话虽这么说,非嵌入式程序员通常面对学习嵌入式系统的两个最大障碍是I / O寄存器和中断。

对于非嵌入式程序员来说,中断实际上可能是这两个概念中较容易处理的,因为在主流应用程序中经常会遇到并发和事件驱动编程等主要问题。使中断感到痛苦的是,认识到系统对中断处理质量的极端敏感性,以及处理硬件以清除中断条件并为下一个中断条件进行设置的复杂性。使用GUI,死锁只会杀死应用程序。使用中断处理程序,死锁将导致整个系统锁定。

I / O设备似乎是造成最大困难的领域。对于初学者来说,发现在此处读取该寄存器会对那里的该寄存器产生影响可能会非常令人惊讶。写1清除位。当您读取数据寄存器等时,状态位会自动清除。I / O硬件的可能性非常之多,因此除了学习如何查找和解释设备数据手册之外,没有通用的处理规则。为串行端口编写设备驱动程序将使您了解有关低级别I / O编程的更多信息。

实际上,学习这些东西无非是要roll起袖子,在裸机上编写一些直接的C语言和/或汇编语言。即使是上述基于Java的嵌入式系统,最终也需要用于I / O的设备驱动程序,这意味着最终要处理一些C。经验是最好的老师。选择一个微控制器,无论是MSP430,TMS320,AVR,ARM,PIC,68HC11等,找到一个评估套件,并构建一些系统。


3

$50ŤØ$但您需要为pro mini焊接。我不是PIC系列的粉丝,但您可能想从历史课程中学到一些东西,8051也是如此,这两个系列仍然很受欢迎并且正在使用中,只是效率不是很高,已经被其他体系结构所取代。绝对学习ARM和Thumb,也许是MIPS(这是pic-32,不要与较早的原始PIC体系结构相混淆)。尽管Stellaris也可以,但ARMmite Pro是入门级ARM板。

您想在这里学习的是各种平台的汇编程序。C. C和汇编程序的交互。GCC和非GCC不同的工具。如何阅读数据表/程序员参考(并意识到它们都有一些错误或可能引起误解,永远不要相信它们,硬件会胜过文档)以及如何阅读或使用原理图。这些通常不是复杂的原理图。许多板卡都非常适合与项目进行接口连接,这意味着它们不会在板上产生垃圾,而只是直接访问I / O引脚。但这不是学习的最佳方法。像一个恒星对于项目而言很痛苦的电路板在板上有很多有趣的东西,可用于学习嵌入式和学习借用/使用驱动程序或从数据表中编写自己的驱动程序。如果仍然可用,Atmel AVR蝴蝶也是一个很好的电路板,可能需​​要在自己的串行端口上焊接以对其进行编程,或者只是将一些电线塞在孔中。它为您提供了一些您可以学习编程的外围设备。

即使您最终从事涉及在Linux或RTOS上使用SDK或API调用编写应用程序的嵌入式工作(切勿接触硬件或阅读数据表),上述知识仍将使您领先于其他领域。


3

本文(从葡萄牙语自动翻译为英语)对开发嵌入式软件开发人员的职业进行了很好的概述。注意:原始文件在这里

它首先概述了您必须开发的知识领域:

  1. 知识:您必须了解嵌入式系统涉及的理论。这意味着硬件和软件。在不了解正在运行的硬件体系结构的情况下,不可能成为合格的嵌入式软件开发人员。

  2. 技能:您需要获得该领域的经验。需要练习。您可以修饰所有的PIC汇编器助记符,但是如果您不能以此知识来驱动LED,那就没有用了。

  3. 态度:最重要的是,您需要采取能够使您在该领域成长的态度。它是非常动态的,具有频繁的变化和发展。您需要始终保持积极性(a)自学,喜欢学习,“调整”并了解事物的工作方式。没有这种态度将很快给你。因为这个区域需要非常非常持久。

然后,它提供了以下技巧以帮助您掌握这些领域(并通过进一步的文字来开发它们,这些只是标题):

  1. 您需要学习的硬件(至少)
  2. 您需要学习什么软件(至少)
  3. 另外,研究操作系统
  4. 你需要培训
  5. 不要停止,继续学习和发展您的网络!

1
感谢您的链接!Google翻译似乎表明它非常适合这个问题。但是,我们希望(1)文本是英语的(尽管很多人至少是双语的,我们还是一个英语社区)-仅在需要时自动翻译(2)答案包括链接失效的文章摘要。我已经编辑您的帖子以遵守这些准则,并为此给您支持!
凯文·维米尔

2

在成为嵌入式软件工程师之前,请三思而后行。我在职业生涯中经历了一些阶段。我开始从事软件开发工作的前5年,而不是从事销售/市场营销工作,在15年的时间里,我管理着100 + M $的业务,现在我又回到了软件领域。

在15年后回到软件领域时,我记得为什么我会一开始就离开。很难。它需要集中精力,几百行代码相互接触,而且都需要将其保存在内存中。嵌入式特别困难。

您还需要了解自己。如果您通常是一个聪明,认真,耐心的人,那么您将成为一名出色的工程师。如果您缺少其中任何一个,则充其量只能算是平均水平。考虑一下。如果您非常聪明并且没有耐心,那么就不值钱了,因为无论您多么聪明,好的工程都需要耐心和对细节的关注。

您还需要一次查看代码小时数而不说话而感到自在。我观察到具有良好社交能力的人发现这难以忍受。

如果所有这些都检查完了,那么,比起阅读所有这些好书,进行练习,您将成为一个伟大的工程师。


1

其他人都说很棒的话。因此,我将为您提供一般建议:读读读读读读读读读!

阅读http://embeddedgurus.com上的所有文章 如果您不了解某些内容,请进行研究。如果在对这些内容的解释中发现不了解的内容,请阅读更多内容。我将要进入嵌入式软件领域,在过去的几年中,我的经验是一些专业项目,并且有很多阅读经验。经验可以让您尝试一些事情,而阅读可以让您知道您尝试过的事情是否曾经做过,也许比您能做的更好。它向您介绍了在任何情况下都可以使用的概念。

刚读!


0

成为C了解计时器和串行通信的专家。您应该弄脏它。了解RF协议,并根据您的要求进行调整。调试时不要盲目尝试代码组合。代码完全按照您的要求执行。阅读用户手册和数据表,如果不起作用,请进行更改。综上所述,成为专家的唯一真正途径就是实践。继续构建应用程序。很快,它将成为第二天性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.