質問するログイン新規登録
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

意見交換

クローズ

1回答

384閲覧

Arduino IDE の "Upload" 処理の詳細

IkazoIchikawa

総合スコア38

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

0クリップ

投稿2024/02/04 04:13

0

0

テーマ、知りたいこと

Auduino IDE で実装したスケッチファイルが、IDE に Upload ("Upload") される処理は、以下のような流れで行われているのでしょうか?
(https://docs.arduino.cc/) で検索してみましたが、それらしい文書が見つからず、認識に間違いが無いかどうか意見をいただけませんか?

  1. C/C++ コードに展開
  2. 展開されたコードが C コードなのか、 C++ コードなのか判定
  3. gcc をコール
    • C コードの場合は、展開した C コードを元に avr-gcc をコール
    • C++ コードの場合は、展開した C++ コードを元に avr-g++ をコール
  4. プリプロセッサ処理
  5. 実行ファイル生成 (オブジェクトファイル生成 & リンク) -> Hex ファイル生成
    (この時点で生成される実行ファイルが、IDE の Export Compiled Binaly (Sketch -> Export Compiled Binaly) で生成される "~.hex" ファイルと同じ)
  6. avrdude で実行ファイルを Arduino に書き込み

調べてみたこと

大まかな Arduino IDE の構成については、Arduino言語 = C/C++言語? Arduinoコードの仕組みを参考にしました。
また、Arduino IDE のインストール時に以下のファイルが追加されていました。

  • C:\Users\USERNAME\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\cores\arduino\main.cpp
  • C:\Users\USERNAME\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.6\platform.txt

その為、大まかな構成は、以下のようなものと予想しています。

  1. スケッチファイルを作成 -> Upload
  2. Arduino IDE が、
    1. スケッチファイルと Wiring ライブラリを組み合わせて、C/C++ ソースコードに展開
    2. avr-gcc でコンパイル
    3. avrdude でターゲットボードに書き込み

(参考) platform.txt の中身

# Default "compiler.path" is correct, change only if you want to override the initial value compiler.path={runtime.tools.avr-gcc.path}/bin/ compiler.c.cmd=avr-gcc compiler.c.flags=-c -g -Os {compiler.warning_flags} -std=gnu11 -ffunction-sections -fdata-sections -MMD -flto -fno-fat-lto-objects compiler.c.elf.flags={compiler.warning_flags} -Os -g -flto -fuse-linker-plugin -Wl,--gc-sections compiler.c.elf.cmd=avr-gcc compiler.S.flags=-c -g -x assembler-with-cpp -flto -MMD compiler.cpp.cmd=avr-g++ compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -std=gnu++11 -fpermissive -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -Wno-error=narrowing -MMD -flto compiler.ar.cmd=avr-gcc-ar compiler.ar.flags=rcs compiler.objcopy.cmd=avr-objcopy compiler.objcopy.eep.flags=-O ihex -j .eeprom --set-section-flags=.eeprom=alloc,load --no-change-warnings --change-section-lma .eeprom=0 compiler.elf2hex.flags=-O ihex -R .eeprom compiler.elf2hex.cmd=avr-objcopy compiler.ldflags= compiler.libraries.ldflags= compiler.size.cmd=avr-size
# AVR Uploader/Programmers tools # ------------------------------ tools.avrdude.path={runtime.tools.avrdude.path} tools.avrdude.cmd.path={path}/bin/avrdude tools.avrdude.config.path={path}/etc/avrdude.conf tools.avrdude.upload.params.verbose=-v tools.avrdude.upload.params.quiet=-q -q # tools.avrdude.upload.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value tools.avrdude.upload.verify= tools.avrdude.upload.params.noverify=-V tools.avrdude.upload.pattern="{cmd.path}" "-C{config.path}" {upload.verbose} {upload.verify} -p{build.mcu} -c{upload.protocol} "-P{serial.port}" -b{upload.speed} -D "-Uflash:w:{build.path}/{build.project_name}.hex:i" tools.avrdude.program.params.verbose=-v tools.avrdude.program.params.quiet=-q -q # tools.avrdude.program.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value tools.avrdude.program.verify= tools.avrdude.program.params.noverify=-V tools.avrdude.program.pattern="{cmd.path}" "-C{config.path}" {program.verbose} {program.verify} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{build.path}/{build.project_name}.hex:i" tools.avrdude.erase.params.verbose=-v tools.avrdude.erase.params.quiet=-q -q tools.avrdude.erase.pattern="{cmd.path}" "-C{config.path}" {erase.verbose} -p{build.mcu} -c{protocol} {program.extra_params} -e -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m tools.avrdude.bootloader.params.verbose=-v tools.avrdude.bootloader.params.quiet=-q -q tools.avrdude.bootloader.pattern="{cmd.path}" "-C{config.path}" {bootloader.verbose} -p{build.mcu} -c{protocol} {program.extra_params} "-Uflash:w:{runtime.platform.path}/bootloaders/{bootloader.file}:i" -Ulock:w:{bootloader.lock_bits}:m tools.avrdude_remote.upload.pattern=/usr/bin/run-avrdude /tmp/sketch.hex {upload.verbose} -p{build.mcu} # The following rule is deprecated by pluggable discovery. # We keep it to avoid breaking compatibility with the Arduino Java IDE. tools.avrdude.network_cmd={runtime.tools.arduinoOTA.path}/bin/arduinoOTA tools.avrdude.upload.network_pattern="{network_cmd}" -address {serial.port} -port {upload.network.port} -sketch "{build.path}/{build.project_name}.hex" -upload {upload.network.endpoint_upload} -sync {upload.network.endpoint_sync} -reset {upload.network.endpoint_reset} -sync_exp {upload.network.sync_return}

確認環境

OS: Windows10(64bit) (22H2)
Auduino IDE: 2.2.1 (64bit)
使用ボード: Arduino UNO R3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

回答1

#1

thkana

総合スコア7770

投稿2024/02/04 23:53

「意見」というより、実際の動作を追いかけてみる話ですね...

C/C++ コードに展開
展開されたコードが C コードなのか、 C++ コードなのか判定
.inoファイルは、必ずC++に展開されます。
プロジェクトに含めた.cファイルがどう処理されるかは...やってみたことがないなぁ。取り込むときにextern "C"をつけなきゃいけないのかどうか。それを気にするくらいなら、C++で書いてしまえばいい話とも思います。
プリプロセッサ処理
実行ファイル生成
べつにプリプロセス結果を出して編集しているわけでもなさそうで、そうだとするとそれは「gccがやること」なので、IDEが何をしているかという話題に於いてはレイヤーが違う気がします。
スケッチファイルと Wiring ライブラリを組み合わせて、C/C++ ソースコードに展開
ライブラリはライブラリ単位でコンパイルされて、スケッチをコンパイルしたものとリンクされます。ソースコードレベルでいじってはいないようです(ヘッダファイルだけで完結するようにライブラリを作っていたならソースコードレベルですべて結合されてしまいますが、それは別の話と考えていいでしょう)。その構造故に、ライブラリにコンパイルスイッチを設けて...というのがとてもやりにくくなっているように思います。ときどき「プロジェクト単位でコンパイルオプションを簡単に与えられたら(なんらかのシンボル定義だけでも)と思うことはあります。
ライブラリについて言えば、ヘッダファイルの名称をキーにリンクするライブラリを選定する、というのはgccではなくIDEの行う作業ですね(そして、プログラム本体にエラーがあってもなぜかライブラリ選定のエラーがレポートされたりする)。

コンパイルの基本設定を与えるplatform.txtの他に、コンパイルオプションを生成するための情報源としてboard.txtというのもあって、これはメニューの[ツール]で設定する項目に対してコンパイルオプションを操作します(UNO R3だと設定する項目はありませんけれど)。特殊なことをやりたいときはここを編集する手もありますが、ボードライブラリの一部なので、ボードライブラリのアップデートがかかると上書きされてしまうという...

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

最新の回答から1ヶ月経過したため この意見交換はクローズされました

意見をやりとりしたい話題がある場合は質問してみましょう!

質問する

関連した質問