統合仕様書とカーネルのバージョンアップについて

## 統合仕様書とカーネルの最新版のリリース

12月23日付けで，TOPPERS第3世代カーネル（ITRON系）統合仕様書と，TOPPERS/ASP3カーネル，TOPPERS/HRP3カーネル，TOPPERS/HRMP3カーネルの最新版をリリースしました。

これらをまとめてリリースするのは，前回の2019年10月以来，1年2ヶ月ぶりになります。その間，TOPPERS第3世代カーネルの開発は，JAXAの次世代宇宙機向けマイクロプロセッサに採用が決まっているHRMP3カーネル（→[プレス発表](https://www.toppers.jp/press/release-1911-02.pdf "TOPPERS/HRMP3カーネルがJAXAの次世代宇宙機向けマイクロプロセッサに採用")）を中心に進めてきました。HRMP3カーネルについては，長期サポートバージョン（機能を固定して，品質向上のための修正のみを行うバージョン）のバグフィックスを今年の3月と11月にもをリリースしていますが，今回リリースするのは，機能拡張が加わったバージョンになります。

そのため，ASP3カーネルとHRP3カーネルの修正は，HRMP3カーネルの改良・機能拡張に伴うものがほとんどで，特にASP3カーネルについては，機能拡張は行っておらず，大きな不具合も出ていないことから，機能改善や実装改善が中心になっています。

これらの具体的な変更内容については，統合仕様書については仕様書内のA.6節を，各カーネルについてはカーネル内のdoc/version.txtを参照していただくことにして，ここでは統合仕様書やカーネルの変更時にどのような作業を行なっているかについて紹介したいと思います（読みやすくするために，実際に行った作業を少し簡略化しています）。

## 統合仕様書の変更作業

ここでは，今回のリリースで仕様変更になった項目の1つとして，割込みサービスルーチン（ISR）を実行するプロセッサに関する仕様変更を取り上げ，それに伴う変更作業を説明していきたいと思います。

この仕様変更は，[TECS](https://www.toppers.jp/tecs.html "TECSのウェブページ")でHRMP3カーネルをサポートする際に不都合が生じたことから行ったもので，「割込みを複数のプロセッサで受け付けることができないターゲットシステムでは，ターゲット定義で，割込みサービスルーチンは，属するクラスの初期割付けプロセッサのみで実行されるものとする」という規定を追加することになりました。

統合仕様書では，このような規定には，トレーサビリティのための要求タグを付与しています。この追加規定には，「NGKI0656」という要求タグをつけたのですが，要求タグを重複なく採番するために，要求タグの管理表（tag_list.txt）を作成しています。管理表におけるNGKI0656に関する記述は以下のようになっています。

```
NGKI0656：(a)〔3M〕
```

この管理表には，使用している要求タグはもちろん，過去に使っていて廃止になった要求タグや何らかの理由で欠番としている要求タグも管理しています。また，タグの種別や適用仕様についても管理しており，上の(ad)はタグの種別を，〔3M〕は第3世代カーネルのマルチプロセッサ対応カーネルにのみ適用されることを示しています。

仕様を変更した場合には，「付録A バージョン間の差分」に，そのことを記載します。このケースでは，以下の記述を追加しました。

```
・割込みサービスルーチンを実行するプロセッサに関する仕様を変更

	NGKI0656〔M〕	追加
```

さらに，統合仕様書の表紙に書かれている最終更新日も更新しています。

## HRMP3カーネルの変更作業

HRMP3カーネルのARM依存部は，現時点では，割込みを複数のプロセッサで受け付ける機能に対応していません（ハードウェアは対応していますが，テストが難しいため，現時点では非対応です）。そのため，NGKI0656が適用され，変更が必要になります（この変更を行うために，統合仕様書から変更したのでした）。

この変更は，コンフィギュレータの振る舞いを記述した生成スクリプトの変更により対応できますが，そのターゲット依存部だけで対応することができなかったため，まず，割込みに関する静的APIを処理するためのターゲット非依存部の生成スクリプト（kernel/interrupt.trb）を変更しました。また，生成スクリプトのターゲット依存部（具体的には，割込みコントローラ依存部。arch/arm_gcc/common/gic_kernel.trb）も変更しました。ソースコード中には，この追加仕様に対応するコードであることを示すために，コメントにNGKI0656を記載しておきます。

言うまでもなく，これらの変更を行った後，期待通りに動作するかのテストを行います。現在，コンフィギュレータのターゲット依存の振る舞いをテストするテストケースを用意する枠組みがないため，この変更に伴っては実施しませんでしたが，通常は，テストケースの変更や追加が必要になります。

ソースコードの変更・テストを行った後は，ドキュメントの変更が必要になります。この変更では，ターゲット非依存部を変更したため，ポーティングガイド（doc/porting.txt）の変更が必要になります。また，ARM依存部のユーザーズマニュアル（arch/arm_gcc/doc/arm_user.txt）に，NGKI0656の規定が適用されること（実際には，ユーザにわかりやすい説明をしています）を記述しました。これらのドキュメントを変更するたびに，ファイルの先頭に記載してある最終更新日も更新します。

最後に，HRMP3カーネルの変更履歴（doc/version.txt）に，以下の記述と，ターゲット依存部を変更する必要がある旨の記述を追加しました。

```
・割込みサービスルーチンを実行するプロセッサに関する仕様変更に対応
	- 割込み要求ライン初期化ブロックのaffinityフィールド（割付け可能プ
	  ロセッサ）に生成する情報を，対応するDEF_INHがある場合，対応する
	  CRE_ISRがある場合，どちらもない場合で変えるように変更．
	- CFG_INTに関するエラーチェックを，2回に分けて実施．
	- [ARM依存部] 割付け可能プロセッサが複数あるクラスの囲み内に
	  CRE_ISRやCFG_INTを記述した場合には，コンフィギュレータが警告メッ
	  セージを出し，クラスの初期割付けプロセッサのみで割込みを受け付け
	  るように設定するように変更．
```

この変更では，変更したソースコードの行数と，変更したドキュメントの行数が，どちらも30〜40行程度と，ほぼ同等になりました。

## 他のカーネルへの影響

ここで例にあげた仕様変更は，マルチプロセッサカーネルに対する仕様の変更であったため，FMP3カーネルの変更も必要になります。

さらに，変更内容によっては，ASP3カーネルやHRP3カーネルの変更が必要になることもあります。ASP3カーネルやHRP3カーネルには拡張パッケージがあるため，拡張パッケージの変更も必要になる場合があります。

以上のように，ちょっとした仕様変更であっても，変更が必要となるファイルはかなりの数になります。かなりの手間がかかりますが，品質の高いリアルタイムカーネルをお届けするためには，必要な作業であると考えています。ただし，機械的な作業については，もっと自動化を進めたいと考えています（一方で，自動化した場合にミスを見逃さないかという心配はあります）。