3
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

posted at

updated at

Organization

TOPPERS/ASP3をビルドして動かしてみる

はじめに

TOPPERSプロジェクトのトピックスに2019年12月25日にTOPPERS/ASP3カーネルの Nucleo F401RE 向け簡易パッケージを公開したことがアナウンスされていました。
以前に「TOPPERS/ASPをビルドして動かしてみるhttps://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6 )」でTOPPERS/ASPというRTOSをビルドしてマイコンボードで動作させる記事を書きましたが、今回はTOPPERS第3世代カーネルであるTOPPERS/ASP3を前回と同様にNUCLEO-F401REというマイコンボードで動くよう、Linux環境でソースからビルドするための方法をまとめました。
なお、Linux環境の大部分は前回の環境を利用できるので、そこからの変更点のみを記します。

TOPPERS/ASP3とは

TOPPERS/ASP3は、TOPPERSプロジェクト(TOPPERS:Toyohashi OPen Platform for Embedded Real-time Systems)が管理、公開しているITRON仕様のRTOSの1つです。
TOPPERS/ASPカーネルを拡張・改良したもので、TOPPERS第3世代カーネルになります。
TOPPERS/ASPからの主な変更点は以下になります。

・追加した機能
 ティックレスの高分解能時間管理
 外部時刻同期機能
 タスク終了要求機能
・削除した機能
 タスク例外処理機能
 メールボックス機能

私見では「ティックレスの高分解能時間管理」が大きな特徴で、不必要なカーネル動作を減らして、細かな時間制御が可能になります。
省電力機能の実装や、高速なマイコンを使った時のリアルタイム性の向上が望めそうです。
TOPPERSTOPPERSプロジェクトTOPPERS/ASP3の詳細は以下のページを参照してください。

・TOPPERSのページ
 https://www.toppers.jp/
・TOPPERSプロジェクトのページ
 https://www.toppers.jp/project.html
・TOPPERS/ASP3カーネルのページ
 https://www.toppers.jp/asp3-kernel.html

TOPPERS/ASP3を動かすための準備

1.マイコンボードを用意しよう

今回も、STMicroelectronics社(以下、STマイクロ)から発売されているNUCLEO-F401REというマイコンボードを使ってTOPPERS/ASP3を動かします。
https://www.st.com/ja/evaluation-tools/nucleo-f401re.html

NUCLEO-F401REはARM社のCortex-M4コアのマイコンを使ったボードです。組込み機器向けなどの展示会のSTマイクロのブースでアンケートに回答すると無料でもらえたりしますし、以下のページのような電子部品を扱う販売店で購入することもできます。
http://akizukidenshi.com/catalog/g/gM-07723/

2.ソースファイルをゲットしよう

TOPPERS/ASP3のソースファイルは以下のページからゲットできます。
https://www.toppers.jp/asp3-e-download.html#nucleo

TOPPERS/ASP系カーネルは通常、ターゲット非依存部ターゲット依存部の2つに分けて提供されますが、今回はNUCLEO-F401RE用のターゲット非依存部ターゲット依存部を結合した簡易パッケージが以下のZIPファイルで提供されています。
 https://www.toppers.jp/download.cgi/asp3_nucleo_f401re_gcc-20191220.zip

また、TOPPERS/ASP3のビルドにはコンフィギュレータTECSジェネレータが必要ですが、これらも上記の簡易パッケージに含まれています。

3.ビルド環境を準備しよう(1)

Linux環境でTOPPERS/ASP3のビルドを行いますが、今回は以前にTOPPERS/ASPのビルドで利用した環境を流用します。
TOPPERS/ASPのビルド環境がない方は、以下のページを参考にしてください。

TOPPERS/ASPをビルドして動かしてみる
https://qiita.com/Yukiya_Ishioka/items/9ecbe080939600c323c6

4.ビルド環境を準備しよう(2)

TOPPERS/ASPのビルド環境を使えばTOPPERS/ASP3のビルドも容易に行えると思っていましたが、コンフィギュレータTECSジェネレータの実行にRubyが必要なことが分かりました。
そういえば、以前にもTOPPERS/ASP3をビルドしようとしてRubyが必要なことが分かり断念したことを思い出しました。私が使ったubuntuにはRubyが入っていないのですが、今回はインストールを試みます。
試みるといっても「ubuntu」「Ruby」「インストール」で検索すればすぐに見つかりますが・・・
実施した手順を以下に記します。

1)必要パッケージのインストール
 sudo apt-get install rbenv ruby-build

2)rbenvをbashで使用可能にする
 echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

3)インストール可能なRubyのバージョンを確認
 rbenv install --list
  ※実施しなくても大丈夫

4)バージョンを指定してRubyをインストール
 rbenv install 2.1.0

インストールするRubyのバージョンはTOPPERS/ASP3のソース内にある doc/user.txt に記されていて「2.0.0」となっていましたが、インストール可能なバージョンになかったので「2.1.0」指定しました。ただし、インストール後にバージョンを確認したら別のバージョンがインストールされていました。結果としてTOPPERS/ASP3のビルドは完了したので、気にせずに進めて構わないと思います。

$ ruby --version
ruby 2.3.1p112 (2016-04-26) [i386-linux-gnu]

TOPPERS/ASPのビルド準備

1.TOPPERS/ASPカーネルのソースの展開

TOPPERS/ASP3カーネルのソースファイルasp3_nucleo_f401re_gcc-20191220.zipを任意のディレクトリに展開します。

unzip asp3_nucleo_f401re_gcc-20191220.zip

展開するとasp3_3.5ディレクトリが生成され、配下は以下のようなディレクトリ構成となります。

└ asp3_3.5
    ├── arch
    ├── cfg
    ├── doc
    ├── extension
    ├── include
    ├── kernel
    ├── library
    ├── sample
    ├── syssvc
    ├── target
    │   ├── dummy_gcc
    │   └── nucleo_f401re_gcc
    ├── tecs_kernel
    ├── tecsgen
    ├── test
    └── utils

2.アプリケーションビルド用ディレクトリの作成

asp3_3.5ディレクトリの1つ上のディレクトリへ戻り、アプリケーション用ディレクトリとアプリケーションビルド用ディレクトリを作成します。
ここではappliとしましたが、任意のディレクトリ名を付けて構いません。

cd ..
mdir -p appli/obj
├─ asp3_3.5
│   ├─arch
│   :
│
└─ appli     ←アプリケーション用ディレクトリ
     └─ obj  ←アプリケーションビルド用ディレクトリ

3.サンプルアプリケーションのコピー

TOPPERS/ASP3内に含まれるサンプルアプリケーションソースコードをappliディレクトリ配下へコピーします。
動作確認だけであればコピーは不要ですが、修正しながら動作をみたり、ユーザプログラムのベースにもなるので、コピーしておきます。

cd appli
/bin/cp -a ../asp3_3.5/sample .

4.TOPPERS/ASP3カーネルのコンフィグレーション

次にappli/objディレクトリへ移動し、カーネルのコンフィグレーションを行います。
configureコマンドのオプションの意味は以下になります。
-T:ターゲットの選択
  今回はNUCLEO-F401RE用なのでnucleo_f401re_gccを設定

cd appli/obj
../../asp3_3.5/configure.rb -T nucleo_f401re_gcc

5.Makefileの修正

カーネルのコンフィグレーションが成功するとappli/obj/Makefileが生成されます。生成されたMakefileの51行目の定義を確認してください。

TARGET = nucleo_f401re_gcc

ビルドで生成されるコードのファイルにバイナリファイルが含まれるよう435行目に $(OBJNAME).bin を追加します。

    430 #
    431 #  エラーチェック処理
    432 #
    433 .PHONY: check
    434 check: check.timestamp ;
    435 check.timestamp: cfg2_out.db $(OBJNAME).syms $(OBJNAME).srec $(OBJNAME).bin
                                                                     ~~~~~~~~~~~~~~
    436         $(CFG) --pass 3 $(CFG_KERNEL) -O $(INCLUDES) -T $(TARGET_CHECK_TRB) \
    437                                 --rom-symbol $(OBJNAME).syms --rom-image $(OBJNAME).srec
    438         @echo "configuration check passed"
    439 

サンプルアプリケーションプログラムのパス指定を変更するため181行目のAPPLDIRS定義の内容を以下の★印ように修正、追加します。

    177 #
    178 #  アプリケーションプログラムに関する定義
    179 #
★  180 APPLNAME = sample1
★  181 #APPLDIRS = $(SRCDIR)/sample
    182 APPLDIRS = ../sample

TOPPERS/ASPのビルド実行

appli/objディレクトリで makeコマンドを実行してください。
ビルドに成功するとasp.binなどTOPPERS/ASP3の実行に必要なファイルが生成されます。

$ ll asp*
-rwxrwxr-x 1 ubuntu ubuntu 510968  1月 13 17:59 asp*
-rwxrwxr-x 1 ubuntu ubuntu  26944  1月 13 17:59 asp.bin*
-rwxrwxr-x 1 ubuntu ubuntu  80892  1月 13 17:59 asp.srec*
-rw-rw-r-- 1 ubuntu ubuntu  10441  1月 13 17:59 asp.syms

マイコンボードで動かす

1.マイコンに書き込む

NUCLEO-F401REボードをUSB経由でPCと接続します。接続するとPCからはマスストレージとして認識され、エクスプローラーでファイルのコピー操作が可能となります。
次にUbuntu上でビルドにより生成された asp.binファイルをエクスプローラー経由でNUCLEO-F401REボードへコピーします。
コピーが完了するとボードへの書き込みが完了となります。

2.実行する

STマイクロのドライバをインストールすると、NUCLEO-F401REボードのUSBは仮想COMポートとしても認識されます。
TeraTermなどのシリアル端末ソフトを立ち上げ、NUCLEO-F401REボードのCOMポートを115200bpsで接続するとTOPPERS/ASPカーネルが出力するログ情報がシリアル端末ソフト上に表示され、NUCLEO-F401REボード上でTOPPERS/ASP3カーネルとサンプルプログラムが動作していることを確認できます。

TOPPERS/ASP3 Kernel Release 3.5.0 for NUCLEO(STM32F401RE:ARM Cortex-M4) (Jan 13 2020, 18:20:43)
Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
                            Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
            Graduate School of Information Science, Nagoya Univ., JAPAN

System logging task is started.
Sample program starts (exinf = 0).
task1 is running (001).   |
task1 is running (002).   |
task1 is running (003).   |
           :

上記の操作で実行した場合、appli/sample/sample1.cがユーザプログラムとしてビルドされ実行しています。sample1.cのコメントには以下のように記述されています。文字を入力すると文字コードにあった動作をログ出力で確認できます。
また、このソースコードを参考に自分で作成したプログラムも動かせます。
イロイロと試してみてください。

 *  '1' : 対象タスクをTASK1に切り換える(初期設定).
 *  '2' : 対象タスクをTASK2に切り換える.
 *  '3' : 対象タスクをTASK3に切り換える.
 *  'a' : 対象タスクをact_tskにより起動する.
 *  'A' : 対象タスクに対する起動要求をcan_actによりキャンセルする.
 *  'e' : 対象タスクにext_tskを呼び出させ,終了させる.
 *  't' : 対象タスクをter_tskにより強制終了する.
 *  '>' : 対象タスクの優先度をHIGH_PRIORITYにする.
 *  '=' : 対象タスクの優先度をMID_PRIORITYにする.
 *  '<' : 対象タスクの優先度をLOW_PRIORITYにする.
 *  'G' : 対象タスクの優先度をget_priで読み出す.
 *  's' : 対象タスクにslp_tskを呼び出させ,起床待ちにさせる.
 *  'S' : 対象タスクにtslp_tsk(10秒)を呼び出させ,起床待ちにさせる.
 *  'w' : 対象タスクをwup_tskにより起床する.
 *  'W' : 対象タスクに対する起床要求をcan_wupによりキャンセルする.
 *  'l' : 対象タスクをrel_waiにより強制的に待ち解除にする.
 *  'u' : 対象タスクをsus_tskにより強制待ち状態にする.
 *  'm' : 対象タスクの強制待ち状態をrsm_tskにより解除する.
 *  'd' : 対象タスクにdly_tsk(10秒)を呼び出させ,時間経過待ちにさせる.
 *  'x' : 対象タスクにras_terにより終了要求する.
 *  'y' : 対象タスクにdis_terを呼び出させ,タスク終了を禁止する.
 *  'Y' : 対象タスクにena_terを呼び出させ,タスク終了を許可する.
 *  'r' : 3つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
 *        ディキューを回転させる.
 *  'c' : 周期ハンドラを動作開始させる.
 *  'C' : 周期ハンドラを動作停止させる.
 *  'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
 *  'B' : アラームハンドラを動作停止させる.
 *  'z' : 対象タスクにCPU例外を発生させる(ターゲットによっては復帰可能).
 *  'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(復帰不可能).
 *  'V' : 短いループを挟んで,fch_hrtで高分解能タイマを2回読む.
 *  'v' : 発行したシステムコールを表示する(デフォルト).
 *  'q' : 発行したシステムコールを表示しない.

おまけ

サンプルアプリケーション sample1.c の動作はTOPPERS/ASP3TOPPERS/ASPと同じなので、起動時のメッセージ以外で違いは判りません。
ただ、sample1.cやsample1.cfgの中身を見ると時間の指定がマイクロ秒単位になっているので、ASP3カーネルであることが分かります。

sample/sample1.c
    188       case 'S':
    189           syslog(LOG_INFO, "#%d#tslp_tsk(10000000)", tskno);
    190           SVC_PERROR(tslp_tsk(10000000));
    191           break;
    192       case 'd':
    193           syslog(LOG_INFO, "#%d#dly_tsk(10000000)", tskno);
    194           SVC_PERROR(dly_tsk(10000000));
    195           break;
sample/sample1.cfg
     14 CRE_CYC(CYCHDR1, { TA_NULL, { TNFY_HANDLER, 0, cyclic_handler }, 2000000, 0 });

sample1.cをベースにしてタスクの切り換えや周期ハンドラ、アラームハンドラなどを自身のプログラムへ置き換えて試すことができます。
また、TOPPERS/ASPカーネルも同じボードで動作させることができるので、違いを実機で比較することも可能です。
もしここまで環境構築やビルドなどしたら、いろいろと試されてはいかがでしょうか。

- 以上 -

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
3
Help us understand the problem. What are the problem?