Arduino IDE | Intel Galileo Arduino IDEのビルドフォルダを変更する
3つ前のエントリで気付いたArduino IDEの個人環境設定ファイルのテンプレートファイルを見ていたところ、
以下の記述があることに気付きました。そこで、試しに、Intel Galileo Arduino IDEのビルドフォルダを指定
してみました。また、この際ですので、スケッチが保存されるフォルダも、その近くへ変更してみました。
(追記 : ビルドフォルダ以下をごっそりと削除することがあるようですので、ちょっと危険かも知れません。)
ファイル: E:\tools\micom\Intel\arduino-1.5.3\lib\preferences.txt (こちらは編集禁止のようです。)
# temporary build path, normally this goes into the default
# "temp" folder for that platform (as defined by java)
# but this can be used to set a specific file in case of problems
#build.path=build
編集するファイル: C:\Users\{ユーザ名}\AppData\Roaming\Arduino15\preferences.txt
追加する記述(赤字の箇所)
board=izmir_fd
browser.linux=mozilla
build.path=E:/tools/micom/Intel/sketchbook/build
build.verbose=true
build.warn_data_percentage=75
変更する記述(赤字の箇所)
serial.databits=8
serial.debug_rate=9600
serial.parity=N
serial.port=COM1
serial.stopbits=1
sketchbook.path=E:/tools/micom/Intel/sketchbook
software=ARDUINO
target_package=arduino
target_platform=x86
ファイルを編集した後、Arduino IDEを起動してビルドしてみたところ、確かにビルドフォルダが指定された
フォルダに変更されていました。


ビルドログは以下の通りでした。
BuildLog.txt
また、GDBを試したところ、やはり、setup()に来る前に、どこかで終了してしまっているようでした。(なお、
Intel Galileo Arduinoスケッチを実行するには、2つ前のエントリで補った共有ライブラリに、さらに追加する
必要がありましたので、それも追加しています。)
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/lib/libm.so.0 /lib/libm.so.0
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/lib/libdl.so.0 /lib/libdl.so.0
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/lib/libpthread.so.0 /lib/libpthread.so.0
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/usr/lib/libstdc++.so.6 /lib/libstdc++.so.6

gdb build/sketch_dec28a.cpp.elf


そこで、以下のように、main()の先頭で一旦止めようとしてみたのですが、ソースが見つからないと言われて
しまいました。考えてみれば、デバッグ情報にWindows側のパスが埋め込まれている訳ですので、当然です。
以前のエントリで試したように、EclipseにはWindows側のパスとUbuntu側のパスのマッピングを行う機能が
あったのですが、同様な機能がGDBにないかどうか調べてみるつもりです。(実は、ブログにGCCとかGDBとか
書いていますが、正直、余り詳しくないです。ただ、ちょっとだけ勘は悪くないという気はしていますが。)


追記 : メモ
ビルドフォルダにsketch_dec28a.cppというファイルがあったので開いてみたところ、以下の内容でした。
#line 1 "sketch_dec28a.ino"
#include "Arduino.h"
void setup();
void loop();
#line 1
void setup() {
printf("Hello app!!\n");
exit(0);
}
void loop() {
}
追記 : メモ
ちょっと好奇心から、明示的なプロトタイプ宣言を書かずにundecl()という関数を書いてみました。
スケッチの内容:
void setup() {
printf("Hello app!!\n");
undecl("test undecl\n");
exit(0);
}
void loop() {
}
void undecl(char *str) {
printf(str);
}
この場合、ビルドフォルダに生成されたsketch_dec28a.cppというファイルは、以下の内容になりました。
Arduino IDEがプロトタイプ宣言を補っていました。
生成されたファイルの内容:
#line 1 "sketch_dec28a.ino"
#include "Arduino.h"
void setup();
void loop();
void undecl(char *str);
#line 1
void setup() {
printf("Hello app!!\n");
undecl("test undecl\n");
exit(0);
}
void loop() {
}
void undecl(char *str) {
printf(str);
}
追記 : メモ
さらに、ちょっと好奇心から、1つのhファイルと2つのinoファイルからなるソースコードを書いてみました。
また、undecl()という関数の実体を2つ目のinoファイルに書き、1つ目のinoファイルから呼んでみました。
ファイル: sketch_dec28a.ino
#include "sketch_dec28a_add.h"
void setup() {
printf("Hello app!!\n");
globvar = 1;
undecl("test undecl\n");
exit(0);
}
void loop() {
}
ファイル: sketch_dec28a_add.h
#ifndef __SKETCH_DEC28A_ADD_H__
#define __SKETCH_DEC28A_ADD_H__
int globvar = 0;
#endif /* __SKETCH_DEC28A_ADD_H__ */
ファイル: sketch_dec28a_add.ino
#include "sketch_dec28a_add.h"
void undecl(char *str) {
printf(str);
globvar = 0;
}
この場合、ビルドフォルダに生成されたsketch_dec28a.cppというファイルは、以下の内容になりました。
Arduino IDEがファイルを結合していました。また、別ファイルの関数のプロトタイプ宣言も補っていました。
生成されたファイルの内容:
#line 1 "sketch_dec28a.ino"
#include "sketch_dec28a_add.h"
#include "Arduino.h"
void setup();
void loop();
void undecl(char *str);
#line 2
void setup() {
printf("Hello app!!\n");
globvar = 1;
undecl("test undecl\n");
exit(0);
}
void loop() {
}
#line 1 "sketch_dec28a_add.ino"
#include "sketch_dec28a_add.h"
void undecl(char *str) {
printf(str);
globvar = 0;
}

追記 : メモ
ビルドフォルダにsketch_dec28a.cpp.dというファイルがあったので開いてみたところ、以下の内容でした。
GCCが-MMDオプション指定されたことで自動生成した依存関係記述ファイルのようです。
E:\tools\micom\Intel\sketchbook\build\sketch_dec28a.cpp.o: \
E:\tools\micom\Intel\sketchbook\build\sketch_dec28a.cpp \
E:\tools\micom\Intel\sketchbook\build\sketch_dec28a_add.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Arduino.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/binary.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\variants\galileo_fab_d/variant.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/AnalogIO.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/wiring_digital.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/fast_gpio_sc.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\variants\galileo_fab_d/pins_arduino.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/TTYUART.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/HardwareSerial.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Stream.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Print.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/WString.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Printable.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/RingBuffer.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/AnalogIO.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/BitsAndBytes.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/OSAbstract.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/UtilTime.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/wiring_digital.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/interrupt.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/WCharacter.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/WMath.h
メモ : 雑感
Linuxでハードウェアを制御する場合、通常はデバイスドライバ呼び出しでの制御になりますが、C/C++で
プログラムを作成する場合、デバイスドライバ呼び出しを何かしらの関数ライブラリやクラスライブラリで
ラッピングしてしまうことになるだろうと思います。それを考えると、ラッピングレイヤがLinux Arduino
互換ライブラリという形で最初から提供されているのは、自分で作成する手間が省けて(というか、端子入力
割り込みの取り扱い方法とか、私では思い付きませんし)、ちょっと楽な気がします。(結局、inoファイルは
Arduino IDEによってcppファイルに変換されてGCCで普通にビルドされる訳ですので、当然、自分が書いた
cppファイルから使用した場合でも特に問題は起きない筈ですので。)
以下の記述があることに気付きました。そこで、試しに、Intel Galileo Arduino IDEのビルドフォルダを指定
してみました。また、この際ですので、スケッチが保存されるフォルダも、その近くへ変更してみました。
(追記 : ビルドフォルダ以下をごっそりと削除することがあるようですので、ちょっと危険かも知れません。)
ファイル: E:\tools\micom\Intel\arduino-1.5.3\lib\preferences.txt (こちらは編集禁止のようです。)
# temporary build path, normally this goes into the default
# "temp" folder for that platform (as defined by java)
# but this can be used to set a specific file in case of problems
#build.path=build
編集するファイル: C:\Users\{ユーザ名}\AppData\Roaming\Arduino15\preferences.txt
追加する記述(赤字の箇所)
board=izmir_fd
browser.linux=mozilla
build.path=E:/tools/micom/Intel/sketchbook/build
build.verbose=true
build.warn_data_percentage=75
変更する記述(赤字の箇所)
serial.databits=8
serial.debug_rate=9600
serial.parity=N
serial.port=COM1
serial.stopbits=1
sketchbook.path=E:/tools/micom/Intel/sketchbook
software=ARDUINO
target_package=arduino
target_platform=x86
ファイルを編集した後、Arduino IDEを起動してビルドしてみたところ、確かにビルドフォルダが指定された
フォルダに変更されていました。


ビルドログは以下の通りでした。
BuildLog.txt
また、GDBを試したところ、やはり、setup()に来る前に、どこかで終了してしまっているようでした。(なお、
Intel Galileo Arduinoスケッチを実行するには、2つ前のエントリで補った共有ライブラリに、さらに追加する
必要がありましたので、それも追加しています。)
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/lib/libm.so.0 /lib/libm.so.0
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/lib/libdl.so.0 /lib/libdl.so.0
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/lib/libpthread.so.0 /lib/libpthread.so.0
sudo ln -s ~/Galileo/arduino-1.5.3/hardware/tools/x86/i586-poky-linux-uclibc/usr/lib/libstdc++.so.6 /lib/libstdc++.so.6

gdb build/sketch_dec28a.cpp.elf


そこで、以下のように、main()の先頭で一旦止めようとしてみたのですが、ソースが見つからないと言われて
しまいました。考えてみれば、デバッグ情報にWindows側のパスが埋め込まれている訳ですので、当然です。
以前のエントリで試したように、EclipseにはWindows側のパスとUbuntu側のパスのマッピングを行う機能が
あったのですが、同様な機能がGDBにないかどうか調べてみるつもりです。(実は、ブログにGCCとかGDBとか
書いていますが、正直、余り詳しくないです。ただ、ちょっとだけ勘は悪くないという気はしていますが。)


追記 : メモ
ビルドフォルダにsketch_dec28a.cppというファイルがあったので開いてみたところ、以下の内容でした。
#line 1 "sketch_dec28a.ino"
#include "Arduino.h"
void setup();
void loop();
#line 1
void setup() {
printf("Hello app!!\n");
exit(0);
}
void loop() {
}
追記 : メモ
ちょっと好奇心から、明示的なプロトタイプ宣言を書かずにundecl()という関数を書いてみました。
スケッチの内容:
void setup() {
printf("Hello app!!\n");
undecl("test undecl\n");
exit(0);
}
void loop() {
}
void undecl(char *str) {
printf(str);
}
この場合、ビルドフォルダに生成されたsketch_dec28a.cppというファイルは、以下の内容になりました。
Arduino IDEがプロトタイプ宣言を補っていました。
生成されたファイルの内容:
#line 1 "sketch_dec28a.ino"
#include "Arduino.h"
void setup();
void loop();
void undecl(char *str);
#line 1
void setup() {
printf("Hello app!!\n");
undecl("test undecl\n");
exit(0);
}
void loop() {
}
void undecl(char *str) {
printf(str);
}
追記 : メモ
さらに、ちょっと好奇心から、1つのhファイルと2つのinoファイルからなるソースコードを書いてみました。
また、undecl()という関数の実体を2つ目のinoファイルに書き、1つ目のinoファイルから呼んでみました。
ファイル: sketch_dec28a.ino
#include "sketch_dec28a_add.h"
void setup() {
printf("Hello app!!\n");
globvar = 1;
undecl("test undecl\n");
exit(0);
}
void loop() {
}
ファイル: sketch_dec28a_add.h
#ifndef __SKETCH_DEC28A_ADD_H__
#define __SKETCH_DEC28A_ADD_H__
int globvar = 0;
#endif /* __SKETCH_DEC28A_ADD_H__ */
ファイル: sketch_dec28a_add.ino
#include "sketch_dec28a_add.h"
void undecl(char *str) {
printf(str);
globvar = 0;
}
この場合、ビルドフォルダに生成されたsketch_dec28a.cppというファイルは、以下の内容になりました。
Arduino IDEがファイルを結合していました。また、別ファイルの関数のプロトタイプ宣言も補っていました。
生成されたファイルの内容:
#line 1 "sketch_dec28a.ino"
#include "sketch_dec28a_add.h"
#include "Arduino.h"
void setup();
void loop();
void undecl(char *str);
#line 2
void setup() {
printf("Hello app!!\n");
globvar = 1;
undecl("test undecl\n");
exit(0);
}
void loop() {
}
#line 1 "sketch_dec28a_add.ino"
#include "sketch_dec28a_add.h"
void undecl(char *str) {
printf(str);
globvar = 0;
}

追記 : メモ
ビルドフォルダにsketch_dec28a.cpp.dというファイルがあったので開いてみたところ、以下の内容でした。
GCCが-MMDオプション指定されたことで自動生成した依存関係記述ファイルのようです。
E:\tools\micom\Intel\sketchbook\build\sketch_dec28a.cpp.o: \
E:\tools\micom\Intel\sketchbook\build\sketch_dec28a.cpp \
E:\tools\micom\Intel\sketchbook\build\sketch_dec28a_add.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Arduino.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/binary.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\variants\galileo_fab_d/variant.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/AnalogIO.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/wiring_digital.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/fast_gpio_sc.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\variants\galileo_fab_d/pins_arduino.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/TTYUART.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/HardwareSerial.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Stream.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Print.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/WString.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/Printable.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/RingBuffer.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/AnalogIO.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/BitsAndBytes.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/OSAbstract.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/UtilTime.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/wiring_digital.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/interrupt.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/WCharacter.h \
E:\tools\micom\Intel\arduino-1.5.3\hardware\arduino\x86\cores\arduino/WMath.h
メモ : 雑感
Linuxでハードウェアを制御する場合、通常はデバイスドライバ呼び出しでの制御になりますが、C/C++で
プログラムを作成する場合、デバイスドライバ呼び出しを何かしらの関数ライブラリやクラスライブラリで
ラッピングしてしまうことになるだろうと思います。それを考えると、ラッピングレイヤがLinux Arduino
互換ライブラリという形で最初から提供されているのは、自分で作成する手間が省けて(というか、端子入力
割り込みの取り扱い方法とか、私では思い付きませんし)、ちょっと楽な気がします。(結局、inoファイルは
Arduino IDEによってcppファイルに変換されてGCCで普通にビルドされる訳ですので、当然、自分が書いた
cppファイルから使用した場合でも特に問題は起きない筈ですので。)
- 関連記事
-
- Arduino IDE | Intel Galileo Arduino IDEで作成した実行プログラムをLinuxから実行する時の引数
- Arduino IDE | Intel Galileo Arduino IDEでcppファイルをコンパイル
- Arduino IDE | Pleiades KeplerとIntel Galileo Arduino IDEでスケッチフォルダとビルドフォルダを共有
- Arduino IDE | Pleiades KeplerでLinux Arduino互換ライブラリをcppファイルから使用する
- Arduino IDE | Pleiades KeplerでLinux Arduinoスケッチのinoファイルをコンパイル
- Arduino IDE | Pleiades Kepler + VMware Player上のUbuntuでLinux Arduinoスケッチをデバッグ (2)
- Arduino IDE | Pleiades Kepler + VMware Player上のUbuntuでLinux Arduinoスケッチをデバッグ (1)
- Arduino IDE | Intel Galileo Arduino IDEのビルドフォルダを変更する
- Arduino IDE | Intel Galileo Arduino IDEで呼び出すGCCやオプションを変えてビルドする
- Arduino IDE | Intel Galileo Arduino IDEのGCCでビルドしたプログラムをUbuntuで実行してみた
- Arduino IDE | Intel Galileo Arduino IDEにGCCを呼び出す時のオプションを表示させる
- Arduino IDE | Intel Galileo ArduinoスケッチにLinuxのスレッド制御関数を書いてビルドしてみた
- Arduino IDE | Intel Galileo x86 Linux Arduino互換ライブラリに使用されているGCC
- Visual Studio | デバッガ機能の拡張方法について書かれたMSDNのページ
- RXマイコン | アプリケーションノート + 付加価値 をライブラリファイルで配布可?
2013/12/28 blog-entry-396 category: Arduino Lib & CrossGCC
| h o m e |