软件开发人员来说,低级别/嵌入式系统编程难吗?

15

鉴于我的综合背景,我能覆盖从模拟电子到编写简单与RDBMS后端交互的应用程序等领域。

我目前在一家开发解决特定行业问题硬件的公司工作。我们有一个经验丰富的程序员,他已经为PC编写了商业应用程序、视频游戏和其他很多东西。但是当我跟他谈论低级编程时,他同时表达了兴趣和疑虑/不确定加入这个项目。

即使是关于PC,他似乎更喜欢操作语言级别而不是更低级别的东西(指令集,ISR)。尽管如此,他是个聪明的人,我认为他一旦度过初始学习阶段就会喜欢这项工作。但也许那只是我自己对底层编程的热情在说话……如果他真的感兴趣,也许他已经开始朝着那个方向学习了呢?

您是否有在软件到硬件(或低级软件)转换方面的经验?或者,更好的是,您有将纯软件人员转型为低级别编程方面的经验吗?

编辑:

附言:我很想听听回答者的背景是什么-- EE,CS,还是两者兼备?


一个旁注--我问这个问题的部分原因是,如果他不喜欢做嵌入式开发,我们可能会开始寻找添加一个“固件工程师”。 - Toybuilder
根据您的要求 - 我是一名计算机工程师,更喜欢硬件/固件开发方面,但在整个范围内都感到自在 - 请查看我的stackoverflow和/或linkedin个人资料。 - Adam Davis
我拥有1985年左右的CIS学位,并在不同领域工作过,从一家工程公司做PA&C到多个[已死]网络初创公司,从工程到金融服务。 - Ken Gentle
问题的一部分是担心每段代码的执行时间。 - Brad Gilbert
17个回答

16

说到底,一切都是API。

需要在微控制器内部为SPI外设编写代码吗?获取数据表或硬件手册,并查看SPI外设。这是一个大而复杂的API。

问题在于,在理解API含义之前,您必须了解硬件和一些基本的EE基础知识。数据表不是由软件开发人员编写和编写的,而是为硬件工程师和可能的软件工程师编写的。

因此,这一切都是从硬件的角度来看的(承认吧-微控制器公司是一个充满硬件/ ASIC工程师的硬件公司)。

这意味着过渡绝不是简单明了的。

但并不困难-它只是略有不同的领域。如果您可以实施学习计划,请从 Rabbit Semiconductor 的套件开始。有足够的软件,以便SW人员可以轻松地深入挖掘,而HW易于处理,因为所有内容都包装在不错的库中。当他们想要做一些复杂的事情时,他们可以深入直接访问硬件并在较低级别上进行操作,但与此同时,他们也可以做一些相当酷的事情,例如构建小型 Web服务器 pan / tilt网络摄像机。还有其他公司提供类似的产品,但Rabbit确实专注于使硬件易于软件工程师使用。

或者,将其引导到Android平台。对他们来说,它看起来像Unix系统,直到他们想做一些有趣的事情,然后他们会有攻击这个小问题的愿望,他们会学习硬件知识。

如果你真的想深入了解,可以选择一个Arduino套件——价格便宜,有免费的编译器和库,很容易入门,但是你必须通过连接电线来完成一些有趣的事情,这对于一个不情愿从事软件工程师的人来说可能是一个太大的障碍。但只要给他们一点帮助和正确的指引,他们就会非常高兴拥有一个像夜行者灯光一样摇晃的LED显示屏......-Adam *是的,那是一个技术工程术语。

在我看来,低级API比一些 web Leviathan 更容易处理和理解。它会告诉你 准确地 该做什么,什么是允许的以及何时执行。你只需要处理字节和位(以及位掩码),但也仅此而已。 - Nick T

9

我曾经合作过的最好的嵌入式程序员都接受过电气工程师的培训,在工作中学习软件编程技术。而最差的嵌入式开发人员则是最近才毕业的计算机科学专业学生,他们认为软件是解决问题的唯一途径。我认为嵌入式编程是软件金字塔底层,是一个稳定的抽象层/基础,使应用程序开发变得容易。


1
嵌入式系统设计需要理解硬件和软件问题。令人沮丧的是,许多硬件似乎是由对软件易于或困难的事情知之甚少的人设计的。设备通常包括可能旨在有所帮助但最终成为麻烦的硬件。例如,假设芯片具有每秒计数32,768次的48位计数器。读取低半部分锁存器的上半部分可能很有用,但除非在低半部分和高半部分读取之间禁用中断... - supercat
如果在两次读取之间,中断也读取了计时器,则尝试读取计时器可能会产生损坏的数据。相比之下,如果没有这样的硬件存在,软件将不得不读取低半部分和高半部分,然后重新读取低半部分以确保它没有改变(如果改变则重新启动操作),但是这样的过程可以在主循环和中断上下文中使用,而不会干扰同时读取。 - supercat

6

“难”是一个极其相对的术语。如果你习惯于为小型嵌入式代码(例如,你是驱动程序开发人员)进行紧密、有时复杂的思考方式,那么当然它不是“难”的。

并非要“抨击”(无意冒犯)shell脚本编写者,但如果你整天写perl和shell脚本,那么它可能会很“难”。

同样,如果你是Windows的UI设计师,那么这是一种不同的思维方式。


5

为什么嵌入式开发很“难”:

1)每个机器指令之间上下文可能会切换到中断。由于高级语言结构可能映射到多个汇编指令,这甚至可能在一行代码内发生,例如long var = 0xAAAA5555。如果在中断服务例程中访问,在16位处理器中,var可能只设置了一半。

2)对系统的可见性有限。除非自己编写输出,否则您甚至可能没有输出到Hyperterm。仿真器并不总是工作得那么好或一致(虽然它们比以前要好得多)。您将需要知道如何使用示波器和逻辑分析仪。

3)操作需要时间。例如,假设您的串行传输器使用中断来表示何时发送另一个字节。您可以将16个字节写入传输缓冲区,然后清除中断,并想知道为什么消息从未发送。总体而言,时间是嵌入式编程的棘手部分。

4)您会遇到微妙的竞争条件,这些条件很少发生且非常难以调试。

5)您必须阅读手册。很多。不能通过胡闹使其工作。有时必须正确设置20个东西才能得到您想要的结果。

6)硬件并不总是工作或易于损坏,并且需要一段时间才能弄清楚您是否损坏了它。

7)嵌入式系统中的软件维修通常非常昂贵。您不能只更新一个网页。召回可能会抹去您在设备上获得的任何利润。

可能还有更多,但我现在有一个竞争条件要解决...


4
我猜这很主观,他的原因可能有很多。但如果他像我一样,我知道他出发点在哪里。让我解释一下。
在我的职业生涯中,我致力于电信行业六年,与嵌入式SDK中间件等低端手机密切合作。
我经历过的大多数嵌入式环境对程序员来说就像恶劣的天气,你必须不断克服资源等方面的限制。有些人可能会将其视为挑战,并从中获得乐趣;有些人可能会觉得自己接近“真正的东西”——硬件;有些人可能会觉得这种方式限制了他们的创造力。
而我则感到它限制了我的创造力。
我喜欢回到Windows桌面环境,在复杂的类设计中打翅膀,用额外的时钟周期拉伸我的腿部,为诊断使用不必要的内存等。
在以前的某些嵌入式单元中,我几乎没有支持fseek()(ANSI C标准文件函数)。如果幸运的话,“看门狗”可以提供关于何处崩溃的线索。更不用说在单线程抢占性沼泽中与用户通信的痛苦了。
你知道我在说什么。在我看来,这并不一定很难,但它是一个相当大的飞跃,可能会很少重用你现有的经验。
问候
罗伯特

3

从用户级应用程序开发(即通用PC或Web应用程序)到硬性截止日期、实时响应应用程序开发(即硬件/软件接口)的思维方式存在着非常真实的差异。

中断、指令集、上下文切换和硬资源约束对于普通开发人员来说相对不太熟悉。在这里我假设你所说的“普通开发者”并非受过电气/电子或其他工程师培训。

这位开发者的转型可能会远远超出他的舒适区。我们中有些人喜欢这样的挑战,而另一些人可能已经决定放弃。

同样,那些从事硬件领域的人(即工程师)往往难以理解软件开发的假设和语言。

当然,这些只是粗略的概括,但希望能提供一些见解。


3
他需要熟悉底层内容,但主要是用于调试和现场问题。根据架构,这需要一定的学习曲线,但并非不可能。另一方面,低级别代码通常需要更多的时间和调试比高级别代码更多。因此,如果您需要经常返回到低级别,则设计可能存在问题。即使对于我构建的嵌入式控制器,我也花费了大部分时间在高级别代码中。尽管当您遇到问题时,拥有非常好的低级别知识非常有优势。

3
我是一名从电子工程转行的软件工程师。我更喜欢编写低级代码。我认识的大多数经典训练过的软件开发人员都不想在这个级别上操作,他们想要调用API。所以对我来说,这是一个双赢局面,我为他们创建了低级驱动程序和API供他们使用。有一个“新”的学位,至少是我上大学后才出现的,叫做计算机工程师。嗯,这可能是电气工程学位而不是计算机科学,但它是软件和数字硬件基础的很好的结合。我与这个领域的人一起工作过,他们对低级编程更加熟悉。
如果个人不舒服或不愿意,则请将其安置在他们感到自在的地方。让他们进行文档编制或工作于用户界面。如果公司所有工作都需要低级编程,则该个人需要完成此项工作或找到另一份工作。不要掩饰实情。
我还认为,一旦他们克服了困难,就会喜欢这个级别的自由,不受操作系统等的限制。最近,我见证了几位同事第一次看到他们的软件在模拟下运行的经历。处理器内部和其他芯片外设的每个网络。你没有一个GUI(调试器)上的表格显示内存的当前状态,你必须查看内存总线,查找你感兴趣的地址,查找读取或写入信号和数据总线。我担心有一天硅到来了,他们就再也没有这种级别的可见性了。这会像戒毒者一样。

2
嗯,我14岁开始阅读《流行电子》杂志时就开始接触硬件了 - 如果你想知道的话,那时还没有个人电脑,如果你已经知道了,那就好。哈哈

我曾经在8048/51微处理器上做过低级位操作,也做过PIC和其他一些单片机变体,当然还有Rabbit Semiconductor。(如果你喜欢C语言,这很棒)。这是很棒(而且有趣)的东西;是的,有一种不同的看待事物的方式 - 不是更难,但其中一些信息可能会比软件问题更难以获取。(当然,这取决于你所交往的朋友圈)。

但是,说了这么多,我想提醒你一种技术,它开始为程序员进入硬件世界架起了桥梁,现在已经成为一个非常重要的角色,那就是.NET微框架。你可以在以下网址找到关于这项技术的信息。

http://msdn.microsoft.com/en-us/embedded/bb267253.aspx

它解决了一些与.NET Web开发相同的问题,因为您可以在新环境中使用某些(实际上相当多)现有的基于PC的知识-当然要小心,因为目标机器可能只有64K(或更少),而不是4G的RAM。
从.NET微框架2.5版本开始,您可以访问网络和Web服务-很酷,对吧?它并不止于此...想控制房子里的灯吗?怎么样一个温度记录站?所有这些都可以用您已经具备的技能来完成。好吧,大多数情况下是这样--查看链接。
SDK插入到您的VisualStudio IDE中。有许多“开发工具包”可用,价格非常合理-现在,通常需要在组件、构建电路板和布线等方面花费大量学习曲线的事情可以通过一个开发套件和一些相当简单的代码轻松完成-当然,您可能需要偶尔进行一些位操作,但越来越多的传感器提供.NET微框架驱动程序-因此,硬件开发可能比您想象的更接近...
希望它有所帮助...

1
低级别的嵌入式编程通常也包括低级别的调试。在我的经验中,这通常涉及(至少)使用示波器。除非您的同事愿意花费一些时间与硬件保持物理接触并考虑微秒和伏特,否则我会建议让他们离开。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接