TOPPERS/ATK2カーネル向け実機レス環境(athrill2)

#はじめに
本記事は，[2018年TOPPERSコンテスト](https://www.toppers.jp/contest.html)向けに提出した作品をqiita向けに再編集したものです(※)．
(※)みごと，金賞いただきました！ありがとうございます．

なお，本記事の最後の節で，「[TOPPERSコンテスト参加する意義について](https://qiita.com/kanetugu2018/items/75dadc340f3db2a344ab#toppers%E3%82%B3%E3%83%B3%E3%83%86%E3%82%B9%E3%83%88%E5%8F%82%E5%8A%A0%E3%81%99%E3%82%8B%E6%84%8F%E7%BE%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6)」まとめてみました．

#概要
本サイトで，TOPPERS/ATK2カーネル向け実機レス環境を開発状況を広報しようと考えています．
現時点では，以下のAUTOSAR/OSスケーラビリティクラスに対応可能な実機レス環境に対応しています．

- SC1(保護なし，シングルコア)
- SC1-MC(保護なし，マルチコア)
- SC3(メモリ保護あり，シングルコア)

上記の動作確認用に，サンプルプログラムをあわせて提供しています(※)．
(※) SC1/SC1-MCはOS移植し，SC3はサンプル確認プログラムを作成しています．


#AUTOSAR開発で実機レス環境を利用する際の課題

AUTOSAR普及が進む中，車載向け開発においても，机上で全体結合・動作確認できる実機レス環境は，問題の早期検出を可能にするだけでなく，ソフトウェア保守の視点(リグレッション確認)からもそのニーズは高いと思います．
 
一方で，実機レス環境の課題としては，以下が挙げられます．

##既製の実機レス環境を利用する場合
開発資金・期間が潤沢にあれば，既製品を使用することで実機レス環境を使用する効果は十分に享受できますが，一般的に実機レス環境は高額になりえるため，少なくとも以下に示す課題があると思います．

|No.|	分類|	課題|
|---|---|---|
|1|導入コスト|実機レス環境は高額(数百万～)．|
|2|スケーラビリティ|既製の実機レス環境を利用する場合は，ライセンス制約により開発をスケールさせることができない可能性が高い．|
|3|サポート|環境面で未対応機能等がある場合は個別サポートが必要となる．|

##OSSの実機レス環境を利用する場合
代わって，OSS環境の場合はライセンス制約もなく，自社固有の機能改修等が可能となりますが，以下に示す課題が残ります．

|No.|	分類|	課題|
|---|---|---|
|1|導入コスト|OSS環境の場合は，マニュアル等が整備されていない場合もあり，ソース/ビルド/使用方法の理解に時間がかかる可能性がある．| 
|2|車載向けCPUアーキ|既存のOSS・実機レス環境としてQEMU/Skyeye等あるが車載向けCPUであるV850/RH850は未対応である．|
|3|AUTOSAR/OSスケーラビリティクラス|AUTOSAR/OSスケーラビリティクラスはSC1～SC4と幅広くあり，すべてのクラスに対応した実機レス環境は存在していない(athrillはSC1までしか対応しきれていない)．|

#提案内容
2017年に提案させて頂いた車載向けOSS・実機レス環境であるathrillは，AUTOSAR向けの環境としては不十分です．よって，TOPPERS/ATK2カーネル向け実機レス環境として，先述の課題に対してathrillをバージョンアップしたathrill2を新たに提案します．

以下，athrillの課題に対して対応した内容です．

##1. オープンソース導入コストの問題
まずは，[athrill機能マニュアル](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)を整備しました．

##2. 車載向けCPUアーキ未対応問題
athrill CPUのバージョンをアップしました(v850e1 ⇒ v850e2v3)．

本バージョンアップによるathrill2のCPU命令実装率は以下の通りです(未サポート命令は下図を参照)．

|CPUアーキ|命令数|実装数|実装率|
|---|---|---|---|
|V850(v850e2v3)|132|127|96.2%|
|RH850(v850e3v5)|146|127|87.0%|

※()内のバージョン表記は， gccのターゲット・プロセッサオプション(-m)で指定するものです

RH850(v850e3v5)は上位互換を保証していますから，v850e2v3の命令実装率を上げることで，RH850の命令実装率も必然的に上がり，athrill2のCPU命令はRH850に極めて近くなります． 

## 3. AUTOSAR/OSスケーラビリティクラス
v850e2/mn4のハードウェア仕様をベースにして，athrillのコア数拡張(2コア)，メモリ保護機能を追加しました．本対応でサポート可能となるスケーラビリティクラスは以下の通りです(詳細は次章を参照)．

- SC1(保護なし，シングルコア)
- SC1-MC(保護なし，マルチコア(2コア))
- SC3(メモリ保護あり，シングルコア)

athrill2の未サポート命令は以下の通りです．

|命令フォーマット|V850(v850e2v3)|RH850(v850e3v5)|
|---|---|---|
|1|SYNCE, SYNCM, SYNCP|SYNCI, DBTRAP|
|2|CALLT|－|
|7|－|LOOP, Bcond, ROTL, LDL.W, STC.W|
|9|－|BINS|
|10|CTRET|SNOOZE|
|11|－|PUSHSP, POPSP, JARL|
|14|－|LD.DW, ST.DW|

#athrill2のAUTOSAR/OSスケーラビリティクラス適応
先述の通り， v850e2/mn4のハードウェア仕様をベースにして，athrillのコア数拡張(2コア)，メモリ保護機能を追加します．本対応により，athrill2が以下のAUTOSAR/OSスケーラビリティクラスに適応できるようにすることが今回の目標となります．

- SC1(保護なし，シングルコア)
- SC1-MC(保護なし，マルチコア(2コア))
- SC3(メモリ保護あり，シングルコア)

上記目標に対して，今回提案するathrill2がどの程度AUTOSAR/OSスケーラビリティクラスに適応できたかを客観的に確認できるようにするため，TOPPERS/ATK2の公式サイトで公開されている「[次世代車載システム向けRTOSハードウェア要求仕様書 Ver.3.0.1](https://www.toppers.jp/docs/tech/ngka_req-02-301.pdf)」を参照し，athrill2のハードウェア要求仕様準拠率を調査しました．

本調査の結果概要は下図のとおりで，最小要求(MR)はほぼ満たしていることがわかりました．

|スケーラビリティクラス|MR(最小要求)|SR(標準要求)|AR(性能改善要求)|
|---|---|---|---|
|SC2|100%(2/2)|50%(1/2)|0%(0/1)|
|SC3|100%(10/10)|50%(1/2)|0%(0/2)|
|SC1-MC|100%(5/5)|67%(6/9)|17%(1/6)|
|SC2-MC|80%(4/5)|9%(1/11)|14%(1/7)|
|SC3-MC|100%(6/6)|64%(7/11)|13%(1/8)|

※()内の値は，「要求準拠数/要求数」です．

一方，SR(標準要求)/AR(性能改善要求)についての網羅度は低い結果となっています．これらの要因については，以下に見解を示しますが，今回目標とする機能範囲(SC1, SC1-MC(2コア), SC3)の実機レス環境を提供するという点では問題ではないと判断しています． 

|HW要素|要件レベル|要件番号|対応SC|サポート対象|見解|
|---|---|---|---|---|---|
|タイマ|MR|HW023|SC2-MC|×|SC2は今回未サポート．athrill2のタイマ数拡張の技術的難易度は低い． |
|コア間排他制御機構|SR,AR|HW005,HW008|SCx-MC|×|コア数が3以上の場合に必要となる要件．athrill2のコア数拡張の技術的難易度は低い．|
|メモリ|SR,AR|HW012,HW013,HW014|SCx-MC|〇|athrill2はローカルメモリ/プライベートメモリを仮想化対象としない方針としている．理由は，本機能をサポートしなくても性能的なデメリットは発生しないためである．|
|キャッシュ|SR|HW015|SCx-MC|〇|athrill2はキャッシュメモリを仮想化対象としない方針としている．理由は，本機能をサポートしなくても性能的なデメリットは発生しないためである．|
|タイマ|SR|HW024,HW026,HW027,HW028|SC2,SC2-MC|×|ノンマスカブル割り込みでのタイマ割り込み発生機構はSC2対応時に検討する予定．|
|MPU|SR,AR|HW039,HW040|SC3,SC3-MC|×|athrill2のメモリ保護機構をマルチコア向けに拡張する際に，保護領域設定機能拡張を実施する予定．|
|コアID|AR|HW010|SCx-MC|〇|マルチコアOS実装の性能改善要件であり，実機レス環境機能実現する上でMUST要求ではないと判断．|
|割り込み|AR|HW019|SCx-MC|〇|↑|
|MPU|AR|HW041|SC3,SC3-MC|〇|MPUのOS実装に対する性能改善要件であり，実機レス環境機能実現する上でMUST要求ではないと判断．|

#athrill2の動作環境およびインストール方法
athrill2の動作環境およびインストール方法はathrillと同じです．

|項目|参照サイト|
|---|---|
|動作環境|https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97#%E5%8B%95%E4%BD%9C%E7%92%B0%E5%A2%83|
|事前準備|https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99|
|インストール方法|https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97#%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E6%96%B9%E6%B3%95|
|インストール確認方法|athrill2を空打ちして以下のメッセージが出力されることを確認する![athrill2.png](https://qiita-image-store.s3.amazonaws.com/0/244147/f80284e6-9135-f802-e3af-91f55932d6b8.png)|


#動作確認
athrill2がサポート対象とするスケーラビリティクラスの動作確認を行いました．

|スケーラビリティクラス|動作確認内容|
|---|---|
|SC1|TOPPERS/ATK2-SC1をathrill2向けに移植し，サンプルプログラムの動作確認を行う．|
|SC1-MC|TOPPERS/ATK2-SC1-MCをathrill2向けに移植し，サンプルプログラムの動作確認を行う．|
|SC3|SC3のハードウェア要件を満たしていることを確認できるサンプルプログラムを作成し，動作確認を行う※．|

※TOPPERS/ATK2-SC3の移植は時間的な余力がなかったため，別の機会で行う予定です．お楽しみに．

##SC1
SC1の動作確認内容を以下に示します．

|項目|内容|確認結果|
|---|---|---|
|プログラム配置場所(github)|https://github.com/tmori/athrill/tree/master/sample/os/atk2-sc1_1.4.2/OBJ|－|
|athrill2 CPU設定|100MHz|－|
|OSハードウェアカウンタ設定|10ms/clock|－|
|動作確認[1]|atk2-sc1のカーネル起動|OK|
|動作確認[2]|周期アラームコールバック起動確認(500ms周期)|OK|
|動作確認[3]|アラーム実行をキャンセル|OK|
|動作確認[4]|タスク起動確認(Task3)|OK|

上記の動作確認結果詳細については，以下のサイトを参照ください．

https://qiita.com/kanetugu2018/items/d07dac56c4f57ce10f65

##SC1-MC
SC1-MCの動作確認内容を以下に示します．

|項目|内容|確認結果|
|---|---|---|
|プログラム配置場所(github)|https://github.com/tmori/athrill/tree/master/sample/os/atk2-sc1-mc_1.4.2/OBJ|－|
|athrill2 CPU設定|100MHz|－|
|OSハードウェアカウンタ設定|10ms/clock|－|
|動作確認[1]|atk2-sc1-mcのカーネル起動|OK|
|動作確認[2]|周期アラームコールバック起動確認(500ms周期)|OK|
|動作確認[3]|アラーム実行をキャンセル|OK|
|動作確認[4]|タスク起動確認(core0のTask1からcore1のTask9を起動)|OK|

上記の動作確認結果詳細については，以下のサイトを参照ください．

https://qiita.com/kanetugu2018/items/b43c5715124f42a0393d#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%83%90%E3%82%A4%E3%83%8A%E3%83%AA%E3%82%92%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B

##SC3
SC3の動作確認内容を以下に示します．

|項目|内容|確認結果|
|---|---|---|
|プログラム配置場所(github)|https://github.com/tmori/athrill/tree/master/sample/athrill2/mputest2|－|
|athrill2 CPU設定|100MHz|－|
|メモリ保護構成|カーネル領域：１個(コード/データ)，ユーザ領域：２個(コード/データ)，ユーザ共有領域：１個(データ)(領域割り当ておよびアクセス権設定詳細は，下図を参照)|－|
|動作確認[1]|非特権モード(USER1)で，自領域およびユーザ共有領域のみ読み書きおよび命令実行可能であることを確認する．カーネル領域および別ユーザ領域(USER2)の領域については，読み書き/命令実行を行うと，CPU例外が発生することを確認する．|OK|
|動作確認[2]|非特権モード(USER2)で，自領域およびユーザ共有領域のみ読み書きおよび命令実行可能であることを確認する．カーネル領域および別ユーザ領域(USER1)の領域については，読み書き/命令実行を行うと，CPU例外が発生することを確認する．|OK|
|動作確認[3]|特権モードで，全領域の読み書きおよび命令実行可能であることを確認する．|OK|

![pict.png](https://qiita-image-store.s3.amazonaws.com/0/244147/43a86c05-53c8-3686-ed87-88dc3811be05.png)


上記の動作確認結果詳細については，以下のサイトを参照ください．

https://qiita.com/kanetugu2018/items/ea7069ac2b9530261f16


#TOPPERSコンテスト参加する意義について
TOPPERSコンテストは昨年から応募させて頂いています．
今年で２回目です．昨年は運よく「金賞」を受賞させて頂きました．

コンテスト受賞してから，ほそぼそと外部発信を続けていたのですが，ここ最近，ほんとうに自分の環境や考え方が変わったなと思います．以下，ポイントをまとめておきますので，機会があればTOPPERSコンテスト参加されることをお勧めします．

* 外部発信効果
 * 自分が応募した作品(athrill)をTOPPERSの名前の下で紹介できるようになりますから，
 * 個人活動ではなく，コミュニティ活動として認知してもらえます．
 * ⇒初めて聞く人への説得力が違います！
* コミュニティ仲間
 * TOPPERSイベントにはときどき参加していましたが，
 * コンテスト受賞を契機につながりが一気に広がりました．
 * また，athrillつながりで，TOPPERS会員の方と話が盛り上がったりして，
 * とても楽しい時間をすごせるようになりました．
* ストレス解消効果
 * 会社の中に閉じこもっていると，人間関係などで，いろいろとストレスがたまるものですが，
 * コミュニティ仲間の人たちとのつながりが増えて，別次元での見え方ができるようになり，
 * あまり会社の世界観だけにこだわらなくなりました． 
* アイディア
 * 自分の趣味の活動(athrill開発)を仕事だけでなく，コミュニティを絡めて考えるようになりました．
 * 結果として，考える幅がひろまったような気がします．
* 気合がはいる
 * 純粋に，自分のアイディアを第三者に評価していただける良い場所になっています．
 * 今年も，「やったろかい！」と気合入れて応募しました．

最後に，TOPPERSコミュニティの方々には大変感謝しております．これからもよろしくお願いいたします．

#関連記事
* [athrill(アスリル) を使用して TOPPERS OS(ASP3) をデバッグ](https://qiita.com/kanetugu2018/items/1f2ef93c9e1fa7a29f97)
* [マルチコア対応仮想環境(athrill)を使用して TOPPERS/ATK2 を実行する](https://qiita.com/kanetugu2018/items/b43c5715124f42a0393d)
* [メモリ保護対応版 athrill(アスリル) のご紹介](https://qiita.com/kanetugu2018/items/f2205475c4a4eae699c0)
* [今さらなぜCPUエミュレータを自作しようとおもったのか？](https://qiita.com/kanetugu2018/items/d692e612c3d4d715c0ad)
* [athrill(アスリル)を使用してC言語ポインタ変数を理解する](https://qiita.com/kanetugu2018/items/b9ad84c2f74324174864)
* [athrill(アスリル)機能マニュアル](https://qiita.com/kanetugu2018/items/cf3dea16710a3f0737e8)
* [athrill(アスリル) を使用してベアメタル・プログラミング(１回目：main関数が動き出すまで)](https://qiita.com/kanetugu2018/items/7d2ce8def53cb9bda06b)
* [athrill(アスリル) を使用してベアメタル・プログラミング(2回目：割り込みがソフトウェアに通知されるまで)](https://qiita.com/kanetugu2018/items/8cb411717511ca96bc64)
* [WSLでマイコンシミュレータ環境(athrill)をつくる](https://qiita.com/Maeda-Shoota/items/4b1be75a6c4993522ab1)
* [64bitCPUへの道 and/or 64歳の決意(1)V850/RH850 gcc 64bit](https://qiita.com/kaizen_nagoya/items/9934c0f9911ad29779b5)
* [dockerでathrill](https://qiita.com/kaizen_nagoya/items/599ccdd07276aae5d29e#_reference-457dd5318af4f84ad2d2)