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

电器工程 微控制器 编程
2022-01-15 21:26:41

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

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

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

同样是徒劳的:是否有没有用软件编程的微控制器,或者总是有一个软件层用于对 uController 进行编程?如果是后者,谁为他们编写/提供文档?

4个回答

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

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

所以底线是肯定的,你需要学习一些新的寄存器名称,但语言仍然是 C++(或 C、汇编,或者更深奥的东西)。

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

在低级别,微执行机器指令,编译器为您提供的文本文件派生出您认为是“程序”的文本文件。您实际上是在指定一些要执行的逻辑,编译器会弄清楚如何使用可用的机器指令来实现该逻辑。在这种情况下,您编写的程序是编译器的功能,而不是 micro 的本机指令集。

您可以通过直接指定本机指令来对微控制器进行编程。这是通过使用汇编语言来完成的。与编译器一样,汇编器是一种翻译器,它接收您编写的文本文件并生成机器指令作为结果。不同之处在于,在这种情况下,您是直接指定这些机器指令。每条指令都有一个名称,您编写这些名称而不是二进制操作码,但您仍然直接指定指令。汇编器只做繁重的工作,从您在文本文件中写入的名称和选项中找出每条指令的确切二进制编码。

虽然高级语言在非常不同的 micros 中可能是相同的,但机器指令通常只在相关 micros 家族中相似。例如,所有 Microchip PIC 18 都具有相同的指令集(大部分),这与基本 PIC 16 不同,也与 PIC 24 和 dsPIC 30 和 33 等 16 位部分不同。

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

然而,架构只是图片的一半。由于有许多特定的内存地址、板载外设、内存管理和其他架构未解决的实现细节

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

Arduino 基于 AVR 架构,主要由 Atmel 提供支持。Arduino 创建了一个平台引导加载程序和一个简化的 C++ 函数和对象库,供您轻松使用该平台。Arduino 平台和 IDE 专为设备最少的爱好者而设计。在 arduino 之前,PIC 通过易于使用且价格低廉的 BASIC 环境发挥了类似的作用。

在专业环境中,这种支持通常由供应商/制造商提供或外包给第三方。它们提供低级代码和标头,您可以使用该 HDK 编写应用程序,在较大的组织中,这可以在内部完成。制造商最近有一种趋势,即围绕他们的平台构建一个开放的 API/软件生态系统,使它们像 arduino 一样开箱即用。仍然有无数芯片几乎没有编程支持,大多数平台知识被锁在企业界。

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