読者です 読者をやめる 読者になる 読者になる

FPGA開発日記

FPGAというより、コンピュータアーキテクチャかもね! カテゴリ別記事インデックス https://sites.google.com/site/fpgadevelopindex/

ZynqのデバッグI/FをLinux無しで実現したい(readlineを試行→失敗)

f:id:msyksphinz:20160524232435p:plain

前回、ZedBoard Zynqを使って、簡単なPL回路を作成し、それをPSから制御することに成功した。

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

msyksphinz.hatenablog.com

ここで、制御するためにわざわざCのプログラムを書いて、コンパイルして、ダウンロードした。これは正直大変なので、GDBインタプリタのようなインタフェースを持たせて、リコンパイル無しにデバッグを実行したい。

例えばPythonにはlibpythonが存在し、C++のプログラムに埋め込むことでC++のプログラムにPython I/Fを埋め込むことができる。 また、Luaも同様にlibluaをC++のコードに埋め込むことで、C++のコードにLuaのインタフェースを仕込むことができる。 Zynqでも同様にインタラクティブな操作が可能なインタフェースを用意したい。しかしこのためには、LinuxなどのOSが必要だ。もっと簡単に実現することはできないだろうか。

つまり、Bere-Metalな環境から操作可能なコマンドラインインタフェースを用意して、PLのデバッグなどを簡単に行えるようになりたい。

いろいろ調査していたのだが、ライブラリとして簡素なものとしてはreadlineというものがあることを知った。

The GNU Readline Library

サンプルが以下にある。これを使えば、簡単にコマンドラインインタフェースを作成することができる。これをARMのベアメタルでコンパイルすることは出来るだろうか?

GNU Readline Library - Programming with GNU Readline

readlineの使い方

readlineは簡素なコマンドラインインタフェースで、以下のようなプログラムを作れば、簡単にインタラクティブなプログラムを作成することができる。

int main (int argc, char **argv)
{
  char *line, *s;

  /* Loop reading and executing lines until the user quits. */
  while (1) {
    line = readline (">>> ");

    if (!line)
      break;

    /* Remove leading and trailing whitespace from the line.
       Then, if there is anything left, add it to the history list
       and execute it. */

    if (*line) {
      add_history (line);
      printf ("line = %s\n", line);
    }
  }
}

readline()でstdinから1行を受け取り、これをlineに格納する。また、add_historyを使うことによって履歴に格納し、通常のbashのように履歴を呼び出すこともできる。

$ ./app
>>> hello
line = hello
>>> world
line = world
>>>

このようなプログラムをコンパイルするためには、readlineのライブラリとncursesのライブラリが必要だ。ARMで動作させるためには、これのクロスコンパイルが必要になる。

先にネタバレしておくと、これらのライブラリはLinux OSの存在する環境でしか動作しない。つまり、Bare-Metalで動かすことは出来なかった。

それでも一応備忘録のために書いておくけど。

ncurses, readlineのクロスコンパイル

以下を参考にした。

How To Build for ARM - ncurses

How To Build for ARM - readline

ついでに言うとncursesの場合は、CPPFLAGS-Pを追加しないとコンパイルできなかった。

CPP_FLAGS="-P" ../ncurses-6.0/configure --host=arm-linux-gnueabi

上記の方法でコンパイルしたライブラリをXilinx SDKに持っていきリンクさせてみたのだが、やはりOSに関わる部分が存在しないのでリンク出来ない。そりゃそうか。

f:id:msyksphinz:20160830015058p:plain

とりあえず諦め。別の方法を考えるか、普通に簡単なインタフェースを自作するか。