低级/嵌入式系统难以为软件开发人员编程吗?

时间:2008-10-23 21:09:29

标签: embedded hardware firmware

鉴于我作为通才的背景,我可以涵盖从模拟电子学到编写与RDBMS后端接口的简单应用程序的大部分领域。

我目前在一家开发硬件以解决行业特定问题的公司工作。我们有一位经验丰富的程序员,他们已经编写了商业应用程序,视频游戏以及其他一些用于PC的东西。但当我和他谈论做低级编程时,他同时表达了对加入该项目的兴趣和怀疑/不确定性。

即使在谈论PC时,他似乎比在低级别的东西(指令集,ISR)中更适合在语言级别操作。尽管如此,他还是个聪明人,我认为一旦他完成了最初的学习困境,他就会很享受这项工作。但也许这是我自己对低级别话题的热情......如果他真的感兴趣,也许他已经开始向这个方向学习东西了?

您是否有过制作软件到硬件(或低级软件)过渡的经验?或者,更好的是,只选择一个软件,并将他转换为低级别的东西?

编辑:

P.S。我很想听听响应者他们自己的背景是什么 - EE,CS,两者?

17 个答案:

答案 0 :(得分:14)

在一天结束时,一切都是API。

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

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

所以从硬件的角度来看(面对它 - 微控制器公司是一家充满硬件/ asic工程师的硬件公司)。

这意味着过渡绝非简单明了。

但这并不困难 - 这只是一个略有不同的领域。如果您可以实施学习计划,请从Rabbit Semiconductor的工具包开始。那里有足够的软件,所以一个软件开发人员可以毫不费力地挖掘,并且硬件很容易处理,因为一切都包含在漂亮的小库中。当他们想要做一些复杂的事情时,他们可以深入了解直接硬件访问并在较低级别进行操作,但同时他们可以做一些非常酷的事情,例如构建小webserverspan/tilt network cameras。还有其他公司有类似的产品,但Rabbit真正专注于为软件工程师轻松制作硬件。

或者,让他们进入Android平台。对于他们来说,它看起来像是一个unix系统,直到他们想要做一些有趣的事情,然后他们才会想要攻击这个小问题,他们就会了解硬件。

如果你真的想要深入了解,请使用arduino kit - 便宜,免费的编译器和库,非常容易入手,但是你必须连线做一些有趣的事情,对于一个不情愿的软件工程师来说,这可能是一个太大的障碍。但是在正确的方向上有一点帮助和一些推动,他们会非常激动地拥有一个像nightrider灯一样的LED显示屏......

- 亚当

*是的,这是一个技术工程术语。

答案 1 :(得分:9)

我曾与之合作过的最优秀的嵌入式程序员是EE培训和学习SW的工作。最糟糕的嵌入式开发人员是最近的CS毕业生,他们认为SW是解决问题的唯一方法。我喜欢将嵌入式编程视为SW金字塔的底层。它是一个稳定的抽象层/基础,使应用程序开发人员的生活变得轻松。

答案 2 :(得分:6)

“硬”是一个非常相对的术语。如果你习惯于以一种紧凑的,有时令人费解的方式思考小型嵌入式代码(例如,你是一名驱动程序开发人员),那么当然它并不“难”。

不要“bash”(没有双关语)shell脚本编写者,但如果你整天编写perl和shell脚本,那么它可能很难“很难”。

同样,如果你是Windows的UI用户。这是一种不同的想法。

答案 3 :(得分:5)

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

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

2)对系统的可见性有限。除非你自己写,否则你甚至可能没有输出到Hyperterm。仿真器并不总能很好地或一致地工作(尽管它们比以前更好)。您必须知道如何使用示波器和逻辑分析仪。

3)操作需要时间。例如,假设您的串行发送器在需要发送另一个字节时使用中断来发送信号。您可以将16个字节写入发送缓冲区,然后清除中断并想知道为什么您的消息永远不会被发送。一般来说,时序是嵌入式编程的一个棘手部分。

4)你受到微妙的竞争条件的影响,这些竞争条件很少发生并且很难调试。

5)你必须阅读手册。很多。你无法通过鬼混来使它发挥作用。有时候必须正确设置20件事才能得到你想要的东西。

6)硬件并不总是有效或容易损坏,需要一段时间才能弄清楚它是否已损坏。

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

可能还有更多,但我已经解决了这种竞争条件......

答案 4 :(得分:4)

我猜这是非常主观的,他的理由可能很多。但如果他像我一样,我知道他来自哪里。让我解释一下。

在我的职业生涯中,我已经为电信行业工作了6年,为将SDK中间件嵌入低端手机等工作做了大量工作。

我经历过的大多数嵌入式环境对于程序员来说都是恶劣的天气,你必须不断克服资源的限制等。有些人可能会发现这是一个挑战并且为了挑战而享受它,有些可能会感觉接近“真实的东西“ - 硬件,有些人可能觉得它限制了他们的创造力。

我认为这会限制我的创造力。

我喜欢回到Windows桌面环境中,用精心设计的课堂设计打开翅膀,额外伸展我的腿几次,使用不必要的内存进行诊断等。

在过去的某些嵌入式设备上,我几乎不支持fseek()(ANSI C标准文件功能)。如果幸运的话,一个“看门狗”可以提供崩溃事件的线索。更不用说在单线程抢先沼泽中与用户沟通的痛苦。

嗯,你知道我在做什么。在我看来,这并不一定很难,但它是一个很大的飞跃,可能很少重复使用您当前的经验。

此致

罗伯特

答案 5 :(得分:3)

他需要对低级别的东西感到满意,但主要是调试和现场问题。取决于架构,存在严重的学习曲线,但并非不可能。另一方面,低级代码(通常)比高级代码花费更多时间和调试。所以如果你需要一直回到低级别,那么设计中可能还有一些东西是不对的。即使对于我构建的嵌入式控件,我也将大部分时间花在高级代码上。虽然出现问题时,拥有非常好的低级知识是非常有利的。

答案 6 :(得分:3)

我是一名EE转型软件工程师。我更喜欢低级编程。大多数软件开发人员经过专业培训,我知道他们不希望在这个级别上运行,他们希望api可以打电话。所以对我来说这是一场双赢,我创造了低级别的驱动程序和api供他们使用。有一个“新”学位,至少从我上大学以来一直叫做计算机工程师。嗯,它可能是一个电气工程学位而不是计算机科学,但它是软件和数字硬件基础的完美组合。我与这个领域合作过的人对低级别感到更舒服。

如果个人不舒服或不愿意,请将他们放在舒适的地方。让他们做文档或在用户界面上工作。如果公司的所有工作都需要低水平的工作,那么这个人就需要这样做或找到另一份工作。不要糖涂它。

我也认为一旦他们越过驼峰,他们将享受它,你在那个级别拥有的自由,不受操作系统的阻碍等。最近我见证了一些同事的经历,第一次看到他们的软件运行在模拟下。处理器内的每个网络和其他片上外设。不,你没有gui(调试器)上的表显示内存的当前状态,你必须查看内存总线,寻找你感兴趣的地址,寻找读或写信号和数据总线。我担心硅到来的那一天,他们不再具有这种可见度。就像排毒中的瘾君子一样。

答案 7 :(得分:3)

在用户级应用程序开发(即通用PC或Web应用程序)与硬截止日期,实时响应应用程序开发(即硬件/软件接口)之间存在着非常真实的差异。

对于普通开发人员来说,中断,指令集,上下文切换和硬资源限制是相对未知的。我假设您的“普通开发人员”不是电气/电子或其他工程师。

你提到的这个开发者的过渡可能远远超出了他的舒适区。我们中的一些人喜欢像这样伸展。我们其他人可能已经认定这种观点不值得攀登。

同样,曾经在硬件领域(即工程师)的人经常对软件开发的假设和语言有困难。

当然,这些是一般性的,但希望能给出一些见解。

答案 8 :(得分:2)

好吧,当我14岁时开始阅读流行电子时,我在硬件上切齿 - 这是在个人电脑之前,如果你想知道,如果你不好,你还是知道。大声笑

我已经完成了8048/51微处理器上的低级bit-bang功能,完成了PIC和其他一些单芯片变化,当然还有Rabbit Semiconductor。 (如果你进入C,那就太好了)。这是伟大的(和有趣的)东西;是的,有一种不同的看待事物的方式 - 不是更难,但有些信息更难以获得,因为它不像软件问题那样讨论。 (当然,这取决于你所关联的朋友圈,呃)。

但是,说了这些,我想提醒你一种技术,它开始弥合程序员与硬件世界之间的差距,从此成为一个非常重要的玩家,那就是.NET微框架。您可以在以下位置找到有关此技术的信息;

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

它解决了.NET Web开发所解决的一些相同问题,您可以在新环境中使用一些(实际上相当多)现有基于PC的知识 - 当然,请注意作为目标机器没有4 GIG的RAM - 它可能只有64K(或更少)

从.NET微框架的2.5版本开始,您可以访问网络和Web服务 - 方式kewl,是吗?它并不止于此......想要控制你家中的灯光吗?临时录音站怎么样?所有人都拥有你已有的技能。好吧,主要是 - 查看链接。

SDK插入VisualStudio IDE。有许多“开发套件”可用于非常合理的现金量 - 现在,通过开发套件可以很容易地完成组件,构建电路板和连接“东西”的大量学习曲线还有一些非常简单的代码 - 当然,您可能需要偶尔进行一些操作,但是越来越多的传感器人员正在提供.NET微框架驱动程序 - 因此,硬件开发可能比您想象的更接近......

希望它有所帮助...

答案 9 :(得分:1)

我喜欢两者。嵌入式设备挑战了我,真正让我以内心的方式前进。制作影响宏观物理世界的东西非常令人满意。但由于我的学士学位是计算机科学,所以我必须在电气/电子学方面做很多事情。我有一个非常通才的背景,在那里我学习了ai,图形,编译器,自然语言等。现在我正在从事嵌入式系统的研究生工作。真正困难的部分是适应缺乏像操作系统这样的运行时设施。

答案 10 :(得分:1)

低级嵌入式编程也往往包括低级调试。其中(根据我的经验)通常涉及(至少)使用示波器。除非你的同事愿意花费至少一些时间与硬件进行物理接触并以微秒和伏特的方式思考,否则我很想留下它们。

答案 11 :(得分:0)

你是对的,任何有足够知识的人都不会在一个地区感到完全迷失(在驼峰上?)会喜欢学习新东西的挑战。

我自己会感到非常紧张,因为需要大量的背景知识才能在环境中感到舒适。

如果您能够支持开发人员学习如何执行此操作,则可能会有所不同。在那里有人可以询问和讨论问题是对这种域名变更的巨大帮助。

将开发人员分配到一个较小的项目与其他人一起作为第一步可能是值得的,看看情况如何。如果他表达了对尝试另一个项目的热情,那么事情应该从那里开始。

答案 12 :(得分:0)

我认为这不是更难,它只需要不同的知识集,不同的考虑因素。

答案 13 :(得分:0)

我认为这取决于他们在所选环境中的编程方式,以及您所谈论的嵌入式工作的类型。

比如,在一个没有操作系统的8位平台上编写代码,在嵌入式Linux平台上工作要小得多。

如果他们是那种了解他们习惯的api和环境下发生了什么的人,那么进入嵌入式开发并不会太过分。

然而,如果他们的世界观停留在他们一直在使用的高级别api,并且他们没有任何概念,那么他们将会非常艰难。

作为(非常)一般性陈述,如果他们愿意处理多线程应用程序,他们可能会没问题,因为它与您在处理嵌入式项目时遇到的一些相同的数据波动问题。

尽管如此,我已经看到更多的嵌入式程序员在PC开发中成功地工作,而不是相反。 (当然我可能没有看到一个公平的横截面)

答案 14 :(得分:0)

同意“硬”一词是非常相对的。

我会说不同,因为您需要采用不会在其他环境中使用的不同开发模式。 例如,时间约束可能需要学习曲线。 然而,好奇,对开发人员来说是一种品质,不是吗?

答案 15 :(得分:0)

“但是当我和他谈论做低级编程时,他同时表达了对加入该项目的兴趣和怀疑/不确定性。” - 这意味着你让他尝试,你准备雇用别人,以防他没有通过学习曲线。

答案 16 :(得分:0)

我最初是一名软件工程师,现在是HW工程师! 重要的是要了解它的运作方式和动力!