Arduinoで遊ぶページ
Arduinoで遊んだ結果を残すページです。
Arduinoソフトウェアの内部構造

はじめに

Arduinoソフトウェアが提供する関数の実装・内部構造を解析していきます。Arduino Unoが対象です。

Arduino 1.8.9のソースコードベースで極力最後まで追っていくことを目標としています。解説ではなく、解析なので注意してください。

Arduinoのリファレンスの翻訳はこちらです。

ソースコード中、#if で区切られているところは、Arduino Uno用のコードを見ていきます。このため、Arduino MegaやArduino Leonardoの場合は異なる実装になっている可能性があります。

Arduino本体

wiring_digital.c
pinMode()指定したピンを、入力に利用するのか出力に利用するのかを設定する。
digitalRead()アナログ‐デジタル(AD)変換器を使って、アナログピンから値を読み取ります。
digitalWrite()指定したピンにHIGHもしくはLOWを出力します。
turnOffPWM()指定したタイマのPWM出力を停止します。
wiring_analog.c
analogReference()アナログ入力を行う際の参照電圧を設定します。
analogRead()指定したピンを、入力に利用するのか出力に利用するのかを設定する。
analogWrite()指定したピンにPWM出力を行います。
Tone.cpp
tone()指定した周波数の方形波(矩形波)をデューティー比50%で、指定したピンに生成します。
toneBegin()toneBegin()関数で利用するタイマとピンの関連づけを管理します。
noTone()tone()関数で開始したピンへの方形波の出力を停止します。
disableTimer()tone()で設定したタイマ/カウンタを初期化します。
TIMER2_COMPA_vectタイマ/カウンタ2(TCNT2)と比較レジスタ(OCR2A)が同じ値になったときに起動される割り込みハンドラです。
wiring.c
init()ATmega328Pのタイマ/カウンタとAD変換器、シリアル通信の初期化を行います。
millis()内部で保持しているArduinoを起動してからの時間をミリ秒単位で返します。
micros()内部で保持しているArduinoを起動してからの時間をマイクロ秒単位で返します。
TIMER0_OVF_vectタイマ/カウンタ0(TCNT0)がオーバーフローしたときに起動される割り込みハンドラです。
delay()指定した値(ミリ秒単位)だけ待ちます。
delayMicroseconds()指定した値(マイクロ秒単位)だけ待ちます。
WInterrupts.c
attachInterrupt()外部割り込みが発生したときに呼び出す関数を設定します。
detachInterrupt()外部割り込みが発生したときに呼び出す関数を解除します。
wiring_shift.c
shiftIn()1ビットずつ送られてくるデータを取りこみ、1バイトのデータを作成します。
shiftOut()1バイトのデータを、1ビットずつ送信します。
wiring_pulse.c
pulseIn()ピンに入力されるパルスの時間を計測します。
wiring_pulse.S
countPulseASM()ピンに入力されるパルスの長さを計測するアセンブラコードです。
hooks.c
yield()他のタスクに制御を移すために自らCPUを放棄するための関数です。
HardwareSerial0.cpp
SerialSerialオブジェクトの定義です。
USART_RX_vectシリアル通信でデータを受信したときに起動される割り込みハンドラです。
USART_UDRE_vectシリアル通信でデータを送信するための割り込みハンドラです。
HardwareSerial.cpp
シリアル通信関連のレジスタシリアル通信関連のレジスタです。
HardwareSerial::begin()シリアル通信を行う際の通信速度の設定や送受信の許可ビットの設定を行います。
HardwareSerial::end()シリアル通信を終了し、RXピンとTXピンを通常の入出力を行うように設定します。
HardwareSerial::read()シリアル通信の受信用バッファから文字を読み出します。
HardwareSerial::available()シリアル通信の受信バッファ内の有効な文字数を返します。
HardwareSerial::flush()シリアル通信の送信バッファにあるデータをすべて送信します。
HardwareSerial::write()バイナリデータをシリアルポートに書き込みます。
HardwareSerial::availableForWrite()シリアル通信の送信バッファ内に書き込み可能な文字数を返します。
HardwareSerial::_tx_udr_empty_irq()シリアル通信送信バッファからAtmeta328Pのデータ送信レジスタにデータをコピーします。
HardwareSerial_private.h
HardwareSerial::HardwareSerial()HardwareSerialのコンストラクタです。
HardwareSerial::_rx_complete_irq()シリアル通信で受信した文字を受信バッファに格納します。
HardwareSerial.h
HardwareSerialシリアル通信を行うためのクラス定義です。
HardwareSerial::operator bool()シリアルポートが利用可能かどうかを確認します。
wiring_private.h
sbi()第1引数の第2引数ビットを1に設定するマクロです。
cbi()第1引数の第2引数ビットを0に設定するマクロです。
Arduino.h
digitalPinToBitMask()指定したピンが対応するピンのビットマスクを返すマクロです。
digitalPinToPort()指定したピンに対応するポートを返すマクロです。
digitalPinToTimer()指定したピンに対応するタイマを返すマクロです。
portModeRegister()指定したポートのモードを制御するレジスタを返すマクロです。
portOutputRegister()指定したポートに対応するレジスタを返すマクロです。
portInputRegister()指定したポートに対応するレジスタを返すマクロです。
bitRead()/bitSet()/bitClear()/bitWrite()ビット操作を行います。
clockCyclesPerMicrosecond()/ clockCyclesToMicroseconds()/ microsecondsToClockCycles()クロック数と時間(マイクロ秒)の関係を相互変換します。
interrupts()/noInterrupts()割り込みを許可(interrupts())、禁止(noInterrupts())します。

AVR-GCC関連

pgmspace.h
pgm_read_byte()指定したアドレス(PROGMEM領域)に格納されているデータを1バイト読み取るためのマクロです。
pgm_read_byte_near()指定したアドレス(PROGMEM領域)に格納されているデータを1バイト読み取るためのマクロです。
__LPM()指定したアドレス(PROGMEM領域)に格納されているデータを1バイト読み取るためのマクロです。
__LPM_enhanced__()指定したアドレス(PROGMEM領域)に格納されているデータを1バイト読み取るためのアセンブラコードです。
pgm_read_word()指定したアドレス(PROGMEM領域)に格納されているデータを2バイト読み取るためのマクロです。
pgm_read_word_near()指定したアドレス(PROGMEM領域)に格納されているデータを2バイト読み取るためのマクロです。
__LPM_word()指定したアドレス(PROGMEM領域)に格納されているデータを2バイト読み取るためのマクロです。
__LPM_word_enhanced__()指定したアドレス(PROGMEM領域)に格納されているデータを2バイト読み取るためのアセンブラコードです。
common.h
SREGATmega328Pの状態レジスタです。
sfr_defs.h
_BV()指定したビット数だけ1を左シフトするマクロです。
_SFR_ADDR()指定した引数のアドレスを返却するマクロです。
_SFR_MEM_ADDR()指定した引数のアドレスを返却するマクロです。
_SFR_BYTE()指定したアドレスの内容(1バイト)を返却するマクロです。
_SFR_WORD()指定したアドレスの内容(2バイト)を返却するマクロです。
_SFR_IO8()I/Oアドレスをメモリアドレスに変換します。指定したアドレスにオフセット(__SFR_OFFSET)を足して返却するマクロです。
_SFR_MEM8()指定したアドレスの内容(1バイト)を返すマクロです。
_SFR_MEM16()指定したアドレスの内容(2バイト)を返すマクロです。
_MMIO_BYTE()指定したアドレスの内容(1バイト)を返すマクロです。
_MMIO_WORD()指定したアドレスの内容(2バイト)を返すマクロです。
bit_is_set()第1引数の第2引数ビット目が1かどうかを調べるマクロです。
bit_is_clear()第1引数の第2引数ビット目が0かどうかを調べるマクロです。
_VECTOR()割り込みベクタ番号を実際のアドレスに変換するマクロです。
iom328p.h
DDRデジタルピンが入力か出力かを示すレジスタです。
PINデジタルピンの入出力を行うためのレジスタです。
PORTデジタルピンの入出力を行うためのレジスタです。
ADMUX参照電圧の設定と出力値の形式、チャネルの選択を制御するレジスタです。
ADCSRAAD変換器の制御を行うためのレジスタです。
ADCL/ADCHAD変換の結果を格納するレジスタです。
Timer/Counter Control Registerタイマとカウンタを制御するためのレジスタです。
Output Compare RegisterPWM出力の際のデューティ比を決めるためのレジスタです。
Timer/Counter Interrupt Mask Registerタイマの割り込みに関するレジスタです。
割り込みベクタ割り込みベクタの定義です。
Timer/Counter Registerタイマクロックごとに1インクリメントされるレジスタです。
Timer/Counter Interrupt Flag Registerタイマ割り込みを制御するレジスタです。
EICRA/EIMSK外部割り込みを制御するレジスタです。
USART0USART0(Universal Synchronous and Asynchronous serial Receiver and Transmitter)に関するレジスタ定義です。
interrupt.h
cli()割り込みを禁止するアセンブラ命令を実行するマクロです。
sei()割り込みを許可するアセンブラ命令を実行するマクロです。
ISR()割り込みベクタに登録する関数を定義するためのマクロです。
SIGNAL()割り込みベクタに登録する関数を定義するためのマクロです。


inserted by FC2 system