Beaver's Hive Logo

Beaver's Hive Blog

Official Web
Post image

Arduinoの標準ライブラリを調べる

こんにちは、notcoです。今日はArduinoと標準ライブラリに関する話です。

Arduino UNOのMCUはatmega328pがよく使われますが、その命令セットはglibcでサポートされていない8ビットのAVRです。
では、atmega328p向けのコードにおけるprintf関数などはどのライブラリから使用されているのでしょうか?
答えはavr-gccです。次のセクションでそれを導いていきます。

実験

冗長付きでビルドを回して確認してみます。出力が長いので最初の数行のみ記します。

$ arduino-cli compile -vb arduino:avr:uno
FQBN: arduino:avr:uno
Using board 'uno' from platform in folder: ~/.arduino15/packages/arduino/hardware/avr/1.8.6
Using core 'arduino' from platform in folder: ~/.arduino15/packages/arduino/hardware/avr/1.8.6

Detecting libraries used...
~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -c -g -Os -w -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -flto -w
 -x c++ -E -CC -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10607 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -I~/.arduino15/packages/arduino/hardware/avr/1.8.6/cores/arduino -I~/.arduino15/packages/arduino/hardware/avr/1.8
.6/variants/standard hogehoge.ino.cpp -o /dev/null

……

上記のハイライトに注目すると、avr-gccavr-g++が使われています。
インクルードパスを確認するために、#include <stdio.h>が書かれたファイルを冗長付きでビルドしてみます。
これも出力が長いので一部省略します。

$ ~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/avr-g++ -v /dev/null -o /dev/null

……

#include "..." search starts here:
#include <...> search starts here:
 ~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/include
 ~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/include-fixed
 ~/.arduino15/packages/arduino/tools/avr-gcc/7.3.0-atmel3.6.1-arduino7/bin/../lib/gcc/avr/7.3.0/../../../../avr/include
End of search list.

……

太字で示したパスにstdio.hが含まれており、上記のハイライトからavr-gccと分かりました。

おわりに

本記事では、Arduino UNOのビルド時に使われる標準ライブラリを調べ、avr-gccであることが分かりました。

ここで、avr-gccのABIも調べてみましょう。ssize_tが定義されていません。
ssize_tはPOSIXで定義されている型なため、POSIX系のAPIは無いことが分かります。(ssize_t型の是非はここでは置いておきます。)

何故POSIX系のAPIが無いのでしょうか?
「非標準だから」「ArduinoにはデフォルトでOSが無いから」、もう少し具体的に「OSが存在しない環境で、例えばディスクリプタがどのように扱われるのか」が考えられます。

何気ないビルド時のメッセージも色々考えることができて面白いですね。

Category: