it-swarm.cn

嵌入式编程是否更接近于电气工程或软件开发?

我正在从事在微控制器上编写嵌入式C的工作。起初,我本以为在软件堆栈上嵌入编程对我来说太少了,但是也许我在想错了。

通常我会放弃编写嵌入式代码的机会,因为我不认为自己是电气工程师。这是一个错误的假设吗?我是否能够为嵌入式系统编写有趣且有用的软件,还是会因为软件堆栈太低而踢自己?

我上了计算机科学学校,对编写编译器,考虑并发算法,设计数据结构以及开发框架感到非常满意。但是,我目前受雇为一名Web开发人员,这并未激起我刚才描述的有趣的事情。 (我目前处理的问题是:“此复选框必须在左边4像素处”和“此日期格式错误”。)

感谢大家的投入。我知道我必须自己做决定,我只是想澄清一下成为嵌入式程序员的含义,以及是否适合我觉得有趣的事情。

35
Jeremy Heiler

如果您想擅长在嵌入式系统上工作,那么可以,有时候您需要像EE一样思考。通常,这是在编写代码以与各种外设(UART,SPI,I2C或USB等串行总线),8位和16位定时器,时钟发生器以及ADC和DAC接口时。当微控制器描述每个寄存器的每一位时,它们的“数据表”通常会运行数百页。能够读取原理图很有帮助,因此您可以使用示波器或逻辑分析仪来探测电路板。

在其他时候,它只是在编写软件。但是在严格的约束下:通常您将没有正式的OS或其他框架,并且可能只有几个KB的RAM,也许还有64 KB的程序存储器。 (这些限制是假设您正在使用较小的8位或16位微控制器进行编程;如果您在32位处理器上使用嵌入式Linux,则不会有相同的内存限制,但仍然必须处理任何自定义Linux发行版不提供驱动程序的外围硬件。)

我在EE和CS方面都有背景,所以我喜欢硬币的两面。我也进行一些Web编程(主要是PHP)和台式机应用程序(C#和Delphi),但是我一直最喜欢从事嵌入式项目。

33
tcrosley

@tcrosley的答案非常好。您无需成为电气工程师,但了解基础知识会有所帮助。

我认为您不必担心“软件堆栈太低”。作为嵌入式工程师,我不得不解决许多非常有趣的问题。您提到您喜欢的任务列表:

  • 并发算法-处理异步硬件级中断与使用OS线程模型一样有许多有趣的挑战。

  • 设计数据结构-检查。专为紧凑和高效访问而设计。

  • 开发框架-检查。在裸露的骨骼系统上,您最终可以设计一个小型OS。

  • 编写编译器(也许不是),但最终可以进行低级代码优化,类似于编译器的Assembly生成步骤。

我会选择每天通过UI编码在嵌入式系统上工作。您将永远不会忘记第一次看到机器开始按照编程的方式移动。比推动像素更令人满意。

20
AShelly

作为嵌入式程序员,我的工作是使自定义硬件起作用。通常,我在开发板上开发了一系列软件,或者开发了较早版本的硬件。当新的电路板出现时,我的工作是将我的软件放在电路板上并演示一切正常。

因为几乎总是存在某种问题,所以调试技能至关重要。如果外部外围设备不工作,是否是芯片损坏,与芯片的连接不良,错误的代码或对片上外围设备的错误使用?唯一的方法就是进行广泛的调试。这意味着您对示波器,网络分析仪,逻辑分析仪和目标调试器感到满意。调试过程几乎变得科学了。我提出了一个假设,设计了一个实验以提供支持或反对我的假设的证据,然后进行测试。

在评估实习生或新的嵌入式工程师时,此技能至关重要。所有软件都有问题,但是一旦您开始接触物理世界,这些问题的种类就会成倍增加。我工作的本质是解决概念与现实之间的一系列长期问题。

6
Ben Gartner

以我的经验,使用“软件开发人员”帽子而不是“电子工程师”帽子在嵌入式系统软件开发方面取得了更好的结果。 (诸如TDD和CI之类的实践在硬件工程中并不常见)

另一方面,我认为开发嵌入式系统的经验会使人变得更好。更全面的软件开发人员。

5
William Payne

大约8年前,我处于类似情况。那时,我在应用程序和服务器环境中进行了7年的软件开发。我以前与硬件打交道的唯一经验是,在十几岁时就用ZX频谱编写Z80汇编程序。

这当然是一个挑战。我发现在汇编器中处理芯片组非常有趣,并且我当然学到了很多关于硬件的知识。我的主要职责是使用软件测试硬件,因此学会应付编程并认识到您的软件错误实际上是硬件错误。实际上,有时确定软件错误是硬件还是软件,软件和硬件人员可能需要花费大量工作。

我无法提供的一方面是设备驱动程序的工作。我从来没有真正理解过这一点,这是我自己和公司主管从未理解过的一件事。这只是一个公认的事实。

熟悉示波器和焊接离子将是必不可少的。记住,当硬件人员说出数字26时,他总是表示0x26是有用的。意识到硬件工程师发现对软件的处理非常令人沮丧,但随后,不涉及软件的硬件项目称为电缆。

我在这个职位上呆了4年,只是因为我被偷走了一个非常难得的机会而离开了。

3
Michael Shaw

我不是电气工程师,但是我做了少量的嵌入式软件开发。我发现的最大问题是,我在数学方面有更基础的知识,因此我不知道如何在没有太多帮助的情况下轻松地将一系列复杂的高级数学算法分解为代码。

对于我需要进行信号处理,从输入中读取值,将数据提交到输出以及所有这些东西的所有东西,我发现从概念上讲,这与我日常做的事情没什么不同老式的软件开发人员。编写软件实际上就是它。当您需要超越实际软件时,我发现事情变得扑朔迷离,因为我不具备直接与硬件打交道的知识。这通常在尝试调试或测试代码时发生。如果您有一个非常出色的工具链,那么您可能已经集成了调试和仿真环境来减轻大部分麻烦,但是即使有所有这些可以帮助您,有时您仍需要回到基础知识并针对您的代码进行测试某种分析仪,实际上是大多数嵌入式平台所提供的不仅仅是基本的编译器和EE的Ouija-Board提供的帮助。

从这个角度来看,如果任务很简单并且特定于硬件的实际需求很少,那么我认为电气工程师对于嵌入式编程不是必不可少的。除此之外,我认为在嵌入式环境中工作时,成为一名EE会使工作变得更加轻松,特别是当需要使用实际科学来确定问题出在哪里时。

2
S.Robins

我没有做过任何业务级别的嵌入式编程,但是我的学士学位主要是关于嵌入式系统的,我从中获得了几年的实际经验。我们在Atmel AVR上使用了C语言,并使用VHDL触摸了一些Texas Instruments芯片,并在ARM上有了一些理论知识。

在我们现有的程序中,大约有50%到60%的程序设计(C),20%的计划/设计(UML),其余的是物理电子设备(焊接,测量,布线,制造电缆等)。我也同意这样做是非常有趣和有趣的,而且我实际上希望自己也能从事嵌入式系统工作。 embedded,由于嵌入式系统市场很小,我不得不求助于普通的Java EE。

但是我离题了。我要说的是,上述百分比与现实世界的工作相当接近,因为我们的老师有自己的事业,并且还提到他们将尽力使其尽可能切合实际。我们甚至在项目中期的需求中随机旋转了180度,呵呵。

至于堆栈。了解嵌入式编程将为您提供大量的机会来创建您自己的和非常真实的硬件产品,这些产品可以在亚洲的真实工厂中生产,然后在您的场所(在家中或在您自己的公司中)组装。非常有趣!您还可以制作许多对家庭有用的小工具,例如运动控制的房灯,咖啡机的计时器,以自动准备您的早午餐等。确实令人兴奋的东西!

2
Juha Untinen

像所有事物一样,它需要一种平衡的方法。我喜欢在日常工作中使用嵌入式系统。他们使我在电气工程方面更好。物理计算和自动化非常令人兴奋。另一方面,构建Web应用程序和修补云计算真是太棒了。

如果操作正确,则软件方面将寻找使事情变得更聪明,更好的方法。硬件方面将使您时刻注意资源和超高效率。

2
mcotton