前回からの続きです。
このテーマを最初からご覧になる場合はこちらからどうぞ。
TOPPERS/ASPとFSPを組み合わせて使う~その1
さて、前回は「TOPPERS/ASP」を使用せずに完全なベアメタルでのシリアル通信を使用するプログラムを作成しました。
シリアル通信のドライバは、Renesas社純正のドライバ、プロトコル・スタックなどを開発者に提供するソースコードのライブラリであるFSP(Flexible Software Package)を使用しました。
今回は同様の事を「TOPPERS/ASP」とFSPを組み合わせた形で試用する方法をご紹介します。
前回の「Hinagata」プロジェクトを「TOPPERS/ASP」に移植する形で作業を進めます。
んなもんとっくに消しちゃったよ~って方は、コチラを参考に再度作成してください。
そして、前回のベアメタルでのシリアル通信プログラムが動くところまで作業をお願いします。
まずは「TOPPERS/ASP」のソースコードのダウンロードです。
すでにこのブログを読んでいただいていて、ぶっ通しで作業してくれている方には申し訳ないのですが、なるべく最新のものを使っていただきたいので、再度ダウンロードをお願いします。
以下のページにアクセスしてください。
そうしたら「master」という表示のコンボボックスに注目です。
https://github.com/RyutaroMorita/asp_arduino_uno_r4_gcc
このコンボボックスをクリックすると、以下のようにリストが表示されます。
今は「master」が選ばれていますが、その下の「template」をクリックします。
すると、コンボボックスが「template」に変わったページに切り替わりましたよね?
次は、そのはるか右側の「<>Code」と書いてあるボタンをクリックしてください。
こちらもリストが展開されて、その中に「Download ZIP」というのがあります。
これをクリックすると、Arduino UNO R4版の「TOPPERS/ASP」のソースコードのダウンロードが始まります。
ソースコードはZIP形式でダウンロードされますので、展開が必要です。
今回は「Cygwin」傘下の以下のディレクトリに展開したものとして説明します。
C:\cygwin64\home\<ユーザー名>\asp_arduino_uno_r4_gcc-template
このディレクトリ直下は、以下のようになっていることを確認します。
(Winodwsの標準ツールでそのまま展開しちゃうと、もう一層「asp_arduino_uno_r4_gcc-template」ディレクトリが入っちゃうので注意です。)
この中の「OBJ_template」というディレクトリに注目です。
「OBJ」ディレクトリの中には、TOPPERS/ASPの純正のサンプルプログラムのソースコードが入っています。
一方「OBJ_template」には、一秒ごとに「main_task is running.」というシリアル通信のメッセージを出力するだけのシンプルなアプリケーションのソースコードが入っています。
これから新しいシリアル通信のアプリケーションを作成する上で、ベースとするソースコードとして用意しました。
「OBJ」をベースにしてしまうと、いろいろ余計な部分を削除する手間がありますので~。
メインプログラムの「main.c」は以下のような感じです。
シンプルでしょ?
- #include <kernel.h>
- #include <t_syslog.h>
- #include <t_stdlib.h>
- #include "kernel_cfg.h"
- #include "main.h"
- /*
- * メインタスク
- */
- void main_task(intptr_t exinf)
- {
- while (1) {
- syslog(LOG_NOTICE, "main_task is running.");
- dly_tsk(1000);
- }
- }
お次は「Hinagata」プロジェクトからFSPを含む必要なソースコードを「TOPPERS/ASP」のソースコードにコピーする作業です。
この作業は「TOPPERS/ASP - Arduino UNO R4版 その4」の記事を参考にしてください。
前回の「Hinagata」プロジェクトの状態ならば、コピーするディレクトリの中にシリアル通信ドライバなども含まれているはずです。
ただし、ビルド作業までやる必要はありません。
後述しますが、どうせエラーが出ます!!
さらに「e2 studio」でのプロジェクトも作っちゃいましょう。
この作業は「TOPPERS/ASP - Arduino UNO R4版 その6」の記事を参考にしてください。
ただし、この記事では「OBJ」ディレクトリに対しての作業でしたが、今回は「OBJ_template」ディレクトリに対する作業となりますので。
置き換えてお読みください。
以下のように「OBJ_template」をビルドする準備ができましたでしょうか?
ここで「all」というアイコンをダブルクリックすると、ビルドができるはずなのですが…
…ビルドの結果は、あえなく撃沈!!
エラーメッセージの重要な部分を抜き出すと、以下の通りです。
- ~/hal_entry.c:53: undefined reference to `R_SCI_UART_Read'
- ~/hal_entry.c:59: undefined reference to `R_SCI_UART_Write'
- ~/hal_entry.c:53: undefined reference to `g_uart2_cfg'
- ~/hal_entry.c:53: undefined reference to `g_uart2_ctrl'
「定義されていない関数やら変数やらへの参照があります」と言っています。
これは「Hinagata」プロジェクトのディレクトリから必要なディレクトリやファイルはコピーしましたが、それらがビルドされていないことを意味します。
参照先も名前的に今回追加されたシリアル通信のドライバの関数や変数っぽいですね。
これを改修するには「OBJ_template」ディレクトリの直下にある「Makefile」を修正する必要があります。
「TOPPERS/ASP」の標準的な方法では「Make」コマンドを使用してOSとアプリケーションをビルドすることになっています。
「Make」コマンドは、ビルド対象の「Makefile」を読むことによりコンパイラのオプションや、コンパイルするべきソースコード、参照するインクルードファイルのパスなどを知ります。
したがって、今回のようにシリアル通信ドライバなど、新たに追加されたソースコードをビルドするためには「Makefile」を編集しなければなりません。
今回のエラーメッセージで表示された「R_SCI_UART_Read」などをキーワードに「asp_arduino_uno_r4_gcc-template」ディレクトリを検索すると「Makefile」に加えるべきソースコードが分かります。
その結果を踏まえ「Makefile」を以下のように修正します。
赤い部分が書き加えた箇所です。
C:\cygwin64\home\<ユーザー名>\asp_arduino_uno_r4_gcc-template\OBJ_template\Makefile
- (153行目から)
- …
- #
- # アプリケーションプログラムに関する定義
- #
- APPLNAME = main
- APPLDIR =
- APPL_CFG = $(APPLNAME).cfg
- APPL_DIR = $(APPLDIR) $(SRCDIR)/library \
- $(TARGETDIR)/ra/fsp/src/r_sci_uart
- APPL_ASMOBJS =
- ifdef USE_CXX
- APPL_CXXOBJS = $(APPLNAME).o
- APPL_COBJS =
- else
- APPL_COBJS = $(APPLNAME).o
- endif
- APPL_COBJS := $(APPL_COBJS) log_output.o vasyslog.o t_perror.o strerror.o \
- hal_data.o \
- r_sci_uart.o
- APPL_CFLAGS =
- APPL_LIBS =
- ifdef APPLDIR
- INCLUDES := $(INCLUDES) $(foreach dir,$(APPLDIR),-I$(dir))
- endif
- …
改行を意味する「¥あるいは\」にご注意ください。
つまり「APPL_COBJS」変数にビルドするべきソースコード(…というか拡張子が「.o」なのでソースコードと同名のオブジェクト)を加え(「hal_data.o」と「r_sci_uart.o」)、その上で、新たに加えられた「~/r_sci_uart」ディレクトリ(「r_sci_uart.c」の置いてある場所)を参照するように「APPL_DIR」変数に加えています。
…ちょっと面倒くさいですね。
たとえば「Visual Studio」などのリッチな統合開発環境では、プロジェクトに新しいソースコードを加える場合は全てGUIで行えるようになっていますよね?
それに比べて「Makefile」を編集しなければソースコード一つも追加できないのは、あまりにも前時代的です。
しかし、良いこともあります。
少なくとも余計なソースコードがプロジェクトに入ってしまって、プログラムサイズが大きくなったり、原因不明のバグが出てしまう可能性が減ることです。
楽は、ヒトをダメにします。
組み込みエンジニアたる者、プロジェクトに含まれるソースコードは完璧に把握しなければなりません!!
(…まあ、ぶっちゃけ不便だとは思ってます…。)
ともあれ、これで「e2 studio」の画面右側の「ビルド・ターゲット」ビューから「OBJ_template」ディレクトリ直下の「all」アイコンをダブルクリックすれば、無事ビルドが通るはずです。
今のところ「OBJ_template」では、前述したシンプルなプログラムが記述されているのみです。
次回は、これを前回のベアメタル版と同じ内容のプログラムに実装し直し、RTOSを使った利点を明らかにしていきたいと思います。
RTOS使った方がメンドイじゃん?…とか言わんといて…。
<続く>
0 件のコメント:
コメントを投稿