微控制器编程学习应该选择哪种语言?

14
我正在学习微控制器编程,听到了不同的观点。在微控制器编程行业中,最常用的语言是什么?您在自己的工作中使用这种语言吗?如果不是,为什么不使用?
附注:我希望答案不是汇编语言。

10
组装...等待... - Pierreten
很难说...因为微控制器是相对低级的设备,通常具有不可移植的指令集。你要进入哪个家族? - futureelite7
4
我曾尝试加入一个名为布雷迪的家庭,但那是一段时间之前的事情。;-) - Thomas Matthews
1
除非您正在设计微控制器而不是为微控制器编程,否则我认为您不需要使用Verilog。 - jk.
请参考 https://dev59.com/3HRB5IYBdhLWcg3wiHll,了解非 C 选项的有趣调查。 - Craig McQueen
我迫不及待地想学习汇编语言(它是如此底层!),我们很快就要在学校学习微控制器编程了!耶! - Lexus de Vinco
10个回答

38

我的经验是,你必须掌握C语言,汇编语言也有帮助。


很好的简短直接回答问题的答案(不像我的!)。 - Clifford
您应该对C语言如何编译成汇编代码以及平台上的任何相关特性有一个基本的理解 - 例如,您可以为PIC编写指向结构体的指针代码,但它可能效果不佳。能够阅读汇编代码将有助于调试。您很少需要使用汇编语言编程,因为C语言提供了足够原始的访问。 - pjc50

13

除非你在处理非常基础的微控制器(如RS08系列),否则C语言是首选语言。了解C语言,理解诸如volatile和const等功能。还要了解体系结构-什么是高效的,什么不是,CPU可以做什么。这些与“桌面”环境大相径庭。学会热爱stdint.h。

随着项目规模的扩大,您将遇到C++(或受限子集)。

但是,您需要了解CPU以及如何阅读基本汇编语言作为调试工具。如果没有这种技能组合,就无法成为优秀的嵌入式开发人员。


stdint.h很好。特别是在PC上测试您的代码时。 - Craig McQueen

13
你听到了哪些“对比”的观点?在某种程度上,这取决于微控制器和应用程序。然而,C语言适用于几乎所有架构(我不敢说全部,但可能是您将遇到的所有架构),因此仅从这一点来看,学习C语言将为您提供最广泛的覆盖范围。
对于所有架构,汇编器和C编译器的可用性基本上是确定的。对于32位和大多数16位架构,C++也将可用。我遇到的值得注意的例外是Microchip的PIC24/dsPIC部件,Microchip自己的基于GNU的编译器不支持C++(尽管第三方编译器可能支持)。
虽然有8位微控制器的C++编译器,但C++在这些平台上并不普及,而且经常使用的编译器是完整语言的子集。对于通常使用8位的应用程序类型(或更具体地说是大小),C++可能会有用,但不像在更大的应用程序上那样,所以C通常足够。
有很多有关嵌入式系统中C++的神话;虽然该语言比C更大,并且具有可能损害系统性能或容量的结构,但您只需为使用的部分付费。但当然,如果您只使用C子集,则在任何情况下都足够使用C。
关于C(和C++)的重点在于它是一种系统级语言;它可以在您的微处理器上运行,除了一个非常简单的运行时启动以初始化处理器(以及可能的外部SDRAM)、初始化静态数据、建立堆栈,并在C++中调用静态构造函数之外,不需要任何其他支持。这就是为什么除了针对特定目标的汇编语言之外,它被用来构建操作系统和内核——它本身不需要操作系统或内核来运行。
我提出这个可能取决于微控制器的原因之一是,例如,如果它是带有几MB外部SDRAM,至少大约4MB闪存(通常也是外部-内存占据了很多芯片面积)的ARM9,则可以在其中运行“重量级”操作系统,如Linux、WinCE或Symbian,甚至是QNX或VxWorks这样的大型实时操作系统。然后,当您选择语言(在使操作系统工作后)时,将受到操作系统的影响,尽管对于实时应用程序,C和C++仍将占主导地位(或者在军事、航空电子和某些交通应用中通常使用Ada语言)。
对于中等大小的应用程序——几百KB的代码和数据空间——在.NET-Micro平台上运行C#是可能的;然而,几年前在英国的嵌入式系统展览会上,我参加了这个平台的演示。当我问“但它是实时的吗”,并被告知“不,你需要WinCE才能实现”,观众中出现了一阵叹息和抱怨,其中一些人停止浪费时间,立即离开了演示(包括我)。

我依然对你听到的“对比”观点感兴趣;虽然使用其他语言是 可能 的,但回答你的问题:

在微控制器编程行业中最常用的语言是什么?

明确的答案是 C,出于我提供的原因。对于任何想要质疑这一论断的人,这里有统计数据(请注意文本中解释的 2004 年之后不同的调查方法)。不过,为了增加备选方案的数量,我曾花两年时间在嵌入式系统上使用 Forth 进行编程,并且我知道还有人在使用它,但它有点小众。


11

我已经成功地使用了C和C++,但在几乎所有的微控制器项目中,你都需要熟悉目标微控制器的汇编语言。即使只是用于调试底层硬件问题,汇编也是不可或缺的,即使只是粗略的了解。

当从桌面环境转移到微控制器时,我认为最难的事情是几乎所有东西都需要静态分配。除非可能具有外部RAM,否则在微控制器中很少使用malloc/new。

我注意到你还使用了FPGA和Verilog标签,可以看看Altium,他们有一个将C编译成硬件代码的编译器,并与他们的集成环境良好配合。


9
关于汇编语言:
  • 尽可能使用C/C++,而不是汇编语言。通过尽可能多地使用C或C++来编写代码,您将获得更高的生产力。这包括能够在PC上运行一些代码,从而有助于开发更高级别的代码(应用程序层函数)。
  • 在许多嵌入式平台上,最好有一个对汇编语言感到舒适的人参与项目。主要是为了使启动代码和中断正常工作,并且可能还需要中断使能/禁用函数。这并不意味着必须非常深入地了解它——只有基本的工作知识就足够了。
  • 如果您正在将RTOS(例如µC/OS-II)移植到新平台,则必须更加了解汇编语言。但希望您的RTOS已经很好地支持您的平台。
  • 如果您正面临CPU性能限制,那么您可能需要更全面地了解汇编语言。但希望您不会过多地挑战性能极限,因为这可能会拖累项目的可行性。
  • 如果您正在为DSP编写代码,那么您可能需要相当深入地了解DSP的汇编语言。

5
在使用汇编语言编写程序之前,先用C或C ++编写函数。然后让编译器生成该函数的汇编代码清单。编译器已为您完成了大部分工作,只需根据需要进行微调即可。 - Thomas Matthews

3

微控制器最初只能使用汇编语言进行编程,但现在也普遍使用各种高级编程语言来针对微控制器进行编程。这些语言要么专门为此设计,要么是通用编程语言(如C编程语言)的版本。通用编程语言的编译器通常会有一些限制和增强功能,以更好地支持微控制器的独特特性。一些微控制器具有开发某些类型应用程序的环境。微控制器供应商通常会提供免费工具,以便更轻松地采用其硬件。

许多微控制器非常奇怪,以至于它们实际上需要自己的非标准C方言,例如8051的SDCC,这样甚至无法使用标准工具(如代码库或静态分析工具),即使与硬件特性无关的代码也是如此。解释器通常用于隐藏这种低级别的怪癖。

一些微控制器也提供解释器固件。例如,早期微控制器Intel 8052上的BASIC;Zilog Z8上的BASIC和FORTH,以及一些现代设备。通常,这些解释器支持交互式编程。

一些微控制器有模拟器,例如Microchip的MPLAB环境。这些允许开发人员分析微控制器及其程序的行为,如果他们使用实际部件应该是什么样子的。模拟器将显示内部处理器状态以及输出状态,并且允许生成输入信号。虽然一方面大多数模拟器将受到无法模拟系统中其他硬件的限制,但它们可以模拟可能难以在物理实现中随意重现的条件,并且可以是调试和分析问题的最快方法。


2

您需要了解汇编语言编程。您需要对C和C++有良好的知识。因此,请努力学习这些内容,以便在微控制器编程方面获得更好的专业知识。


1
作为嵌入式系统开发人员的20年中,我从未学习过完整的汇编指令集,除了8051。你需要知道什么是汇编语言,并且有时需要能够阅读和理解指令集手册,但我不会过分强调这个要求,除非你必须从头开始编写C运行时启动代码(并且现有示例不常见)。 - Clifford
汇编语言对于许多微控制器来说已经不再是必需品。许多工程学士课程甚至因为缺乏前途而放弃了这门课程。C和C++才是王道。 - Mast

2

还有VHDL不能忘记。


2
对于微控制器来说,情况并不是很多。 - Yann Ramin
2
他确实有一个FPGA标签。 - rzrgenesys187

2

对于微控制器,汇编语言先于C语言出现。在ARM开始进入这个市场之前,编译器很差,存储器和只读存储器非常小。资源不足或者普遍性不足,无法移植代码,因此使用C语言以实现可移植性是没有意义的。

一些微控制器的汇编语言质量欠佳,而ARM正在接管这个市场。用更少的资金、更少的功耗和更小的占地面积,你可以拥有一个具有更多资源的32位处理器。这是非常明智的选择。虽然许多代码仍无法移植,但你可能可以尝试使用C语言。

总之,汇编语言和C语言。如果某公司宣传BASIC或Java等其他语言,请将该公司列入黑名单并继续寻找其它公司。我们曾经历过这种情况,留下了伤疤作为证明。


0

首先是汇编语言。其次是C语言。

我认为,懂得汇编语言和C语言的人比只懂得C语言的人更优秀。


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