1. 程式人生 > >Arduino IDE的編譯執行過程解讀

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