利用 Arduino 的处理器灵活性获得更广泛的评估能力

投稿人:DigiKey 北美编辑

虽然 Arduino 基板设计的早期迭代只利用 Atmel 8、16 和 32 位 AVR 微控制器,但最近却出现了许多包括非 Atmel MCU 和 MPU 在内的基板。 在适当考虑一些重要设计取舍后,这不仅可向设计师赋予更大的处理器与 I/O 灵活性,还可提供更多选择,让 Arduino 板运用于从开发到生产的所有阶段。

当然,众多这类新 Arduino 基板还在普通行业标准和开源硬件方法中提供更高的系统处理器灵活性。 Arduino 凭借这些属性而成为处理器评估和选购的一个很有吸引力的选择,在此阶段之后,可能才适合过渡至使用处理器供应商的开发板(以及相关联的软件和其他资源)。 但在某些情形下,Arduino 板可能不仅适用于开发,结合“盾形”扩展板所带来的灵活的增强功能后,还适合直接用于直至生产的所有阶段。

本文将展示多个典型的 Arduino 基板以及盾板产品,讨论其处理器基础及外设分配等。 最后还会提供一些总结性建议,以轻松、有效地评估您下一次设计可采用的替代处理器。

定义 Arduino

“评估板”和“开发板”术语通常可互换使用,但这样做是错误的。 顾名思义,开发板旨在协助进行软件编码(在系统硬件设计上运行),以及提供板上硬件和其他必要系统电路之间的连接。 因此,开发板提供大量测试点和接口选择,以及强大的捆绑软件工具集。

但是开发板的全面性(及相应的高价位)固有隐含假设是:您已通过架构和产品扩散评估阶段,并选择了特定的硬件产品组合。 这就是说,某些开发板的板载电路可能超出了(或至少不同于)您打算纳入最终设计中的电路。 此外,开发板的灵活性还决定它需要比您设计需要的尺寸更大。 更通俗的来说,开发板软硬件配置的全面性,结合其低出货量,意味着即使用于小批量、高利润率的系统生产方案,它们的价格也可能是令人难以接受的。

过去十年来,Arduino 基板和扩展板规范实际上已迅速成为行业标准,理由很充分。 它们利用更基本的“基”板,而非试图提供多位一体的统一板设计。 Arduino 灵活的增强功能由扩展板(亦称“盾板”)提供,能够通过标准化接口连接至基板。 盾板可以叠接,甚至可以通过自助盾板设计来补充。 由于众多供应商提供包含许多电路的盾板,因此您不但可以轻松评估不同的功能,而且还可评估实现这些功能的不同硬件选择。

类似地,在 Arduino 基板设计的初始迭代只利用 Atmel AVR 微控制器的情况下,最近也出现了包含非 Atmel MCU 和 MPU 在内的其他基板备选对象,可提供更高的系统处理器评估灵活性。 此外,Arduino 的紧凑外形尺寸结合其高容量特色,成就了较高的性价比,使其不仅对评估和后续开发阶段有吸引力,还适用于许多适度量产的情形。

Adafruit Industries DigiKey Metro 板

我们首先来了解相对传统的基板设计—Adafruit Industries DigiKey Metro 板。 Arduino UNO R3 参考设计的这个派生器件,由 DigiKey 做了两项外观美化(从硬件的角度看,这两块板是相同的),在“带针座的 Metro 328”板的基础上实现了进一步定制。

  • 它采用红色,相应主流 Adafruit 产品为黑色,以及
  • 板下侧印有完整零件清单(图 1)

Adafruit DigiKey Metro 板图片

图 1a

带针座的 Adafruit Metro 328 板图片

图 1b

Adafruit DigiKey Metro 板下侧图片

图 1c

图 1:Adafruit DigiKey Metro 板 (a) 是制造商主流的带针座 Metro 328 板 (b) 的变型,定制使用红色装饰涂层,并在其下侧 (c) 印有完整的零件清单。

Atmel ATmega328P 微控制器基于 DigiKey Metro 板,是一个采用 8 位 20 MHz AVR RISC 的处理器,具有额外的 32 KB 系统内可编程闪存、1,024 B 的 EEPROM 以及 2 KB 的 SRAM。 ATmega328P 还随附多种片载外设;连接选件包括 23 个 GPIO、16 个触摸接口通道、24 个外部中断、一个字节导向的双线串行接口以及一个 SPI 串行端口。

Seeed Technology Intel Edison for Arduino 套件

另一个极端是 Seeed TechnologyIntel Edison for Arduino 套件,它是用于基础 Intel Edison 开发平台(图 2)的多个可用硬件扩展选择之一。 此基板尺寸为 127 mm x 72 mm,比前述 71 mm x 53 mm Arduino UNO 外形尺寸大不少,但 Arduino“盾形”扩展总线标准化则通过四个板载连接器来实现。 Arduino 套件还包括一个 SD 卡连接器,以及两个小型和标准型 USB 主机连接器。

Intel Edison 开发平台板图片

图 2a

替代 Intel Edison Breakout 分线套件图片

图 2b

SparkFun Electronics 的开放式电源入门套件

图 2c

图 2:Seeed Technology 的 Arduino 套件将“盾形”扩展板生态系统支持带至原本专有的 Intel Edison 开发平台板设计 (a)。 如果您只需要“分线”连接并且偏好较小的板外形尺寸,则可考虑该公司的替代 Intel Edison 分线套件 (b)。 此外,SparkFun Electronics 的开放式电源入门套件提供一种中间方法;尺寸介于两个其他板之间,通过专有的(虽然开源)“块”叠接方案 (c) 扩展。

Intel 的 Edison 在 IoT 和其它嵌入式电子市场上出现得相对较晚,是一个采用 22 nm 工艺制造的 SoC,其内核采用该公司的 32 位 Quark 微控制器(在此特定情况下运行频率为 100 MHz)。 同一芯片上还有一个双核、双线程 500 MHz "Silvermont" Intel Atom 处理器阵列。 Intel Edison 开发平台模块上还包括 1 GB 的 LPDDR3 SDRAM、4 GB 的基于 EMMC 的闪存、一个 USB 2.0 PHY 和双频 Wi-Fi 以及蓝牙无线收发器。

为了在后续外形尺寸显著减小的情况下获得 Intel Edison 评估开发所需的较适度功能,Seeed 还提供分线套件。 此外,作为中间的替代硬件方法,Intel Edison 倡导者还应考虑 SparkFun Electronics 的基板和扩展块系列,其中几个基板和扩展块捆绑在该公司的开放式电源入门套件中。 SparkFun 的基于 Intel Edison 的产品线从供应商的角度出发目前为专有采购(虽然从板设计文档的角度出发为开源),将在即将推出的文章中会更详细地讨论。

UDOO Neo 开发板

如果 Arduino 的标准化富有吸引力,但 NXP 的 i.MX 6 处理器更符合您的喜好,您可能需要考虑 UDOO 的 Neo 开发板产品线(图 3 和表 1)。 Neo 提供三种型号,它们全部基于 i.MX6 SoloX SoC 并且外形尺寸皆为 89 mm x 59 mm,介于之前讨论的两个选件的尺寸之间(但同样采用引脚分配和布局标准的板载 Arduino“盾板”连接器组)。

UDOO 的 Neo 基本版图片

图 3a

UDOO 的 Neo 扩展版图片

图 3b

UDOO 的 Neo 完整版图片

图 3c

图 3:UDOO 的 Neo 产品线提供三种版本:基本版 (a)、扩展版 (b) 和完整版 (c),带有混用无线和有线网络连接选件,以及各种系统存储器分配和可选的运动传感器。

UDOO 板

DRAM

有线网络连接

无线网络连接

板载运动传感器

基本版

512 MB

10/100Mbps 以太网

扩展版

1 GB

仅 2.4 GHz 的 802.11b/g/n,蓝牙 4

加速计、磁力仪和陀螺仪(全部 3 轴)

完整版

1 GB

10/100Mbps 以太网

仅 2.4 GHz 的 802.11b/g/n,蓝牙 4

加速计、磁力仪和陀螺仪(全部 3 轴)

表 1:UDOO Neo 系统板型号及选件。

所有三个型号均具有以下特性:

  • 视频输入:模拟(NTSC 和 PAL)以及 8 位并行数字
  • 视频输出:Micro HDMI 以及 LVDS + 触摸 (I2C)
  • 存储:8 位 microSD 卡(带 SDIO 支持)
  • 音频:HDMI(输出)、S/PDIF、I2S
  • USB:一个 USB 2.0 A 型,一个 microUSB(带 OTG 支持)

UDOO Neo 产品线所基于的 NXP i.MX 6SoloX 应用处理器由一个 ARM® Cortex®-A9 处理器内核(运行速度高达 1 GHz)及 ARM Cortex-M4 内核(高达 200 MHz)组成。 同时集成了一个 Vivante GC400T 2D/3D 图形加速器。

Analog Devices ADUCM360 基板

如果 ARM 的 Cortex-M 系列内核是您唯一关注的处理器,您应了解下 Analog Devices ADUCM360 基板,制造商称该基板的外形尺寸与 101.6 mm x 53.3 mm Arduino Due 参考板设计兼容(图 4)。 此板所基于的 ADuCM360 应用处理器是一个速率达 3900 次采样/秒的 24 位数据采集系统,包含两个 24 位多通道三角积分型模数转换器 (ADC)、一个提供高达 20 MIPS 峰值性能的 32 位 ARM Cortex-M3 处理器内核,以及 128 KB 的基于 EEPROM 的闪存和 8 KB 的 SRAM。

Analog Devices 的 ADUCM360 基板图片

图 4a

Analog Devices 与 Arduino Due 兼容的 ADUCM360 基板图片

图 4b

Analog Devices 牌带电子秤功能的“盾形”扩展板图片

图 4c

Analog Devices 牌带毒气检测功能的“盾形”扩展板图片

图 4d

图 4:Analog Devices 的 ADUCM360 基板 (a) 采用兼容 Arduino Due 的外形尺寸 (b)。 提供的 Analog Devices 牌“盾形”扩展板支持加速计和电子秤 (c) 以及毒气检测 (d) 功能。 (图片由 Analog Devices 提供)

ADUCM360 基板还支持 PMOD 扩展总线标准,这解释了图 4 中所示的附加连接器组。 Analog Devices 推出了几款 Arduino Uno R3 格式的盾形扩展板供选择,有力补充了更广泛的 Arduino 生态系统提供的扩展板:

处理器评估与设计考虑因素

本文讨论的 Arduino 板代表了一组广泛的处理器架构及关联能力。 例如,Atmel ATmega328P 是一种相对比较简单的 8 位 RISC CPU 应用,而 64 位双核 Intel Atom 处理器不仅以较高时钟速度运行,而且采用多线程并在其他方面更先进。 16 和 32 位 ARM Cortex-M3/M4 和 Cortex-A9 以及 Intel Quark 处理器是早期两个极端型号之间的中间选择。

一方面,如我最近发布的另一篇文章中所写,紧凑、强大、高效且具成本优势的基于 ARM 的板卡才是有吸引力的硬件选择,您不会想要选择对您的特定需求而言过慢的 CPU,尤其是当你希望为今后不可避免的软件升级保留一些性能“空间”时。 另一方面,没有必要为超出你需求的处理器功率买单;记住你的选择不仅是价格,还有功耗影响。 若您的软件大部分时间都处于等待输入的空闲循环中,更高的时钟速度可能意义不大。 此外,仅当您的软件具有较低的指令间相关性时,像超标和故障支持等架构特性才能达到明显更高的、可实现的 IPC(指令/时钟)。

类似地,相比更简单的单核 CPU,缺乏线程独立性将导致多核 CPU 的吞吐量优势只能部分发挥,而较高位指令集理论优势在特定应用中可能无法发挥作用(更何况其更大存储器封装需求)。

认真确定您的特殊需求,因为这将帮助您专注于本文介绍的全部产品中的首选处理器选择。 理想情况下,您的终端系统软件应该已经可以使用,这样您便可在多种备选对象上运行该软件,并评估这些备选对象的相对优势和不足。 但实际上,很可能在硬件开发工作的同时已经编写代码的重要部分(如果不是全部)。 因此,您需要使用软件来评估替代处理器,逼近您将要使用的函数和例程(特别是最严苛的函数和例程)。

为了对您有所帮助,我们提供了多种基准软件选择。 出于对鲁棒性和开源特性的五月份认真考虑,一种可能的选择是相应称作“基准”的、由 Google 在 GitHub 上提供的微基准支持库。 此库包含许多特定示例,因此必须运行代表终端节点中可能存在的多种特征的一系列测试,以全面评估每个替代处理器。

在基本使用中,您可以定义执行待评估代码的函数:

static void BM_StringCreation(benchmark::State& state) {

  while (state.KeepRunning())

    std::string empty_string;

}

// Register the function as a benchmark

BENCHMARK(BM_StringCreation);

// Define another benchmark

static void BM_StringCopy(benchmark::State& state) {

  std::string x = "hello";

  while (state.KeepRunning())

    std::string copy(x);

}

BENCHMARK(BM_StringCopy);

BENCHMARK_MAIN();

还可以通过单一例程实现一系列基准;使用一个额外参数来指定要运行基准系列中的哪一个。 例如,以下代码定义了一系列用于评估不同长度 memcpy() 调用速度的基准:

static void BM_memcpy(benchmark::State& state) {

  char* src = new char[state.range_x()];

  char* dst = new char[state.range_x()];

  memset(src, 'x', state.range_x());

  while (state.KeepRunning())

    memcpy(dst, src, state.range_x());

  state.SetBytesProcessed(int64_t(state.iterations()) *

                          int64_t(state.range_x()));

  delete[] src;

  delete[] dst;

}

BENCHMARK(BM_memcpy)->Arg(8)->Arg(64)->Arg(512)->Arg(1<<10)->Arg(8<<10);

也可以更简洁地编码,例如像这样:

BENCHMARK(BM_memcpy)->Range(8, 8<<10);

如需更多信息,包括大量其它参考代码段,请参阅 GitHub 上的基准项目区域。 开心搜寻,祝您好运!

免责声明:各个作者和/或论坛参与者在本网站发表的观点、看法和意见不代表 DigiKey 的观点、看法和意见,也不代表 DigiKey 官方政策。

关于此出版商

DigiKey 北美编辑