前回、ZedBoard Zynqを使って、簡単なPL回路を作成し、それをPSから制御することに成功した。
ここで、制御するためにわざわざCのプログラムを書いて、コンパイルして、ダウンロードした。これは正直大変なので、GDBやインタプリタのようなインタフェースを持たせて、リコンパイル無しにデバッグを実行したい。
例えばPythonにはlibpythonが存在し、C++のプログラムに埋め込むことでC++のプログラムにPython I/Fを埋め込むことができる。 また、Luaも同様にlibluaをC++のコードに埋め込むことで、C++のコードにLuaのインタフェースを仕込むことができる。 Zynqでも同様にインタラクティブな操作が可能なインタフェースを用意したい。しかしこのためには、LinuxなどのOSが必要だ。もっと簡単に実現することはできないだろうか。
つまり、Bere-Metalな環境から操作可能なコマンドラインインタフェースを用意して、PLのデバッグなどを簡単に行えるようになりたい。
いろいろ調査していたのだが、ライブラリとして簡素なものとしてはreadlineというものがあることを知った。
サンプルが以下にある。これを使えば、簡単にコマンドラインインタフェースを作成することができる。これを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に関わる部分が存在しないのでリンク出来ない。そりゃそうか。
とりあえず諦め。別の方法を考えるか、普通に簡単なインタフェースを自作するか。