15

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

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

即使在谈论 PC 时,他似乎在语言级别上操作比在较低级别的东西(指令集、ISR)上操作更舒服。尽管如此,他还是个聪明人,我认为一旦他克服了最初的学习障碍,他就会喜欢这份工作。但也许这就是我自己对低级东西说话的热情……如果他真的感兴趣,也许他已经开始朝那个方向学习了?

您是否有进行软件到硬件(或低级软件)转换的经验?或者,更好的是,让一个只做软件的人,把他转移到低级的东西上?

编辑:

PS 我很想从响应者那里听到他们自己的背景是什么——EE,CS,两者都是?

4

17 回答 17

16

归根结底,一切都是 API。

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

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

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

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

但这并不难 - 它只是一个稍微不同的域。如果您可以实施学习计划,请从Rabbit Semiconductor的套件开始。那里有足够多的软件,所以一个 SW 人可以毫不费力地真正深入研究,而且 HW 很容易处理,因为所有东西都包含在漂亮的小库中。当他们想要做一些复杂的事情时,他们可以挖掘直接硬件访问并在较低级别上摆弄,但同时他们可以做一些非常酷的事情,例如构建小型网络服务器平移/倾斜网络摄像机。还有其他公司提供类似的产品,但 Rabbit 真正专注于为软件工程师简化硬件。

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

如果您真的想深入了解,请使用arduino 工具包- 便宜、免费的编译器和库,很容易上手,但是您必须连接线才能做一些有趣的事情,这可能太大了不情愿的软件工程师的障碍。但是一点点帮助和一些朝着正确方向的推动,他们会非常高兴拥有一个像夜行者灯一样摇晃*的 LED 小显示屏......

-亚当

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

于 2008-10-23T21:26:51.920 回答
9

我合作过的最好的嵌入式程序员都是受过EE培训并在工作中学习过软件的。最差的嵌入式开发人员是最近的 CS 毕业生,他们认为软件是解决问题的唯一方法。我喜欢将嵌入式编程视为软件金字塔的底部。它是一个稳定的抽象层/基础,使应用程序开发人员的生活变得轻松。

于 2008-10-24T00:01:20.860 回答
6

“硬”是一个非常相对的术语。如果您习惯于对小型嵌入式代码(例如,您是驱动程序开发人员)进行严格的、有时令人费解的思考,那么这肯定不是“难”的。

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

同样,如果您是 Windows 的 UI 专家。这是一种不同的思维方式。

于 2008-10-23T21:15:03.007 回答
5

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

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

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

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

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

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

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

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

可能还有更多,但我有这个比赛条件要解决......

于 2013-10-01T19:49:58.043 回答
4

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

在我的职业生涯中,我在电信行业投入了 6 年的时间,主要从事将 SDK 中间件嵌入到低端手机等方面的工作。

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

我是那种觉得它限制了我的创造力的人。

我喜欢回到 Windows 桌面环境,用精心设计的课程振奋我的翅膀,额外伸展我的腿几个时钟周期,使用不必要的内存量进行诊断等。

在过去的某些嵌入式单元上,我几乎不支持 fseek()(一个 ANSI C 标准文件函数)。如果幸运的话,“看门狗”可以提供坠毁地点的线索。更不用说在单线程抢占式沼泽中与用户交流的痛苦。

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

问候

罗伯特

于 2008-10-23T21:35:45.133 回答
3

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

于 2008-10-24T03:32:04.150 回答
3

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

中断、指令集、上下文切换和硬资源约束对于您的普通开发人员来说是相对未知的。我在这里假设您的“普通开发人员”不是经过培训的电气/电子或其他工程师。

您提到的这位开发人员的过渡可能远远超出了他的舒适区。我们中的一些人喜欢这样伸展。我们中的其他人可能认为这个观点不值得攀登。

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

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

于 2008-10-23T21:29:58.590 回答
3

我是一名 EE 转为软件工程师。我更喜欢编程低级。大多数软件开发人员都接受过经典培训,我知道他们不想在他们希望 api 调用的这个级别上操作。所以对我来说这是一个双赢,我创建了低级驱动程序和 api 供他们使用。有一个“新”学位,至少是我上大学以来的新学位,叫做计算机工程师。嗯,它可能是电气工程学位而不是计算机科学,但它是软件和数字硬件基础知识的完美结合。我在这个领域共事过的人对低水平更适应。

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

我还认为,一旦他们克服了困难,他们就会享受它,你在那个级别上拥有的自由,不受操作系统的阻碍等等。最近我亲眼目睹了一些同事第一次看到他们的软件在模拟下运行的体验。处理器和其他片上外围设备内的每个网络。不,您在 gui(调试器)上没有显示内存当前状态的表格,您必须查看内存总线,查找您感兴趣的地址,查找读取或写入信号和数据总线。我担心芯片到货的那一天,它们不再具有这种可见度。会像排毒瘾君子一样。

于 2009-05-18T02:16:13.200 回答
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 微框架驱动程序——所以,硬件开发可能比你想象的更接近……

希望能帮助到你...

于 2008-11-11T03:04:48.430 回答
1

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

于 2008-10-23T22:32:56.327 回答
1

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

于 2013-03-27T10:33:53.120 回答
0

同意“硬”这个词是相当相对的。

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

于 2008-10-23T21:34:39.253 回答
0

你是对的,任何有足够知识不会完全迷失在某个领域(在驼峰上?)的人都会享受学习新事物的挑战。

我自己会感到非常紧张,因为要在环境中感到舒适,需要大量的背景知识才能转移到指令集等级别。

如果您能够支持开发人员学习如何做到这一点,它可能会有所作为。有一个人在那里你可以询问和讨论问题,这对这种领域的变化有很大的帮助。

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

于 2008-10-23T21:40:32.347 回答
0

我想说这并不难,它只是需要不同的知识集,不同的考虑。

于 2008-10-23T22:08:18.483 回答
0

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

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

如果他们是那种了解他们习惯的 api 和环境下发生的事情的人,那么进入嵌入式开发就不会太费力了。

但是,如果他们的世界观停留在他们一直在使用的高级 api 上,并且他们对这之下的任何东西都没有概念,那么他们将很难过。

作为一个(非常)一般性的陈述,如果他们对多线程应用程序工作感到满意,他们可能会没事,因为这与您在处理嵌入式项目时遇到的一些数据易失性问题相同。

综上所述,我见过更多的嵌入式程序员在 PC 开发中成功工作,而不是相反。(当然我可能没有看到一个公平的横截面)

于 2008-10-23T23:16:53.320 回答
0

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

于 2008-10-24T00:03:00.687 回答
0

我最初是一名软件工程师,现在我是一名硬件工程师!重要的是要了解它是如何工作的并有动力!

于 2013-03-26T14:55:02.763 回答