不同型號的Arduino開發(fā)板可能使用了不同的核心控制器,如Arduino UNO使用的核心控制器為8位AVR架構的Atmega328P,而Arduino Due使用的是32位ARM Cortex m4架構的 SAMD21G18A。兩者主要區(qū)別如下:
工作電壓不一樣。AVR核心的arduino通常工作電壓為5V,ARM核心的arduino通常工作電壓為3.3V。因此在接入外部設備時,可能需要轉換通信電平,以兼容不同的工作電壓的外設。
在軟件層面,不同架構的芯片對應的編譯環(huán)境,可能相同數據類型的數據長度不一樣。如在Arduino UNO、MEGA中,int及unsigned int占用2字節(jié)(16位);而在Arduino Due、Zero中,int及unsigned int占用4字節(jié)(32位)。
所以在編寫和移植時程序時,如果直接復用代碼,可能會造成一些錯誤。
這種情況下,可以使用宏判斷來判斷當前編譯的目標開發(fā)板上的核心MCU型號,進而選擇編譯對應的語句,方式如下:
#ifdef(__arm__)
#endif
#ifdef(__AVR__)
#endif
可以通過以下宏判斷芯片類型:
芯片類型 | 對應的宏 |
---|---|
AVR | __AVR__ |
ARM | __arm__ |
可以通過以下宏判斷開發(fā)板型號:
開發(fā)板型號 | 對應的宏 |
---|---|
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 |
承擔因您的行為而導致的法律責任,
本站有權保留或刪除有爭議評論。
參與本評論即表明您已經閱讀并接受
上述條款。