Edited at

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


はじめに

TOPPERS/ASPというリアルタイムOS(RTOS)NUCLEO-F401REというマイコンボードで動くよう、Linux環境でソースからビルドするための方法をビルド環境の構築からまとめてあります。自身の備忘録の意味合いが強いですが、RTOS初心者の参考になりそうなので公開してみました。


TOPPERS/ASPとは

TOPPERS/ASPは、TOPPERSプロジェクト(TOPPERS:Toyohashi OPen Platform for Embedded Real-time Systems)が管理、公開しているITRON仕様のRTOSの1つです。

TOPPERS新世代カーネルとしてワンチップマイコンで動かすことができるRTOSです。

TOPPERSTOPPERSプロジェクトTOPPERS/ASPの詳細は以下のページを参照してください。

・TOPPERSのページ

 https://www.toppers.jp/

・TOPPERSプロジェクトのページ

 https://www.toppers.jp/project.html

・TOPPERS/ASPカーネルのページ

 https://www.toppers.jp/asp-kernel.html


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


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

今回は、STMicroelectronics社(以下、STマイクロ)から発売されているNUCLEO-F401REというマイコンボードを使ってTOPPERS/ASPを動かします。

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/ASPのソースファイルは以下のページからゲットできます。

https://www.toppers.jp/asp-d-download.html

TOPPERS/ASPは多数のマイコンやマイコンボードで利用できるよう、ターゲット非依存部ターゲット依存部の2つに分けて提供されています。

今回は、以下の2つのファイルを使います。

・ターゲット非依存部

 https://www.toppers.jp/download.cgi/asp-1.9.3.tar.gz

・ターゲット依存部

 https://www.toppers.jp/download.cgi/asp_arch_arm_m4_gcc-1.9.5.tar.gz

また、TOPPERS/ASPをビルドするためにはカーネルのコンフィグレーションを行うためのTOPPERS新世代カーネル用コンフィギュレータ(コンフィギュレーションツール)が必要となるので、以下のファイルもダウンロードします。

・コンフィギュレータ Release 1.9.6

 https://www.toppers.jp/download.cgi/cfg-1.9.6.tar.gz


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

今回はLinux環境でのビルドを目指していますが、主なるPCはWindowsを使っていて、新たにLinux用のPCを用意するのは金銭やスペースの観点から厳しく、Windows上に仮想環境を用意し、そこにLinuxインストールしました。

具体的には VirtuslBoxという仮想環境用のソフトをインストールして仮想マシンを用意し、そこにLinuxのUbuntuをインストールしました。インストール方法などはここでは省略しますが、私が環境構築に使用したファイルを以下に記します。

・VirtualBoxダウンロードのページ

 https://www.virtualbox.org/wiki/Downloads

  VirtualBox 6.0.4 platform packages

  ・Windows hosts

・Ubuntuのダウンロードページ

 http://ftp.riken.jp/Linux/ubuntu-releases/xenial/

   ubuntu-16.04.6-desktop-i386.iso

ここで一番の注意点があります。

コンフィグレーションツールを正しくビルドするためには32ビット環境のLinuxが必須です。使用するUbuntuは32ビット用をダウンロードし、インストールしてください。

これを間違うとTOPPERS/ASPのビルドは成功したのにマイコンボードで動かないという状況に陥ります。


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

PC Linux上でARM Cortex-M4マイコンのビルド(コンパイルやリンク)を行うためには、クロス開発用のコンパイラなどのツールチェーンが必要となります。

LinuxのARM用ツールチェーンは「The GNU Embedded Toolchain for Arm」にバイナリが既に用意されていて以下のページからダウンロードすることが可能です。なお、ダウンロードするツールチェーンは32ビットLinux用で、以下のファイルになります。間違えないようにしてください。

・GNU Arm Embedded Toolchain: 5-2016-q3-update September 28, 2016

 gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2


ビルド環境の構築


1.パッケージの追加

Ubuntuがインストールできたら、カーネルのコンフィグレーションやSSHによるログインやファイルの送受信のため、Ubuntu起動後に以下のパッケージをインストールしてください。

sudo apt-get install g++

sudo apt-get install libboost-all-dev
sudo apt-get install openssh-server


2.ツールチェーンの展開

次にARM用ツールチェーンをUbuntu上の任意のディレクトリに展開します。私は個人でしか使用しないので、ホームディレクトリ配下にbinディレクトリを作成し、そこでダウンロードした ~.tar.bz2ファイルを展開しました。

ARM用ツールチェーンを使用する前にPATHにクロスコンパイラのパスを追加してください。

mkdir ~/bin

cd ~/bin
tar xjf gcc-arm-none-eabi-5_4-2016q3-20160926-linux,-d-,tar.bz2
export PATH=$PATH:~/bin/gcc-arm-none-eabi-5_4-2016q3/bin/


TOPPERS/ASPのビルド準備


1.コンフィグレーションツールのビルド

cfg-1.9.6.tar.gzをUbuntu上の任意のディレクトリに展開します。

展開するとcfgディレクトリが生成され配下にファイルやディレクトリが展開されます。

tar xzf cfg-1.9.6.tar.gz

cd cfg

ここで./configureを実行したいのですがconfigureファイルの改行コードが0x0d 0x0aで作成されているため、このまま実行するとエラーでコンフィグレーションに失敗します。このため、以下の操作で改行コードを0x0aのみへ変換します。

mv configure configure.org

tr -d '\r' < configure.org > configure
chmod a+x configure

変換後、以下のコマンドでコンフィグレーションツールをビルドします。

./configure

make

ビルドに成功すると以下のコマンドが生成されますが、ここではこのままで次に進みます。

./cfg/cfg     ・・・・※1


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

TOPPERS/ASPカーネルのソースファイルasp-1.9.3.tar.gzasp_arch_arm_m4_gcc-1.9.5.tar.gzを任意のディレクトリに展開します。展開するとaspディレクトリが生成され、配下は以下のようなディレクトリ構成となります。

├─asp

│ ├─arch
│ ├─cfg
│ ├─doc
│ ├─extension
│ ├─include
│ ├─kernel
│ ├─library
│ ├─pdic
│ ├─sample
│ ├─syssvc
│ ├─target
│ │ ├─dve68k_gcc
│ │ ├─stm32e407_gcc
│ │ ├─stm32f401nucleo_gcc ←※2今回使用するターゲット
│ │ ├─stm32f429board_gcc
│ │ ├─stm32f446nucleo144_gcc
│ │ ├─stm32f446nucleo64_gcc
│ │ ├─stm32f4discovery_gcc
│ │ ├─stm32l476discovery_gcc
│ │ ├─stm32l476nucleo64_gcc
│ │ └─stm32l4r5nucleo144_gcc
│ ├─test
│ ├─tools
│ └─utils

展開後、先に作成した※1のcfgコマンドを./cfgディレクトリ配下へコピーします。

mdir -p cfg/cfg

cp -a {cfgコマンドのパス}/cfg cfg/cfg/.

├─asp

│ ├─arch
│ ├─cfg
│ │ └─cfg
│ │ └─cfg ←ここにcfgコマンドをコピー
│ ├─doc


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

aspディレクトリの1つ上のディレクトリへ戻り、アプリケーション用ディレクトリとアプリケーションビルド用ディレクトリを作成します。

ここではアプリケーション用ディレクトリとしてマイコン種別が分かるよう401としましたが、任意のディレクトリ名を付けて構いません。

cd ..

mdir -p 401/obj

├─asp

│ ├─arch
│ :

└─401  ←アプリケーション用ディレクトリ
└─obj ←アプリケーションビルド用ディレクトリ


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

次に401/objディレクトリへ移動し、カーネルのコンフィグレーションを行います。

configureコマンドのオプションの意味は以下になります。

-T:ターゲットの選択

  今回はNUCLEO-F401RE用なのでstm32f401nucleo_gccを設定

  asp/target配下のディレクトリ名を指定することで他の

  ターゲットを選ぶことが可能です。

-d:実行環境の選定

  RAM以外を設定することでビルド後のコードをFlashメモリ領域に割り当てます。

cd 401/obj

../../asp/configure -T stm32f401nucleo_gcc -dROM


5.Makefileの修正

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

TARGET = stm32f401nucleo_gcc

DBGENV := TOPPERS_ROM

ビルドで生成されるコードのファイルにバイナリファイルが含まれるよう331行目の次の行に定義を追加します。

  $(OBJCOPY) -O srec -S $(OBJFILE) $(OBJNAME).srec

$(OBJCOPY) -O binary -S $(OBJFILE) $(OBJNAME).bin ←追加


TOPPERS/ASPのビルド実行

401/objディレクトリで makeコマンドを実行してください。

ビルドに成功するとasp.binなどTOPPERS/ASPの実行に必要なファイルが生成されます。

$ ll asp*

-rwxrwxr-x 1 ubuntu ubuntu 301548 3月 29 04:46 asp*
-rwxrwxr-x 1 ubuntu ubuntu 28600 3月 29 04:46 asp.bin*
-rwxrwxr-x 1 ubuntu ubuntu 85868 3月 29 04:46 asp.srec*
-rw-rw-r-- 1 ubuntu ubuntu 8125 3月 29 04:46 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/ASPカーネルとサンプルプログラムが動作していることを確認できます。

TOPPERS/ASP Kernel Release 1.9.3 for stm32f401-nucleo(Cortex-M4) (Mar 29 2019, 04:46:07)

Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
Toyohashi Univ. of Technology, JAPAN
Copyright (C) 2004-2014 by Embedded and Real-Time Systems Laboratory
Graduate School of Information Science, Nagoya Univ., JAPAN
Copyright (C) 2015-2016 by Education Working Group TOPPERS PROJECT

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

上記の操作で実行した場合、401/obj/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' : 対象タスクに例外パターン0x0001の例外処理を要求する.
* 'X' : 対象タスクに例外パターン0x0002の例外処理を要求する.
* 'y' : 対象タスクにdis_texを呼び出させ,タスク例外を禁止する.
* 'Y' : 対象タスクにena_texを呼び出させ,タスク例外を許可する.
* 'r' : 3つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
* ディキューを回転させる.
* 'c' : 周期ハンドラを動作開始させる.
* 'C' : 周期ハンドラを動作停止させる.
* 'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
* 'B' : アラームハンドラを動作停止させる.
* 'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
* 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを
* 終了する).
* 'V' : get_utmで性能評価用システム時刻を2回読む.
* 'v' : 発行したシステムコールを表示する(デフォルト).
* 'q' : 発行したシステムコールを表示しない.

次はユーザが作成したソースファイルの追加やユーザプログラムのディレクトリ構成をMakefileに反映する方法を投稿してみたいと思っています。

- 以上 -