每个微控制器线都有自己的编程语言/语法吗?


10

我已经对Arduino进行了编程,并开始对Teensy进行编程。它们类似于C,但是在编程语言中有细微差别。

例如,在Arduino C中,您调用了一个功能pinMode(pin#,Output / Input)来指定一个数字引脚以输出信号或接收信号。在Teensy的C语言中,设置与四个端口之一(每个端口代表一组引脚)相关联的“ DDR”寄存器,这些端口统称为输入或输出(Teensy IO语法)。

我想知道当您使用新的微控制器时,您需要有效地学习一种新的“语言”。我将“语言”一词用引号引起来,因为尽管语法上有细微差别,但组件及其在软件中的设置方式基本上是等效的,例如,端口和引脚的概念仍指的是您可以从中输出/输入数字的端子信号。

同样徒劳的是:是否存在在软件中进行编程的微控制器,或者将始终存在用于对uController进行编程的软件层?如果是后者,谁为他们编写/提供文档?


2
Arduino编程语言是C ++(不是(唯一)C)-或可能只是C ++的一部分(甚至是Processing)。尚不完全清楚,但肯定不止于C。例如,它具有类和用户可定义的运算符+ =
彼得·莫滕森

1
它是C ++,它使用g ++-avr进行编译。从技术上讲,它将是一个独立的C ++实现,并且不包括C ++标准库(由于需要动态内存分配和例外)。您可以使用类和模板之类的语言功能,我已经看到了基于模板的digitalWrite()替代品,其性能与直接访问寄存器相同,而Arduino方法的开销却很大。
r_ahlskog

1
语言是一样的。是不同的API。如果您不使用微控制器而开始编写台式机应用程序,则在为Windows,Linux和Mac编写C程序时将面临完全相同的问题。即使您使用纯粹的POSIX API(所有3个平台都支持),当您要保存用户的设置/首选项时,仍然会遇到平台特定的差异。
slebetman

Answers:


3

微处理器和微控制器通常将在不同产品和制造商系列之间使用共享架构。这些体系结构通常定义所有实现通用的低级命令集(指令集)。AC或C ++编译器将能够生成可在所有ARM处理器上执行的字节码。

但是,体系结构只是图片的一半。由于有许多特定的内存地址,因此主板上的外围设备,内存管理和其他实现细节是架构无法解决的

制造商或第三方通常将提供一组源文件(HDK),这些文件将提供定义,端口映射和示例代码。通常,HDK适用于CC ++。通常,HDK将具有与之关联的演示板(以500美元的arduino为例)。通常需要大量详细的配置工作,才能将开发/示例平台调整为要设计的设备

Arduino基于AVR架构,并且主要由Atmel支持。Arduino创建了一个平台引导程序以及一个简化的C ++函数和对象库,使您可以轻松使用该平台。Arduino平台和IDE专为需要最少设备的爱好者而设计。在开始使用arduino之前,PIC在易于使用且廉价的BASIC环境中扮演着类似的角色。

通常在专业环境中,此支持由卖方/制造商提供或外包给第三方。它们提供了低级代码和标头,您可以使用该HDK编写应用程序,而在大型组织中,这可以在内部完成。制造商最近在其平台上建立开放的API /软件生态系统的趋势使得它们像arduino一样易于使用。仍然有无数的芯片几乎没有编程支持,并且大多数平台知识都被企业所束缚。


14

在这种情况下,语言是完全相同的。Arduino环境恰好有一些额外的库(仅包含更多的C代码),它们“包装”对实际硬件寄存器(DDRx,PORTx,INx等)的访问,并具有更加人性化的功能。这增加了开销(同一操作需要执行更多指令),但增加了灵活性,因为编写“仅使用这些调用的程序”是“简单的”,然后将其重新定位到其他芯片(例如,arduino mega),并且该库将在内部处理适当的映射。

实际上,对于来自不同供应商的芯片之间的底层访问,实际上没有任何“标准” API。但是,所有低级访问都以相同的方式进行-读取和写入固定内存地址-因此,不同部分之间的整体访问方法将是相似的,只是细节和名称将有所不同。也许只是为头文件提供大量的#define寄存器地址列表,这些地址将转换为指针。也许头文件将使用结构来使事物保持层次结构。一些制造商可能还会提供更高级别的API。这对于复杂且难以配置的外围设备非常有用。GPIO非常简单,但是像具有DMA支持的USB控制器之类的东西可能具有数百个寄存器。

因此,最重要的是,您将需要学习一些新的寄存器名称,但是该语言仍然是C ++(或C,汇编语言,或者更深奥的语言)。


4
Arduino不仅是C(实际上是C ++),它还有一个预处理器,可以在将其馈送到C编译器之前进行一些更改。
尼克·约翰逊

实际上,对于Arduino来说,它不只是C。它是C ++(或C ++的子集)。
彼得·莫滕森

它仅仅是带有Arduino库的本地C ++还是更多?
kayleeFrye_onDeck

显然,Arduino IDE在其他标准C ++之上做了一些额外的预处理。大多数IDE都不这样做。
alex.forencich

它基本上是C ++,但main()已为您预定义。取而代之的是,您得到两个切入点:init()loop()(如果我错了,请纠正我,但我只用20英尺高的杆触及了Arduino)
slebetman 2015年

5

您在混淆微控制器和编译器。您可以在其中编写任何特定微型程序的高级语言取决于该微型程序可用的编译器。

在较低的级别上,微程序执行机器指令,编译器会从您认为是“程序”的文本文件中派生出编译器。您实际上是在指定要执行的逻辑,并且编译器指出了如何使用可用的机器指令来实现该逻辑。在这种情况下,您要编程的内容是编译器的功能,而不是micro的本机指令集。

您可以通过直接指定本机指令来对微型计算机进行编程。这是通过使用汇编语言来完成的。像编译器一样,汇编器是一个翻译器,接受您编写的文本文件并生成机器指令。不同之处在于,在这种情况下,您是直接指定这些机器指令。每个指令都有一个名称,您可以编写这些名称而不是二进制操作码,但是您仍在直接指定指令。汇编程序仅会费力地从您在文本文件中编写的名称和选项中找出每个指令的确切二进制编码。

尽管在非常不同的微型计算机上高级语言可能是相同的,但是机器指令通常仅在相关的微型计算机系列中是相似的。例如,所有Microchip PIC 18都具有相同的指令集(大部分),这与基本PIC 16有所不同,并且又与PIC 24,dsPIC 30和33之类的16位部分有所不同。


1
汇编器还会解析跳转语句的标签,这在手工完成时很容易出错。
皮特·贝克尔

2

编程语言仍然是C。但是制造商访问硬件的库不同。据我所知,没有标准,所以每个制造商都有自己的API。如果要在不同的制造商之间移植,则可能需要引入自己的抽象API来访问具有特定实现的硬件,这些实现将API映射到制造商特定的方法。


实际上,它不只是C。它是C ++(或C ++的子集)。
彼得·莫滕森

2

其他答案也区分了高级语言(例如C ++)和机器代码,尽管我不认为这会使您关于每个微控制器都有关联的“语言”的说法无效。

尽管我会毫不犹豫地将它们区分为“方言”,但语言实现的差异还不足以将其归类为不同的语言。这里可以存在两层变化。

  1. 可以从制造商或某些第三方处获得高级包装库
  2. 某些编译器可能不会发出符合标准的代码

让我们在观察Arduino平台时考虑以下几点。

  • Arduino社区为AVR架构芯片提供了高度抽象的C ++库。这些库建议的控制流与典型C ++程序所期望的不同(例如,隐藏main())。
  • 在后台,Arduino使用avr-gcc编译其代码,该代码发出C / C ++代码。但是,异常在AVR芯片上没有得到很好的支持,并且几乎总是被禁用。由于缺少如此大的功能,因此生成的程序可能不会像“常规” C ++程序那样工作。

知道这一点,您如何决定如何对任意微控制器进行编程?您有几种选择:

  1. 搜索特定芯片的社区制造的库和IDE。有时仅使用C开发AVR芯片,但是Arduino项目为爱好者提供了更加用户友好的体验。
  2. 查找能够针对您的特定芯片进行编译的编译器。有了适当的编译器,芯片的数据表以及一定的耐心,您将能够编写与金属非常接近的代码。

供参考,这是GCC支持的后端列表。您会注意到对ARM,AVR,MIPS和其他一些产品的支持。

关于未使用“软件”编程的芯片...

您可能想研究现场可编程门阵列(FPGA)!通过更改查找表的值以模拟逻辑门来控制FPGA。它本身没有相应的软件形式,但仍使用诸如VHDL和Verilog之类的硬件描述语言进行开发。


1

我看一个纸板,看到一些表面贴装设备,一些电阻器,电容器和LED。这是否意味着因为这些板之一是视频卡,所以所有带有电阻器和电容器以及多层和走线的板都是视频卡?不。

这是另一个示例,此网页使用英语字母和英语单词。那么“纽约时报”网站是否成立,这是否使该网站成为“纽约时报”?不,他们只是共享相同的字母和语言,否则完全不同。

C是一种通用编程语言,它抽象了其下面的指令集。可用于裸机,可用于创建彼此不同且互不兼容的操作系统,可用于创建视频游戏等。所有这些都使用相同的基本C语言,一些常见的C函数和构造以及他们创建的特定于目标应用程序的函数调用。对于您提到的每个平台或其他平台,可能有人选择创建一组功能。就像到目前为止,包括我在内的少数人都给了您相同的答案,但是用不同的方式写了它。以100名程序员为例,将他们彼此隔离,并赋予他们解决特定问题的编程任务,而又不完全限制他们的编程自由,您将得到从1到100种不同的,彼此不兼容的解决方案,可能不是1个,而是几个通用主题,具体取决于他们的培训和经验,然后是一组可能对于每个人来说都是唯一的变量名和函数名。以您已经在讨论的相同的板为例,您会发现我当然有自己的C代码(与arduino函数)不兼容(与许多其他功能相同),并且与其他平台也不兼容。那就是裸机嵌入式编程的美,您不受任何限制,您不必生活在操作系统的标准库调用或guis有限的规则集之内,等等。可能不是1,而是几个通用主题,具体取决于它们的训练和经验,然后是一组可能对于每个人来说都是唯一的变量名和函数名。以您已经在讨论的相同的板为例,您会发现我当然有自己的C代码(与arduino函数)不兼容(与许多其他功能相同),并且与其他平台也不兼容。那就是裸机嵌入式编程的美,您不受任何限制,您不必生活在操作系统的标准库调用或guis有限的规则集之内,等等。可能不是1,而是几个通用主题,具体取决于它们的训练和经验,然后是一组可能对于每个人来说都是唯一的变量名和函数名。以您已经在讨论的相同的板为例,您会发现我当然有自己的C代码(与arduino函数)不兼容(与许多其他功能相同),并且与其他平台也不兼容。那就是裸机嵌入式编程的美,您不受任何限制,您不必生活在操作系统的标准库调用或guis有限的规则集之内,等等。以您已经在讨论的相同的板为例,您会发现我当然有自己的C代码(与arduino函数)不兼容(与许多其他功能相同),并且与其他平台也不兼容。那就是裸机嵌入式编程的美,您不受任何限制,您不必生活在操作系统的标准库调用或guis有限的规则集之内,等等。以您已经在讨论的相同的板为例,您会发现我当然有自己的C代码(与arduino函数)不兼容(与许多其他功能相同),并且与其他平台也不兼容。那就是裸机嵌入式编程的美,您不受任何限制,您不必生活在操作系统的标准库调用或guis有限的规则集之内,等等。

您可能会选择(但很大一部分人会这样做)在别人的沙箱中玩游戏,而不是自己构建,这意味着使用arduino gui及其C库。

您可以使用同一台PC并运行不同版本的Windows,Linux,BSD和Windows的其他清单,这些清单在某种程度上使用C,但其功能调用彼此不兼容。扩展到不同硬件,相同语言的相同硬件和不兼容的C可以具有兼容或不兼容的代码。语言决不会使它们兼容。

在这些嵌入式平台上使用C是因为这是常见的做法,没有其他语言可以替代C。新处理器的第一步当然是组装,然后几乎总是C,如果功能强大到足以运行操作系统(linux,bsd等),则可能是其他步骤。C是发明的,希望能解决跨平台移植代码的问题,并且只要您使用的操作系统是与C兼容的编译器,并且其代码可以在操作系统上运行,便可以处理标准C文件。操作和printf之类的东西。但是裸机则是另外一回事,没有操作系统,通常没有文件系统或显示的概念,但是按照惯例,很可能会有C编译器将其C转换为目标特定的汇编语言。


实际上,对于Arduino来说,它不只是C。它是C ++(或C ++的子集)。
彼得·莫滕森

1

要回答您的第二个问题,术语“微控制器”表示芯片上装有CPU和RAM(可能还有ROM)。所有微控制器都运行软件-这就是为什么我们喜欢它们。

更深入地讨论第一个问题,请注意,尽管(几乎?)所有MCU都具有C编译器,但是基本的C语言并不支持每个处理器上的每条指令。例如,C具有左/右移位运算符,但没有左/右旋转运算符。C的指针系统自然不支持单独的程序和数据地址空间(就像在某些哈佛架构中一样)。C没有直接的SIMD支持。

编译器具有处理这些功能的一些选项:

  1. 扩展基本语言,通常使用新的关键字(例如,分页记忆的近和远)。

  2. 提供内在函数(例如__ror()和__rol()进行旋转)。

  3. 将它们工作到优化器中,以便将C操作序列编译为一条有效指令(例如,乘法/累加)。

  4. 如果他们想要非C标准的功能,则忽略它们并使用户编写汇编代码。

下一级别是制造商提供的头文件,该头文件主要为您定义所有寄存器。您可以自己制作这些,但是除非您是该MCU的专家,否则这将是一个很大的痛苦。

最后,还有制造商提供的库函数,可为您处理寄存器等低级内容。

您的示例混合了两个级别。DDR是引用寄存器的宏。它实现为指针访问或编译器内部函数(我忘记了)。pinMode()是为您写入DDR寄存器的函数。

当您从一条MCU线路转到另一条MCU线路时,您将必须学习新的寄存器和新的编译器怪癖。如果您住在同一家公司,则可能会获得类似的API。不同的公司不共享API。为什么我们会帮助您转向我们的竞争对手?:-)


1

在硬件级别,微控制器通常具有不同的微代码。为了避免我们输入机器代码(即数字形式的指令-每个代表微控制器的原始微代码)或使用符号汇编程序(为每个机器代码指令提供助记标签),我们使用了可移植的高级语言。

C和Forth经过精心设计,可轻松移植到不同的机器代码集中。

因此,如果您在Arduino上使用C,在Teensy上使用C,则在两种情况下都使用C。

如果您在Arduino上使用了Forth,在Teensy上使用了Forth,则在两种情况下都将使用Forth。

有时,其他硬件设施会提示该人(或组)将语言移植到新硬件上,以编写一些预制的代码,以使您能够访问硬件平台的新设施,而不必编写许多底层代码你自己

这些库(在C中)或词典(在Forth中)中可以包含一些特定于硬件的功能或单词。

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.