不同型號(hào)的Arduino開(kāi)發(fā)板可能使用了不同的核心控制器,如Arduino UNO使用的核心控制器為8位AVR架構(gòu)的Atmega328P,而Arduino Due使用的是32位ARM Cortex m4架構(gòu)的 SAMD21G18A。兩者主要區(qū)別如下:
工作電壓不一樣。AVR核心的arduino通常工作電壓為5V,ARM核心的arduino通常工作電壓為3.3V。因此在接入外部設(shè)備時(shí),可能需要轉(zhuǎn)換通信電平,以兼容不同的工作電壓的外設(shè)。
在軟件層面,不同架構(gòu)的芯片對(duì)應(yīng)的編譯環(huán)境,可能相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)長(zhǎng)度不一樣。如在Arduino UNO、MEGA中,int及unsigned int占用2字節(jié)(16位);而在Arduino Due、Zero中,int及unsigned int占用4字節(jié)(32位)。
所以在編寫(xiě)和移植時(shí)程序時(shí),如果直接復(fù)用代碼,可能會(huì)造成一些錯(cuò)誤。
這種情況下,可以使用宏判斷來(lái)判斷當(dāng)前編譯的目標(biāo)開(kāi)發(fā)板上的核心MCU型號(hào),進(jìn)而選擇編譯對(duì)應(yīng)的語(yǔ)句,方式如下:
#ifdef(__arm__)
#endif
#ifdef(__AVR__)
#endif
可以通過(guò)以下宏判斷芯片類(lèi)型:
芯片類(lèi)型 | 對(duì)應(yīng)的宏 |
---|---|
AVR | __AVR__ |
ARM | __arm__ |
可以通過(guò)以下宏判斷開(kāi)發(fā)板型號(hào):
開(kāi)發(fā)板型號(hào) | 對(duì)應(yīng)的宏 |
---|---|
Arduino UNO | __AVR_ATmega328P__ |
Arduino MEGA | __AVR_ATmega2560__ |
Arduino Leonardo | __AVR_ATmega32U4__ |
Arduino Zero | __SAMD21G18A__ |
Arduino Due | __SAM3X8E__ |
兼容數(shù)據(jù)長(zhǎng)度不一樣的情況,可以使用intx_t指定長(zhǎng)度方式定義變量,如int8_t即是長(zhǎng)度為8位的整形。使用方式和int一樣:
int8_t a = 123;
常用類(lèi)型如下:
類(lèi)型 | 取值范圍 | 長(zhǎng)度(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 |
承擔(dān)因您的行為而導(dǎo)致的法律責(zé)任,
本站有權(quán)保留或刪除有爭(zhēng)議評(píng)論。
參與本評(píng)論即表明您已經(jīng)閱讀并接受
上述條款。