让Arduino程序具备更好的兼容性-Arduino中文社区 - Powered by Discuz! Archiver

奈何col 发表于 2021-2-1 19:04

让Arduino程序具备更好的兼容性

本文将编入《Arduino程序设计基础(第3版)》,转载请注明出处


不同型号的Arduino开发板可能使用了不同的核心控制器,如Arduino UNO使用的核心控制器为8位AVR架构的Atmega328P,而Arduino Due使用的是32位ARM Cortex m4架构的 SAMD21G18A。两者主要区别如下:

工作电压不一样。AVR核心的arduino通常工作电压为5V,ARM核心的arduino通常工作电压为3.3V。因此在接入外部设备时,可能需要转换通信电平,以兼容不同的工作电压的外设。

在软件层面,不同架构的芯片对应的编译环境,可能相同数据类型的数据长度不一样。如在Arduino UNO、MEGA中,int及unsigned int占用2字节(16位);而在Arduino Due、Zero中,int及unsigned int占用4字节(32位)。

所以在编写和移植时程序时,如果直接复用代码,可能会造成一些错误。

这种情况下,可以使用宏判断来判断当前编译的目标开发板上的核心MCU型号,进而选择编译对应的语句,方式如下:

```
#ifdef(__arm__)

#endif

#ifdef(__AVR__)

#endif
```

可以通过以下宏判断芯片类型:

| 芯片类型 | 对应的宏    |
| -------- | ----------- |
| AVR      | \_\_AVR\_\_ |
| ARM      | \_\_arm\_\_ |

可以通过以下宏判断开发板型号:

| 开发板型号       | 对应的宏                |
| ---------------- | ----------------------- |
| Arduino UNO      | __AVR_ATmega328P__      |
| Arduino MEGA   | \_\_AVR\_ATmega2560\_\_ |
| Arduino Leonardo | \_\_AVR\_ATmega32U4\_\_ |
| Arduino Zero   | \_\_SAMD21G18A\_\_      |
| Arduino Due      | \_\_SAM3X8E\_\_         |

兼容数据长度不一样的情况,可以使用intx_t指定长度方式定义变量,如int8_t即是长度为8位的整形。使用方式和int一样:

```
int8_t a = 123;
```

常用类型如下:

|   类型   |                           取值范围                           | 长度(bit) |
| :------: | :----------------------------------------------------------: | :-------: |
|int8_t|    -128 ~ 127<br/>( -2<sup>7</sup> ~ 2<sup>7</sup> - 1)    |   8   |
| uint8_t|            0 ~ 255<br/>( 0 ~ 2<sup>8</sup> - 1)            |   8   |
| int16_t| -32,768 ~ 32,767<br/>( -2<sup>15</sup> ~ 2<sup>15</sup> - 1) |    16   |
| uint16_t |         0~ 65,535<br/>( 0 ~ 2<sup>16</sup> - 1)          |    16   |
| int32_t| -2,147,483,648~ 2,147,483,647<br/>( -2<sup>31</sup> ~ 2<sup>31</sup> - 1) |    32   |
| uint32_t |      0 ~ 4,294,967,295<br/>( 0 ~ 2<sup>32</sup> - 1)       |    32   |

XlinliY.Zhang 发表于 2021-2-1 19:59

#if DEBUG
#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
#define DEBUG_Serial Serial1
#else
#include <SoftwareSerial.h>
SoftwareSerial myserial(10, 11);
#define DEBUG_Serial myserial
#endif
#define DEBUG_Print(...) DEBUG_Serial.print(__VA_ARGS__)
#define DEBUG_Println(...) DEBUG_Serial.println(__VA_ARGS__)
#else
#define DEBUG_Print(...)
#define DEBUG_Println(...)
#endif

Highnose 发表于 2021-2-1 21:40

请问,Arduino Due能理解成 STM32duino 不?

奈何col 发表于 2021-2-1 21:53

Highnose 发表于 2021-2-1 21:40
请问,Arduino Due能理解成 STM32duino 不?

due芯片是SAMD21G18A,不是STM32

Highnose 发表于 2021-2-2 09:51

奈何col 发表于 2021-2-1 21:53
due芯片是SAMD21G18A,不是STM32

明白,谢谢你的解答
页: [1]
查看完整版本: 让Arduino程序具备更好的兼容性