こんにちは、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-gcc
のavr-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が存在しない環境で、例えばディスクリプタがどのように扱われるのか」が考えられます。
何気ないビルド時のメッセージも色々考えることができて面白いですね。
notco