なんとかなるさね

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


スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--/--   blog-entry-   category: スポンサー広告

go page top

Arduino IDE | Pleiades Kepler + VMware Player上のUbuntuでLinux Arduinoスケッチをデバッグ (1) 

以前のエントリで、VMware Player上のUbuntuのネイティブなx86 Linux GCCでビルドしたプログラムを
WindowsのPleiades 4.3 KeplerからVMware Player上のUbuntuで実行させてデバッグ出来るようになった
ことを書きましたが、同様のことを、Intel Galileo x86 Linux Cross GCCとVMware Player上のUbuntuで
試してみました。やっていることが分かり難いですが、今回は、以下の組み合わせになります。

Intel Galileo Arduino IDE (エディット/ビルド)       Windowsで実行
Pleiades 4.3 Kepler (デバッグ)      Windowsで実行
Ubuntu/Linaro x86 Linux GDB       VMware Player上のx86 Ubuntu Linuxで実行
Intel Galileo x86 Linux Arduinoスケッチ       VMware Player上のx86 Ubuntu LinuxのGDBで実行



5つ前のエントリで、main()関数の引数チェックが怪しいような気がすると書いたのですが、ステップ実行
してみると、案の定、そこでreturn -1;していました。



なお、ビルドは、Intel Galileo Arduino IDEで行いました。



また、デバッグを始める前に、VMware Player上のUbuntuをWindowsからのコマンド待ちにしています。



今回、Pleiades 4.3 Keplerのプロジェクトの作成は、以下のようにしました。(なお、プロジェクト作成前に、
デバッグに必要なバッチファイルやスクリプトファイルをプロジェクトフォルダにコピーしてあります。)







また、Pleiades 4.3 Keplerのデバッグの構成は、以下のようにしました。








使用したバッチファイルやスクリプトは、以下の通りです。やっていることは、以前のエントリと同じです。

ファイル: vmw-gdb.bat
内容:

@rem This code is in the public domain. You may use, modify or distribute it freely.
@cscript -nologo %~dp0\vmwshdo2.js \\.\pipe\vmware-serial-port2 | cscript -nologo %~dp0\vmwshdo5.js \\.\pipe\vmware-serial-port "gdb %* < /dev/ttyS2 > /dev/ttyS3" | cscript -nologo %~dp0\vmwshdo3.js \\.\pipe\vmware-serial-port3


ファイル: vmwshdo2.js (標準入力をVMware PlayerのCOMポート(名前付きパイプ)へ転送)
内容:

// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, stdin, pipeout, pipein, stdout, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;

// ★★★★メンテしやすい方法へ要修正★★★★
var WindowsPath = /E:\/tools\/micom\/Intel/g; // 正規表現の'/'とパス区切り文字'/'が同じで煩雑
var UbuntuPath = "/home/ubuntu/Galileo";

var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);

stdin = WScript.StdIn;

fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
    try
    {
        f = fso.GetFile(VMwareSerialPortPipe);
        break;
    }
    catch(e)
    {
        if( i == VMwareSerialMaxRetry - 1 ){
            // 指定された名前付きパイプが見つからなかった
            WScript.Quit(1);
        }
        WScript.Sleep(100); // ms
    }
}

while(1)
{
    try
    {
        pipeout = f.OpenAsTextStream(ForAppending, TristateFalse);
        break;
    }
    catch(e)
    {
        WScript.Sleep(100); // ms
    }
}

while(1)
{
    while( stdin.AtEndOfStream )
    {
        WScript.Sleep(100); // ms
    }
    str =stdin.ReadLine();
    // パス区切り文字を変更する
    str = str.replace(/\\\\/g, "/");
    // Windows側→Ubuntu側のパス変換を行う(やり方が非常に荒っぽい)
    // ★★★★メンテしやすい方法へ要修正★★★★
    str = str.replace(WindowsPath, UbuntuPath);
    pipeout.WriteLine(str);
}

pipeout.Close();

WScript.Quit(0)


ファイル: vmwshdo3.js (VMware PlayerのCOMポート(名前付きパイプ)を標準出力へ転送)
内容:

// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, stdin, pipeout, pipein, stdout, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;

// ★★★★メンテしやすい方法へ要修正★★★★
var UbuntuPath = /\/home\/ubuntu\/Galileo/g; // 正規表現の'/'とパス区切り文字'/'が同じで煩雑
var WindowsPath = "E:/tools/micom/Intel";

var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);

stdout = WScript.StdOut;

fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
    try
    {
        f = fso.GetFile(VMwareSerialPortPipe);
        break;
    }
    catch(e)
    {
        if( i == VMwareSerialMaxRetry - 1 ){
            // 指定された名前付きパイプが見つからなかった
            WScript.Quit(1);
        }
        WScript.Sleep(100); // ms
    }
}

while(1)
{
    try
    {
        pipein = f.OpenAsTextStream(ForReading, TristateFalse);
        break;
    }
    catch(e)
    {
        WScript.Sleep(100); // ms
    }
}

while(1)
{
    while( pipein.AtEndOfStream )
    {
        WScript.Sleep(100); // ms
    }
    str = pipein.ReadLine();
    // Ubuntu側→Windows側のパス変換を行う(やり方が非常に荒っぽい)
    // ★★★★メンテしやすい方法へ要修正★★★★
    str = str.replace(UbuntuPath, WindowsPath);
    stdout.WriteLine(str);
}

pipein.Close();

WScript.Quit(0)


ファイル: vmwshdo5.js (VMware Player上のUbuntuでのGDBの起動処理、スクリプト終了処理)
内容:

// This code is in the public domain. You may use, modify or distribute it freely.
var fso, f, ts, str;
var ForReading = 1, ForWriting = 2, ForAppending = 8;
var TristateUseDefault = -2, TristateTrue = -1, TristateFalse = 0;

// ★★★★メンテしやすい方法へ要修正★★★★
var WindowsPath = /E:\/tools\/micom\/Intel/g; // 正規表現の'/'とパス区切り文字'/'が同じで煩雑
var UbuntuPath = "/home/ubuntu/Galileo";

var VMwareSerialMaxRetry = 10;
var VMwareSerialPortPipe = WScript.Arguments(0);
var VMwareExecuteCommand = "";
for (i = 1; i < WScript.Arguments.length; i++)
{
    VMwareExecuteCommand += WScript.Arguments(i) + " ";
}

fso = new ActiveXObject("Scripting.FileSystemObject");
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
    try
    {
        f = fso.GetFile(VMwareSerialPortPipe);
        break;
    }
    catch(e)
    {
        if( i == VMwareSerialMaxRetry - 1 ){
            // 指定された名前付きパイプが見つからなかった
            WScript.Quit(1);
        }
        WScript.Sleep(100); // ms
    }
}

// コマンドの送信(実行終了の目印に[[[END]]]が来るよう"; echo [[[END]]]"を付加して送信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
    try
    {
        ts = f.OpenAsTextStream(ForAppending, TristateFalse);
        break;
    }
    catch(e)
    {
        if( i == VMwareSerialMaxRetry - 1 ){
            // 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
            WScript.Quit(1);
        }
        WScript.Sleep(100); // ms
    }
}
str = VMwareExecuteCommand;
// パス区切り文字を変更し、最後に"; echo [[[END]]]"を付加する
str = str.replace(/\\/g,"/") + "; echo [[[END]]]";
// Windows側→Ubuntu側のパス変換を行う
// ★★★★メンテしやすい方法へ要修正★★★★
str = str.replace(WindowsPath, UbuntuPath);
ts.WriteLine(str);
ts.Close();

// 実行結果の受信(実行終了の目印の[[[END]]]が来るまで受信する)
for( i = 0; i < VMwareSerialMaxRetry; i++ )
{
    try
    {
        ts = f.OpenAsTextStream(ForReading, TristateFalse);
        break;
    }
    catch(e)
    {
        if( i == VMwareSerialMaxRetry - 1 ){
            // 指定された名前付きパイプを他のプログラムが使用している(or 取られた)?
            WScript.Quit(1);
        }
        WScript.Sleep(100); // ms
    }
}
while (1)
{
    for( i = 0; i < VMwareSerialMaxRetry; i++ )
    {
        try
        {
            // しまった。ブロッキングリードだから最大リトライ回数チェックは無駄だった。
            str = ts.ReadLine();
            break;
        }
        catch(e)
        {
            if( i == VMwareSerialMaxRetry - 1 ){
                WScript.Quit(1);
            }
            WScript.Sleep(100); // ms
        }
    }
    if (str.search(/exit ; echo \[\[\[END\]\]\]$/) != -1)
    {
        // exitコマンドでは目印の[[[END]]]が来ないので待たずに終了
        break;
    }
    if (str.search(/^\[\[\[END\]\]\]/) != -1)
    {
        // コマンドの実行終了の目印の[[[END]]]が来たら終了
        break;
    }
    if (str.search(/ ; echo \[\[\[END\]\]\]$/) == -1 && str.search(/^[ \t]*$/) == -1)
    {
        // コマンドのエコーバックと空行を除きコマンドの実行結果を画面に表示する
        WScript.Echo(str);
    }
}
ts.Close();

WScript.Quit(0)


関連記事

2013/12/30   blog-entry-397   category: Arduino Lib & CrossGCC

go page top

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。