對于一個C程序員很快的就可以寫出這個實現(xiàn),事實上也就是這個實現(xiàn) 對于一個天天寫Arduino的人,,你是否對其中的技術(shù)細(xì)節(jié)很迷惑 就像我上面寫的這個代碼一樣,,就是你每個程序都是有的這個loop,setup 眾所周知,,AVR是arduino的soul,,它又是得拿C編譯器來編譯 所以Arduino的底層也是一堆的C代碼,至于怎么實現(xiàn)的就是我文章的所寫 在Arduino的實現(xiàn)里面是main這個函數(shù) 以下就是完整版的Arduino main函數(shù)實現(xiàn),,可以看到寫的更加的健壯 void initVariant() __attribute__((weak)); void initVariant() {} void setupUSB() __attribute__((weak)); void setupUSB() {} int main(void) { init(); initVariant(); #if defined(USBCON) USBDevice.attach(); #endif setup(); for (;;) { loop(); if (serialEventRun) serialEventRun(); } return 0; } https://downloads.arduino.cc/arduino-1.8.13-windows.exe 這里先下載一個Arduino 然后打開一個內(nèi)置的demo就可以看到我們的setup和loop了 我們繼續(xù)聊Arduino的實現(xiàn),,它和C的微小的差別就是Arduino不知道你的標(biāo)準(zhǔn)的輸出設(shè)備是哪個(stdout),標(biāo)準(zhǔn)輸出就是printf函數(shù)要輸出的地方,,比如一個cmd,,一個shell。調(diào)用fdevopen()這個函數(shù)給他一個指針,,指向 向那個設(shè)備輸出一個字符的函數(shù),。你也可以調(diào)用Serial庫里面的函數(shù)干這個事情,為了通過一個虛擬的串口,,也可以是實際的一個串口輸出東西,。還需要你在setup()函數(shù)里面設(shè)置一些初始化的變量,接下來就是寫一下C語言版本的串口打?。?/p> 就這樣就寫出來了 然后用Arduino來編譯一下,,可以看到?jīng)]有錯誤。證明我的代碼寫對了 事實上這個是常見的Arduino串口打印代碼 我們繼續(xù)看這個最簡單的代碼就是閃爍燈的代碼 在一些較早的版本是用大家熟悉的#define的,,那新版里面的宏定義在哪里,? 通過搜索得知在這里,這個是高端的mega 我們普通的uno在這里 更加的深入一些是在這里,,硬件,,變體里面,。我們以后想自己為一款開發(fā)板兼容Arduino,,那么就是需要按照這樣的頭文件方式定義 在Arduino的使用過程中,一切的魔法好像就是一些按鍵,。那按鍵之下的物理意義有哪些呢,? 這個就是魔法按鈕 魔法的背后是這些東西 avr-gcc是gcc移植到avr的版本 avr-libs是avr的開源的C庫 還有一些軟件把編譯的文件變成Intel的hax文件 最后通過avr-dude下載到你的開發(fā)板里面 感興趣的可以去搜索一下這個下載工具 具體的這個配置工具在這個路徑 內(nèi)部是很多的配置文件 我們把這個這件復(fù)制 到這個bin里面 然后將bin加到你的環(huán)境變量里面 驗證通過 conf這個文件的添加可以讓你以后在編譯文件的時候不用輸入相關(guān)編譯器的路徑,很是方便 接下來我們寫一個c的程序,,雖然沒有編譯通過但是還是可以寫一下為什么的 頭文件是avr/io.h 是讓編譯器引入一個很長的列表,,關(guān)于處理器的一切細(xì)節(jié)。IO端口的地址,,名字等,。 long i,;是一個長整形的變量,用作延時計數(shù)器 1<<5;1向左移動5位 算了,,按說是可以的,。但是我搞不來了,一會兒去Mac搞 用arduino是不能編譯的,,用gcc才可以 |
|