Arduino IDE的編譯執行過程解讀
Arduino.h的原始碼:
/* Arduino.h - Main include file for the Arduino SDK Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #ifndef Arduino_h #define Arduino_h #include <stdlib.h> #include <stdbool.h> #include <string.h> #include <math.h> #include <avr/pgmspace.h> #include <avr/io.h> #include <avr/interrupt.h> #include "binary.h" #ifdef __cplusplus extern "C"{ #endif void yield(void); #define HIGH 0x1 #define LOW 0x0 #define INPUT 0x0 #define OUTPUT 0x1 #define INPUT_PULLUP 0x2 #define PI 3.1415926535897932384626433832795 #define HALF_PI 1.5707963267948966192313216916398 #define TWO_PI 6.283185307179586476925286766559 #define DEG_TO_RAD 0.017453292519943295769236907684886 #define RAD_TO_DEG 57.295779513082320876798154814105 #define EULER 2.718281828459045235360287471352 #define SERIAL 0x0 #define DISPLAY 0x1 #define LSBFIRST 0 #define MSBFIRST 1 #define CHANGE 1 #define FALLING 2 #define RISING 3 #if defined(__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) || defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) #define DEFAULT 0 #define EXTERNAL 1 #define INTERNAL 2 #else #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) || defined(__AVR_ATmega644__) || defined(__AVR_ATmega644A__) || defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644PA__) #define INTERNAL1V1 2 #define INTERNAL2V56 3 #else #define INTERNAL 3 #endif #define DEFAULT 1 #define EXTERNAL 0 #endif // undefine stdlib's abs if encountered #ifdef abs #undef abs #endif #define min(a,b) ((a)<(b)?(a):(b)) #define max(a,b) ((a)>(b)?(a):(b)) #define abs(x) ((x)>0?(x):-(x)) #define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt))) #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define radians(deg) ((deg)*DEG_TO_RAD) #define degrees(rad) ((rad)*RAD_TO_DEG) #define sq(x) ((x)*(x)) #define interrupts() sei() #define noInterrupts() cli() #define clockCyclesPerMicrosecond() ( F_CPU / 1000000L ) #define clockCyclesToMicroseconds(a) ( (a) / clockCyclesPerMicrosecond() ) #define microsecondsToClockCycles(a) ( (a) * clockCyclesPerMicrosecond() ) #define lowByte(w) ((uint8_t) ((w) & 0xff)) #define highByte(w) ((uint8_t) ((w) >> 8)) #define bitRead(value, bit) (((value) >> (bit)) & 0x01) #define bitSet(value, bit) ((value) |= (1UL << (bit))) #define bitClear(value, bit) ((value) &= ~(1UL << (bit))) #define bitWrite(value, bit, bitvalue) (bitvalue ? bitSet(value, bit) : bitClear(value, bit)) // avr-libc defines _NOP() since 1.6.2 #ifndef _NOP #define _NOP() do { __asm__ volatile ("nop"); } while (0) #endif typedef unsigned int word; #define bit(b) (1UL << (b)) typedef bool boolean; typedef uint8_t byte; void init(void); void initVariant(void); int atexit(void (*func)()) __attribute__((weak)); void pinMode(uint8_t, uint8_t); void digitalWrite(uint8_t, uint8_t); int digitalRead(uint8_t); int analogRead(uint8_t); void analogReference(uint8_t mode); void analogWrite(uint8_t, int); unsigned long millis(void); unsigned long micros(void); void delay(unsigned long); void delayMicroseconds(unsigned int us); unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout); void shiftOut(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder, uint8_t val); uint8_t shiftIn(uint8_t dataPin, uint8_t clockPin, uint8_t bitOrder); void attachInterrupt(uint8_t, void (*)(void), int mode); void detachInterrupt(uint8_t); void setup(void); void loop(void); // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. #define analogInPinToBit(P) (P) // On the ATmega1280, the addresses of some of the port registers are // greater than 255, so we can't store them in uint8_t's. extern const uint16_t PROGMEM port_to_mode_PGM[]; extern const uint16_t PROGMEM port_to_input_PGM[]; extern const uint16_t PROGMEM port_to_output_PGM[]; extern const uint8_t PROGMEM digital_pin_to_port_PGM[]; // extern const uint8_t PROGMEM digital_pin_to_bit_PGM[]; extern const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[]; extern const uint8_t PROGMEM digital_pin_to_timer_PGM[]; // Get the bit location within the hardware port of the given virtual pin. // This comes from the pins_*.c file for the active board configuration. // // These perform slightly better as macros compared to inline functions // #define digitalPinToPort(P) ( pgm_read_byte( digital_pin_to_port_PGM + (P) ) ) #define digitalPinToBitMask(P) ( pgm_read_byte( digital_pin_to_bit_mask_PGM + (P) ) ) #define digitalPinToTimer(P) ( pgm_read_byte( digital_pin_to_timer_PGM + (P) ) ) #define analogInPinToBit(P) (P) #define portOutputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_output_PGM + (P))) ) #define portInputRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_input_PGM + (P))) ) #define portModeRegister(P) ( (volatile uint8_t *)( pgm_read_word( port_to_mode_PGM + (P))) ) #define NOT_A_PIN 0 #define NOT_A_PORT 0 #define NOT_AN_INTERRUPT -1 #ifdef ARDUINO_MAIN #define PA 1 #define PB 2 #define PC 3 #define PD 4 #define PE 5 #define PF 6 #define PG 7 #define PH 8 #define PJ 10 #define PK 11 #define PL 12 #endif #define NOT_ON_TIMER 0 #define TIMER0A 1 #define TIMER0B 2 #define TIMER1A 3 #define TIMER1B 4 #define TIMER1C 5 #define TIMER2 6 #define TIMER2A 7 #define TIMER2B 8 #define TIMER3A 9 #define TIMER3B 10 #define TIMER3C 11 #define TIMER4A 12 #define TIMER4B 13 #define TIMER4C 14 #define TIMER4D 15 #define TIMER5A 16 #define TIMER5B 17 #define TIMER5C 18 #ifdef __cplusplus } // extern "C" #endif #ifdef __cplusplus #include "WCharacter.h" #include "WString.h" #include "HardwareSerial.h" #include "USBAPI.h" #if defined(HAVE_HWSERIAL0) && defined(HAVE_CDCSERIAL) #error "Targets with both UART0 and CDC serial not supported" #endif uint16_t makeWord(uint16_t w); uint16_t makeWord(byte h, byte l); #define word(...) makeWord(__VA_ARGS__) unsigned long pulseIn(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); unsigned long pulseInLong(uint8_t pin, uint8_t state, unsigned long timeout = 1000000L); void tone(uint8_t _pin, unsigned int frequency, unsigned long duration = 0); void noTone(uint8_t _pin); // WMath prototypes long random(long); long random(long, long); void randomSeed(unsigned long); long map(long, long, long, long, long); #endif #include "pins_arduino.h" #endif
相關推薦
Arduino IDE的編譯執行過程解讀
Arduino.h的原始碼: /* Arduino.h - Main include file for the Arduino SDK Copyright (c) 2005-2013 Arduino Team. All right reserved. This library is free
angualar入門學習-- 自定義指令 指令編譯執行過程
監聽 監聽器 註冊 sco lar scl $watch 學習 排序 3個階段: 一、加載階段 加載angular.js的源碼,找到ng-app確定應用邊界範圍。 二、編譯階段 compile 查找所有指令,保存在一個列表中 對所有指令按優先級(property屬性值)排序
關於OTTO機器人原始碼在Arduino IDE編譯報錯問題解析
庫檔案地址: arduino IDE - 左上角選單欄【檔案】-首選項-專案資料夾位置 F:\Arduino IDE\INS\Arduino\libraries\Otto 錯誤提示資訊: Arduino:1.6.4 (Windows 8.1), 板:"Arduino
c語言編譯預處理和條件編譯執行過程的理解
在C語言的程式中可包括各種以符號#開頭的編譯指令,這些指令稱為預處理命令。預處理命令屬於C語言編譯器,而不是C語言的組成部分。通過預處理命令可擴充套件C語言程式設計的環境。 一.預處理的工作方式 1.1.預處理的功能 在整合開發環境中,編譯,連結是同時完成的。其實,C語言編譯器在對原始碼編譯之前
arduino IDE 編譯示例無法通過解決方法
對於初次使用arduino的開發者來說,一般會選擇arduino官方提供的arduino IDE來進行開發,算是小白的我也是從官方IDE入手,後來瞭解到可以使用Visual Studio或者Matlab進行開發,當然這兩種IDE還沒有嘗試。先說說我在使用arduino
最新淺析java原始碼轉換為機器碼的編譯執行過程
我們先來看一下編譯型語言和解釋型語言的之間的區別聯絡 編譯型語言:C/C++ 編譯過程是將原始碼(高階語言,人類容易讀,容易理解),轉換為機器碼(cpu能理解,能高效的執行)的過程. 解釋型語言:JavaScript python 等 直
C++ 編譯,執行過程 具體解釋。
string -m span font ont 程序 fas 全局 內容 要更深入了解C++, 必需要知道一個程序從開始到結束都幹了些什麽, 怎麽幹的。 所以我從C++編譯到執行過程,解析下程序是怎麽跑的。
gcc 的執行過程詳解 預處理 編譯 彙編 連結
在Linux中,使用GCC編譯程式的過程可以被分為四個階段: 下面我們以hello.c為例,來看看各個階段,編譯器做了什麼 ----對hello.c進行預編譯 執行命令:gcc -E hello.c -o hello.i,開啟生成的hello.i檔案
用於構建ESP32編譯環境的Arduino IDE軟體
Arduino軟體 (IDE) 簡單易用! 適用於ESP32 (ESP-WROOM-32) 的平臺有很多。某些時候,在Windows中使用Linux或cygwin會使初學者望而卻步,而Arduino整合開發環境(或是Arduino IDE)則更具使用者友好性。
程式碼的編譯連線與執行過程
1. 編譯 一個原始檔,經過編譯系統的處理,生成目標檔案的過程叫編譯。a.cpp經過編譯後在linux下會生成a.o這個目標檔案。 目標檔案主要用來描述程式在執行過程中需要放在記憶體中的內容,這些內容包括兩大類——程式碼和資料。相應的目標檔案也分成程式碼段和資料段。
程式的編譯與執行過程
本文以C程式為例。 構建C程式需要4個步驟,分別使用4個工具完成: preprocessor, compiler, assembler, and linker.四步完成後生成一個可執行檔案。 第一步,預處理. 這一步處理 標頭檔案、條件編譯指令和巨
【VS2017】升級VS2017後,編譯執行程式會出現 /Community/Common7/IDE/PrivateAssemblies/plugin.vs.js 錯誤
【問題】 【分析】 首先我的IE比較舊,是IE9.0.8112,這個主要是為了在開發時測試頁面、JS指令碼跟舊版本IE的相容及顯示問題的 。 【結論】 第1種、手動到 \Common7\IDE\PrivateAssemblies\plugin.vs.js 把檔名
Arduino學習(一):入門篇:軟硬體安裝 以及 hello,world編譯執行
Arduino是一款微控制器開發板,是個很好上手的入門級開發板,適合於用於開發電子產品原型,開發語言採用C,其特點是簡單、方便、軟體庫多、模組配件多。 一、微控制器, MCU 微控制單元(Microcontroller Unit, 即MCU) ,又稱單片微型計算機(S
PX4編譯過程解讀程式碼1
第一個編譯檔案DriverFramework.cpp 位置:src/lib/DriverFraamework/framework/src/DriverFramework.cpp #define SHOW_STATS 0 namespace DriverFra
“Hello World”的執行過程(編譯過程)
之前對於編譯過程也是模稜兩可,具體的還真沒刻意瞭解過,最近看《深入瞭解計算機作業系統》第一章就講到了編譯過程,看完之後才終於徹底瞭解了一些。#include<stdio.h> int mai
實現分析sql語句執行過程和編譯時間的方法
有時候我們經常為我們的sql語句執行效率低下發愁,反覆優化後,可還是得不到提高。 那麼你就用這條語句找出你sql到底是在哪裡慢了 示例: SET STATISTICS io ON SET STATISTICS time ON
程式執行過程中的編譯與連線階段
一個C程式的生成要經歷以下步驟: 1.編寫程式碼,生成.c或.cpp檔案,這時候它還是文字的; 2.編譯,就是Compile,由C編譯程式對你寫的程式碼進行詞法和句法分析,發現並報告錯誤,有錯時編譯不能通過。如若無錯,則生成中間程式碼,副檔名為obj,此時它便是二進位制的了; 3.連線,在彙編裡稱Link,
gcc 編譯連結執行過程
1、gcc g++ [option ]-o file 生成指定檔名為file的輸出檔案-E 只進行預處理-S 只進行預處理和編譯-C 只進行預處理、編譯和彙編-wall 生成所有級別的警告資訊-w 關閉所有警告,建議不使用此選項生成靜態、動態庫,比如一個工程裡包含的檔案有
程式的編譯和執行過程
程式的編譯 組成一個程式的每個原始檔通過編譯過程目的碼(objiect code)。 每個目標檔案由連結器(linker)捆綁在一起,形成一個單一而完整的可執行程式。 連結器同時也會引入標準C函式庫
SparkSQL學習- SparkSQL編譯和執行過程
Unresolved Logical Plan Spark使用Antlr將SQL/DataFrame 編譯為一顆Unresolved Logical Plan(抽象語法樹AST),樹上的節點不帶有資料型別等資訊。SparkSqlAstBuilder類與此相關。 R