英特尔Galileo板的快速I/O宏及相关API介绍
立即解锁
发布时间: 2025-08-21 00:15:05 阅读量: 2 订阅数: 4 


英特尔Galileo开发实战指南
### 英特尔 Galileo 板的快速 I/O 宏及相关 API 介绍
在电子开发中,对于英特尔 Galileo 系列开发板,掌握其快速 I/O 宏及相关 API 能显著提升开发效率和性能。本文将详细介绍这些内容,包括不同 API 的使用方法、性能特点以及相关代码示例。
#### 1. INPUT 与 INPUT_FAST 性能对比
在英特尔 Galileo 板上,使用 INPUT 模式读取引脚 3 的 200,000 次操作耗时 437786889 微秒(超过 7 分钟),而使用 INPUT_FAST 模式仅需 231954 微秒(0.23 秒)。这表明在英特尔 Galileo 上,INPUT_FAST 比 INPUT 快 1888 倍。但在英特尔 Galileo Gen 2 板上,INPUT_FAST 和 INPUT 具有相同的性能,因为它们的实现方式相同,所以使用 digitalRead() 读取端口时,使用 INPUT 或 INPUT_FAST 效果一样。
#### 2. 快速 I/O 宏
当在 IDE 中选择不同的开发板时,会加载对应的文件,其中 variant.h 文件尤为重要,它决定了 I/O 映射以及哪些引脚直接连接到 Quark SoC。
- **英特尔 Galileo Gen 2 板**:选择该板时,IDE 会加载 `hardware/arduino/x86/variants/galileo_fab_g/variant.h` 文件,其中包含以下宏:
```cpp
#define GPIO_FAST_IO0 GPIO_FAST_ID_QUARK_SC(0x08)
#define GPIO_FAST_IO1 GPIO_FAST_ID_QUARK_SC(0x10)
#define GPIO_FAST_IO2 GPIO_FAST_ID_QUARK_SC(0x20)
#define GPIO_FAST_IO3 GPIO_FAST_ID_QUARK_SC(0x40)
#define GPIO_FAST_IO4 GPIO_FAST_ID_QUARK_NC_RW(0x10)
#define GPIO_FAST_IO5 GPIO_FAST_ID_QUARK_NC_CW(0x01)
#define GPIO_FAST_IO6 GPIO_FAST_ID_QUARK_NC_CW(0x02)
#define GPIO_FAST_IO9 GPIO_FAST_ID_QUARK_NC_RW(0x04)
#define GPIO_FAST_IO10 GPIO_FAST_ID_QUARK_SC(0x04)
#define GPIO_FAST_IO11 GPIO_FAST_ID_QUARK_NC_RW(0x08)
#define GPIO_FAST_IO12 GPIO_FAST_ID_QUARK_SC(0x80)
#define GPIO_FAST_IO13 GPIO_FAST_ID_QUARK_NC_RW(0x20)
```
- **英特尔 Galileo 板**:选择该板时,IDE 会加载 `hardware/arduino/x86/variants/galileo_fab_d/variant.h` 文件,包含以下宏:
```cpp
#define GPIO_FAST_IO2 GPIO_FAST_ID_QUARK_SC(0x40)
#define GPIO_FAST_IO3 GPIO_FAST_ID_QUARK_SC(0x80)
```
需要注意的是,在英特尔 Galileo Gen 2 板上,除了引脚 7 和 8 外,所有引脚都有对应的“快速 I/O”宏;而在英特尔 Galileo 板上,只有引脚 2 和 3 使用相应的宏,因为它们是唯一直接连接到 Quark 的引脚。如果使用了不正确的宏,可能会导致编译错误。
这些 GPIO_FAST_IOx 宏(x 表示引脚编号)用于为每个引脚创建 32 位的 I/O 描述符,描述符包含端口方向、状态位掩码以及每个引脚的读写偏移量。宏中的十六进制值是 I/O 寄存器中的位掩码,用于表示寄存器中哪个位包含每个引脚的状态(高电平或低电平)。
#### 3. 相关 API 介绍
##### 3.1 fastGpioDigitalWrite(GPIO_FAST_IOx, unsigned int value)
这个宏允许向 I/O 端口写入数据,并能实现 652KHz 到 684KHz 的频率。
- **参数说明**:
- 第一个参数 GPGIO_FAST_IOx 是一个快速 I/O 宏,用于标识感兴趣的引脚。
- 第二个参数 value 是引脚的值,可能为 LOW 或 HIGH。
- **使用要求**:
- 如果使用英特尔 Galileo 板,pinMode() 函数必须设置为 OUTPUT_FAST 配置,且只有引脚 2 和 3 可用。
- 如果使用英特尔 Galileo Gen 2 板,pinMode() 函数可以设置为 OUTPUT 或 OUTPUT_FAST 配置,所有引脚(除了引脚 7 和 8)都可用。引脚 13 由于连接了内置 LED,触发时会有小的损耗,频率可达 657KHz,其他可用引脚可达 684KHz。
以下是一个使用引脚 2 达到 684KHz 频率的代码示例:
```cpp
/*
This program makes the I/O speed to achieve 684KHz.
If you are using Intel Galileo: Only pins 2 and 3 work
If you are using Intel Galileo Gen 2: ALL pins work
Note: if you are using Intel Galileo Gen 2 and change
this software to support pin 13, the frequency will be
close to 657KHz and not 687KHz.
*/
void setup() {
// put your setup code here, to run once:
unsigned int pin = 2; // this is pin header 2
pinMode(pin, OUTPUT_FAST);
}
void loop() {
// put your main code here, to run repeatedly:
int state = LOW;
while(1){
fastGpioDigitalWrite(GPIO_FAST_IO2, state);
state =!state; // if as HIGH it will be LOW and vice versa
}
}
```
在 `setup()` 函数中,创建了一个 pin 变量表示引脚 2,并将其设置为 OUTPUT_FAST 模式。在 `loop()` 函数中,通过一个无限循环不断切换引脚状态,实现 684KHz 的频率。
然而,当在单个循环周期中多次调用 fastGpioDigitalWrite() 时,会出现性能下降的问题。无论处理的是否为不同引脚,最大频率都会除以循环中 fastGpioDigitalWrite() 方法的调用次数。例如,在以下代码中,fastGpioDigitalWrite() 被调用两次,最终频率为 340KHz:
```cpp
/*
This program makes the I/O speed achieve 340KHz.
If you are using Intel Galileo: Only pins 2 and 3 work
If you are using Intel Galileo Gen 2: ALL pins work
*/
void setup() {
// put your setup code here, to run once:
pinMode(2, OUTPUT_FAST);
pinMode(3, OUTPUT_FAST);
}
void loop() {
// put your main code here, to run repeatedly:
int state = LOW;
while(1){
fastGpioDigitalWrite(GPIO_FAST_IO2, state);
fastGpioDigitalWrite(GPIO_FAST_IO3, state);
state =!state; // if as HIGH it will be LOW and vice versa
}
}
```
##### 3.2 fastGpioDigitalRead(GPIO_FAST_IOx)
这个宏允许读取 I/O 端口的数据,并且比常规的 digitalRead() 具有更快的性能。
- **参数说明**:GPGIO_FAST_IOx 是一个快速 I/O 宏,用于标识感兴趣的引脚。
- **返回值**:宏可能返回 0 表示 LOW,或其他值表示 HIGH,返回值是根据寄存器偏移量在寄存器掩码中的当前值。
- **使用要求**:
- 如果使用英特尔 Galileo 板,pinMode() 函数必须设置为 INPUT_FAST 配置,且只有引脚 2 和 3 可用。
- 如果使用英特尔 Galileo Gen 2 板,pinMode() 函数可以设置为 INPUT 或 INPUT_FAST 配置,所有引脚(除了引脚 7 和 8)都可用。
以下是一个比较 fastGpioDigitalRead() 和 digitalRead() 性能的代码示例:
```cpp
/*
This program is only a demonstration of fastGpioDigitalRead()
*/
int pin = 2;
#define MAX
```
0
0
复制全文
相关推荐









