なんとかなるさね

マイコンをネタにブログを始めてみました


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ファイルから使用した場合でも特に問題は起きない筈ですので。)

関連記事

2013/12/28   blog-entry-396   category: Arduino Lib & CrossGCC

go page top