电子工程师的编程语言


22

我是一名电子与通信工程专业的学生,​​在上大学之前,我对编程和计算机应用程序很感兴趣。我曾经专注于设计Windows应用程序并学习其技术,但是现在,我觉得这对我的领域毫无用处……我不必学习有关计算机科学和开发软件的所有知识!(我对吗?)

我知道VB .Net,C#和C ++。我的假期有很多时间,所以我想以编程的方式深入研究“电子领域”。那么您会建议学习或专注于什么?

我想要在微控制器和其他集成电路编程中使用的那些语言。C ++是否足够,还是我也应该精通C?请告诉我您的想法。


3
“焊锡”或更严重的是,纯C对于支持工具而言相当传统,尽管python目前有点流行。
克里斯·斯特拉顿

Answers:


29

是的,学习尽可能多地使用C几乎肯定是一个好方法(C ++将为您提供一个有用的起点,尽管如左图所示,仍然有很多可以借鉴的地方,尤其是小型嵌入式系统的编码之间的差异相比于为Windows之类的工具编写代码)。

某些特定大小以下的大多数微控制器(例如PIC,AVR,MSP430等)使用C(或汇编器),因为存在许多高质量(免费和$$版本-例如,许多商业编译器基于免费的GCC编译器)可用的C编译器。
您确实获得了其他语言,例如出色的PIC JAL(原始作者Wouter Van Ooijen,是该组织的成员),PICBASIC,Ada变体,但是由于它的流行和可用的编译器数量,我想说C是首选语言对于大多数。虽然这当然并不意味着它是最好的语言,但是使用最受欢迎的语言具有明显的优势(文档,支持,可移植性,协作等)。
对于像许多ARM变体一样更复杂,更大的32位micros,还有提供C ++和其他编译器。

我会直接进入并抓住一些开发板并进行编码。您可以选择低端的8位微控制器,如PIC16F(Microchip Direct上的许多入门工具包)
,中等范围的16位微控制器(如PIC24),以及某种C / C ++ /嵌入式Linux ARM-STM32F4 ARM Cortex M4 Discovery是一个非常便宜的开发板,可能值得一试。
在可编程逻辑和硬件描述语言(HDL-其中最大的两个是Verilog和VHDL)方面,可能值得拥有Diglent或类似公司的FPGA或CPLD开发板。

如果您不想等待开发板,可以下载MPLAB或MPLABX并使用出色的模拟器尝试PIC开发。其他工具也是如此,例如,您可以免费下载Xilinx ISE Webpack并试用HDL和可编程逻辑设计。


9
PIC可能很便宜,但是冒着引发火焰大战的风险,我认为使用PIC作为学习工具可以教您编写PIC,而不是教您编写通用微控制器。为此,MSP,AVR(Arduino),低端ARM Cortex甚至是古老的8051处理器将提供更容易转移的技能。
uɐɪ

非常感谢您……这非常有用。但是,总结一下您的答案:我现在需要的是继续使用C ++并熟练掌握C,学习Verilog或VHDL或两者,并抓住一些开发板进行练习或只是将这些模拟器用作开始。
Siraj Muhammad 2012年

1
@SirajMuhammad-是的,仅此而已,除了学习Verilog和VHDL之外,可能没有必要,因为它们通常可以在设计中一起使用(例如,您可以使用VHDL中其他人设计的软核处理器,例如您的Verilog设计,并且可以正常运行),因此只需选择一个即可。
奥利·格拉泽

4
@Ian -并不是说我建议它具有成为一个PIC,这只是一个例子(因此“像PIC”)在任何情况下,如果你是C编程,我不觉得有什么太大的整体的两者之间的任何微小差异。当然,真正了解一个由内而外的微观结构(组装和全部)是有用的,但是从更高的层次开始,事情应该看起来几乎相同,只是工具有所不同。我认为在做出任何承诺之前值得尝试一下。
Oli Glaser 2012年

2
“如果您已经了解C ++,应该不会太难”?我不同意这一点,知道“ VB .Net,C♯和C ++”的人可能会以相当高级的,面向对象的RAII风格使用后者,并且可能需要一些时间才能正确掌握手册。内存管理。
大约

23

学习C语言,并获得一个便宜的微控制器开发板,例如MSP430或ARM Cortex,并至少编写和加载一些C程序。

我拥有计算机科学学位和软件开发背景,主要是游戏的C ++编程,现在是iOS游戏和应用程序,但是我的最后一份工作是准专业EE演出,首先是为ARM Cortex M3系统进行大量固件编程。 ,最后我学习了如何进行一些基本的电路设计和电路板布局,并设计了几个简单的电路板。因此,我基本上不得不面对使用最佳编程语言来桥接硬件/软件设计的问题,而这是负责这两个方面的人。

C绝对是您需要了解的语言。对于使用C ++编程的人来说,这很容易,而他们实际上不必将自己局限于C的功能集,说“这是同一件事”,但事实并非如此。尤其是C ++演变和收集功能的方式,以及主流C ++程序员使用这些功能的方式,与C ++应用程序相比,在相当大的C应用程序上工作确实是非常不同的事情。您的固件SDK将是一堆C库,适用于MCU的任何其他东西都将是C库,在MCU上有意义的任何操作系统都将用C编写,依此类推。

就是说,由于许多MCU工具链最终都使用GCC作为其编译器,因此,如果您使用的是不错的MCU系列,几乎可以肯定会有C ++编译器可用。但是,您必须非常小心使用的功能,尤其是标准库中的功能,因为最终生成的二进制文件太大而无法容纳在设备上非常容易。我认为在嵌入式设备上使用C ++是一个很好的案例,C ++具有很多不错的功能,这些功能杂乱无章,没有大小或速度上的损失,您只需要知道自己在做什么,并编写相应的代码即可就巧妙地使用功能而言,在频谱的C型端比在STL端更远。

不要太在乎那些说您可以在具有正确的嵌入式解释器的MCU上使用Lua或Python的人,等等。是的,我确实做到了,而且很有趣,但是目前,更多的是玩具项目和出现在《 Hack a Day》上的东西。我想我们会看到更多类似的东西,因为摩尔定律被无情地应用到了最小的处理器上,这是在曾经有很多汇编的游戏中发生的,然后它们在C和C ++上的使用时间更长比起其他任何人,现在一切都变得如此之快,开发人员的生产力是如此重要,以至于许多开发工作都是使用嵌入式高级语言或直接使用高级语言完成的。即便如此,距离看到公司雇用具有Python和Lua背景的固件程序员还需要几年的时间。

也不要在组装上花费太多时间。熟悉这些概念还不错,但是,如果有任何汇编编程,您不太可能会发现自己做得很多。就像游戏和嵌入式游戏一样,这是一种“常识”,这通常是由在这些领域没有实际工作的人重复的。但实际上,您根本不可能编写任何程序集,而且如果这样做,可能仅需几行代码即可进行优化,或者只需使用没有API的硬件即可(但是您会在编写包含几行汇编的代码之后)。我从事过多个游戏,并且开发过板/固件设计项目,而我为商业项目编写的组装线总数很低。它'


1
值得一提的是,您的几行汇编可能会asm()很好地嵌入到C代码中的内联汇编语句()中。这在各个方面都是一个成功的组合。高水平但紧凑,偶尔会碰到装配,例如,时机需要恰到好处。该avr-gcc工具链已经这样做了很多与C宏,所以你永远不会另行通知。
Alexios 2012年

9
能够读取程序集而不是必须编写程序集可能更重要。这使您能够了解编译器正在告诉微控制器做什么,并且在极少数情况下,能够发现编译器何时将其弄错了。您还需要对组装有所了解,以充分利用调试工具并使用它们提供的单步功能。
uɐɪ

1
绝对同意。我认为,对于有抱负的程序员来说,最好的练习之一是编写一种玩具语言编译器和代码生成器,该编译器和代码生成器至少处理函数,数组和结构,以了解堆栈框架的外观以及汇编语言中编程语言的基本要素。
Suboptimus 2012年

3
@Ian-如果您不知道如何编写汇编程序,则无法读取它。您需要阅读并将其与编写后的结果进行比较。
Rocketmagnet's

2
@Rocketmagnet-您不必检查编译器是否已生成最有效的程序集实现。要求是您能够读取生成的汇编器并检查实现的代码的逻辑是否符合您的意图。这与使用其他人类语言相同。我能说和读的法语,德语和拉丁语远远多于我说或写的能力。
uɐɪ

10

我同意其他所有人的观点,即您需要在C语言方面非常胜任。

我还建议也学习至少一种汇编语言。这样做将使您成为更好的C程序员。您需要知道引擎盖下发生了什么,这在嵌入式世界中比在PC世界中要真实得多。

了解您的C生成的汇编程序将使您在速度和紧凑性方面编写更多的最佳C。更快的代码意味着:

  • 您可以使用价格便宜的慢MCU来击败竞争对手。
  • 您可以降低时钟频率以提高EMC兼容性。
  • 在低功耗应用中,MCU可以花费更多的睡眠时间,直接延长电池寿命。

代码更紧凑意味着您可以使用内存更少的便宜MCU。或有更多功能的余地。


您可能考虑学习的另一种语言是Verilog。这是一种硬件描述语言,它与C确实有很大的不同,不仅在外观上,而且在功能上。Verilog将为利用赛普拉斯PSoC3和5等功能非常强大的芯片开辟道路。这是一个具有模拟和数字可重编程硬件的微控制器,它使您可以做一些令人惊奇的事情,而这是其他任何MCU都很难做到的。您还可以进行FPGA设计。


“一种汇编语言”是什么意思?我知道有一种语言叫做Assembly,它有分支还是类似的东西?你能说点名字吗?非常感谢您的回答。
Siraj Muhammad 2012年

4
每种类型的CPU或MCU都有自己的汇编语言和不同的指令。它们都相当相似,但有重要区别。了解您正在使用的任何MCU的汇编语言。
Rocketmagnet's

1
要说的正是这个。C和汇编语言是电子工程中最常用的,因为您通常要处理低级的东西。面向对象并不是真正被很好地利用,来自C / Assembly的低级思维也将适用于您使用的其他任何工具。
Muz 2012年

9

作为在国防界工作了8年的MSEE,我可以告诉您,了解如何在LabVIEW(一种图形化的,严格类型化的数据流语言)中很好地编程,意味着您将永远工作。

LabVIEW最初是为硬件工程师设计的一种编程语言,您可以看到这一点,因为代码看起来非常像电路图。但是,在过去的25年中,LabVIEW已发展为功能丰富的功能完善的语言,并支持对象定向和多线程。实际上,我认为没有其他编程语言(基于文本的语言或其他语言)比在LabVIEW中更容易编程多线程应用程序。这在很大程度上是由于它的数据流范例。随着CPU内核数量的不断增加,LabVIEW作为通用语言将变得越来越重要。

了解LabVIEW的另一个好处是,使用LabVIEW FPGA模块对FPGA进行编程仅需一点时间,该模块可以将LabVIEW代码并在幕后将其转换为VHDL,然后再传递给Xilinx编译器。您还可以使用LabVIEW技能,通过使用VxWorks或Phar Lap 的LabVIEW实时模块,过渡到编程实时代码。

注意:我是经过认证的LabVIEW开发人员。

在此处输入图片说明


5
我见过的所有生产型LabVIEW看起来都更像是:thedailywtf.com/Articles/Labview-Spaghetti.aspx 我毫不怀疑对于那些愿意维护此类代码的人来说,这是一个强大的就业市场。
markrages 2012年

@markrages我一直被要求维护和/或扩展代码,这种代码几乎与动态VI调用和全局变量一样糟糕甚至更糟。这个问题是LabVIEW的双刃剑。一方面,他们将其作为任何工程师都可以编程的语言进行营销,但是,如果没有坚实的软件体系结构基础,您最终会像这样获得代码。值得庆幸的是,NI提供了精心编写和注释的模板,从简单的状态机到复杂的基于OOP的actor框架,NI已充分利用LabVIEW 2012解决了该问题。
SiegeX 2012年

@markrages问题是双重的。第一,管理人员只给工程师足够的培训,以免发生危险。我要说的是,我在公司遇到的9/10个LabVIEW程序员,只接受了前两个基础课程的培训,这些课程实际上只教您语法。其次,LabVIEW已经成为一种功能丰富的语言,可以与当今的任何现代语言匹敌,因为它的图形管理认为它必须很容易。Managemnt绝不会要求软件工程师设计中等复杂的电路,但是如果他们“知道LabVIEW”,他们
就不会将

@markrages:当我想起为什么我喜欢LabVIEW时,我看到了您的评论并想起了为什么讨厌它。哦,无聊的时光又一次回来了。
Jonny B 2013年

6

如果您想对微控制器进行低级编程,那么您应该对汇编语言编程感到满意(不同的体系结构越多越好),是的,与使用C ++相比,使用C多得多。

对于一般的工程工作,通常将诸如Matlab(也包括Scilab和GNU Octave)之类的面向数学的语言用于建模和原型制作。

另外,许多用于软件和硬件的IDE都可以编写脚本,通常使用TCL或LUA,因此对脚本语言(也包括Perl,Python,PHP,Javascript等)有所了解将很有用。

对于硬件设计,您将需要Verilog和/或VHDL技能。


6

C ++是否足够?也许。

请记住,在大约90%至99%的所有MCU中都使用了C,因此C是简历中必不可少的。

但是,由于您是高级人才,您可以开始使用Arduino:s了,因为它们是按比例缩小的C ++进行编程的,这将使您大致了解C ++在当前的mcu世界中可以做什么。


3

对于微控制器(我将只讨论微控制器),我认为C是比C ++更好的入门语言。组装将是下一步,对于帮助您了解C编译器是如何使您陷入困境,创建错误,窃取时钟信号等,并从平台中获得最大性能的绝佳选择。所有这些都是假设您正在谈论的是微控制器,而不是arduino,BASIC Stamp或任何其他涉及封装微控制器的平台。

很难说什么对“您的领域”有用-并建议作为一名学生,您可能还不太了解您的领域!-但我认为您的语言集似乎很合理,您会发现自己一遍又一遍地使用它。至少,掌握一种结构化语言可以使下一种结构化语言容易得多,但是我认为您总是会发现Windows编程技能很不错。


2

如果您使用处理器,则可以学习C以及C语句生成的汇编代码的类型,但是您还应该教自己如何使用Unix命令行外壳(如bash)以及与之配套的工具(如sed, ed,awk,vim / vi,find,tar,gzip等,以及可以在许多平台上使用的Python,这是“完成任务”的好方法。


2

如果您想成为一名认真的嵌入式开发人员,则必须学习C。您也应该了解汇编程序,即使您可能很少会使用它。


0

首先,我将定义电子工程师,指的是从固件到电路板设计再到芯片设计的所有硬件设计人员。在某些情况下,您需要做固件,如上所述,您需要使用“ C”。深入的软件仅是一种工具,用从C / C ++到Lisp之类的互补语言来理解一些compsci概念要比细节更重要。您将需要软件来支持您的设计工作,但这并不能优先于理解物理实现可以完成的基本限制。即使以这些语言表达设计,数字设计也不是Verilog / VHDL。在完整的自定义和计算机设计中,您将看到Lisp像语言和C函数语言。

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.