
		TOPPERS/FMPカーネルの仕様概要

		対応バージョン: Release 1.4.0
		対応ASPカーネルバージョン : Release 1.9.1
		最終更新: 2015年1月27日

このドキュメントは，TOPPERS/FMPカーネルの仕様概要について説明したもの
である．TOPPERS/ASPカーネルに対する拡張および変更箇所を中心に説明する．

----------------------------------------------------------------------
 TOPPERS/FMP Kernel
     Toyohashi Open Platform for Embedded Real-Time Systems/
     Flexible MultiProcessor Kernel

 Copyright (C) 2005-2015 by Embedded and Real-Time Systems Laboratory
             Graduate School of Information Science, Nagoya Univ., JAPAN
 
 上記著作権者は，以下の(1)～(4)の条件を満たす場合に限り，本ソフトウェ
 ア（本ソフトウェアを改変したものを含む．以下同じ）を使用・複製・改
 変・再配布（以下，利用と呼ぶ）することを無償で許諾する．
 (1) 本ソフトウェアをソースコードの形で利用する場合には，上記の著作
     権表示，この利用条件および下記の無保証規定が，そのままの形でソー
     スコード中に含まれていること．
 (2) 本ソフトウェアを，ライブラリ形式など，他のソフトウェア開発に使
     用できる形で再配布する場合には，再配布に伴うドキュメント（利用
     者マニュアルなど）に，上記の著作権表示，この利用条件および下記
     の無保証規定を掲載すること．
 (3) 本ソフトウェアを，機器に組み込むなど，他のソフトウェア開発に使
     用できない形で再配布する場合には，次のいずれかの条件を満たすこ
     と．
   (a) 再配布に伴うドキュメント（利用者マニュアルなど）に，上記の著
       作権表示，この利用条件および下記の無保証規定を掲載すること．
   (b) 再配布の形態を，別に定める方法によって，TOPPERSプロジェクトに
       報告すること．
 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
     害からも，上記著作権者およびTOPPERSプロジェクトを免責すること．
     また，本ソフトウェアのユーザまたはエンドユーザからのいかなる理
     由に基づく請求からも，上記著作権者およびTOPPERSプロジェクトを
     免責すること．
 
 本ソフトウェアは，無保証で提供されているものである．上記著作権者お
 よびTOPPERSプロジェクトは，本ソフトウェアに関して，特定の使用目的
 に対する適合性も含めて，いかなる保証も行わない．また，本ソフトウェ
 アの利用により直接的または間接的に生じたいかなる損害に関しても，そ
 の責任を負わない．
 
 @(#) $Id: fmp_spec.txt 1214 2017-04-25 07:02:15Z ertl-honda $
----------------------------------------------------------------------

○前提となる文書

[1] トロン協会: μITRON4.0仕様, Ver.4.02.00, 2004年.

[2] トロン協会: μITRON4.0仕様 保護機能拡張（μITRON4.0/PX仕様）,
	Ver.1.00.00, 2002年.

[3] TOPPERSプロジェクト: TOPPERS/JSPカーネル ユーザズマニュアル
	Release 1.4.3対応, 最終更新: 2007年4月23日.

[4] TOPPERSプロジェクト: TOPPERS/ASPカーネルの仕様概要
	Release 1.3対応，最終更新: 2008年4月29日．

○仕様の概略

TOPPERS/FMPカーネルの仕様は，TOPPERS/ASPカーネルに対して以下のマルチプ
ロセッサシステム用の拡張機能を加えたものである．

・複数のプロセッサのサポート．
・クラスの導入．
・タスクマイグレーション機能の導入．
・タイムイベントハンドラマイグレーション機能の導入．
・スピンロック機能の導入．
・その他マルチプロセッサ向けの機能の導入
・一部機能の仕様変更

以下では，TOPPERS/ASPカーネルに対する拡張および変更箇所について説明す
る．

○複数プロセッサのサポート

FMPカーネルは複数のプロセッサで構成されているシステムをサポートする．
サポートするプロセッサ数に上限は設けない．

(1)プロセッサID

プロセッサIDは，1から連続した番号プロセッサに割り付けたものであり，プ
ロセッサを指定する必要があるシステムコールで用いる．例えばマイグレーシ
ョンAPIでのプロセッサ指定には，この番号を用いる．各プロセッサのプロセ
ッサIDは，プロセッサINDEX + 1 の値となる．共通部では，プロセッサINDEX
からプロセッサIDを取得するマクロを提供する．

(2)マスタプロセッサ

システム中の特定の1個のプロセッサを示し，起動時と終了時に他のプロセッ
サと区別して扱われる．どのプロセッサをマスタプロセッサとするかは，ター
ゲット依存で決定される．マスタプロセッサ以外のプロセッサをスレーブプロ
セッサと呼ぶ．

(3) システム状態

マルチプロセッサ対応カーネルでは，システム状態の多くをプロセッサ毎に持
つことになる．具体的には，スタンダードプロファイルにおいてプロセッサ毎
に持つ状態は，以下の通りである．

  ・実行状態のタスク
  ・カーネル動作状態と非動作状態
  ・全割込みロック状態と全割込みロック解除状態
  ・CPUロック状態とCPUロック解除状態
  ・割込み優先度マスク
  ・ディスパッチ禁止状態とディスパッチ許可状態
  ・ディスパッチ保留状態
  ・スピンロック取得状態

(4) システム時刻とそれに依存して行う処理

システム時刻の管理は，プロセッサ毎に管理するローカルタイマ方式と，シス
テム全体で一つの時間を管理するグローバルタイマ方式のどちらかを選択する．

(5) CPU例外ハンドラ

CPU例外ハンドラは，プロセッサ毎に設定する．コンフィギュレーションファ
イルにおけるCPU例外ハンドラの定義(DEF_EXC)の記述は，後述するいずれかの
クラスに属するように記述する必要がある．

(6) 割込みハンドラ/割込サービスルーチン

割込みハンドラ/割込みサービスルーチン基本的には，いずれかのプロセッサ
で受け付けるように静的に設定する．

(7) タスクスケジューリング

タスクは，いずれかのプロセッサに割り付けられている．そして，プロセッサ
毎に，そのプロセッサに割付けられたタスクに対して，優先度ベーススケジュ
ーリングを行う．

(8)プロセッサを跨いだシステムコールのサポート

オブジェクトを対象としたシステムコールは，一部を除いて，システム中の全
てのオブジェクトを対象として実行できる．

○クラスの導入

(1) クラス

マルチプロセッサに対応するために用いるカーネルオブジェクトの集合を，ク
ラス（class）と呼ぶ．

クラスは，共通の性質を持ったカーネルオブジェクトの集合であり，システム
には複数のクラスが定義されている（プロセッサ = クラスではない）．カー
ネルオブジェクトは，いずれか1つのクラスに属する．カーネルオブジェクト
は属するクラスを動的に変更することはできない．

クラスは次の属性を持ち，ターゲット依存部において，クラス毎に定義されて
いる．

  1.処理単位の初期割付けプロセッサ
    ・プロセッサIDを指定する．
  2.処理単位の割付け可能プロセッサ
    ・プロセッサIDのビットパターンを指定する
      （プロセッサIDが1のプロセッサをLSBに対応させる)
  3.カーネルオブジェクトのコントロールブロックの配置場所
    ・タスク管理ブロックの配置場所
    ・セマフォ管理ブロックの配置先指定
    ・イベントフラグ管理ブロックの配置先指定
    ・データキュー管理ブロックの配置先指定
    ・優先度データキュー管理ブロックの配置先指定
    ・メールボックス管理ブロックの配置先指定
    ・固定長メモリブロック管理ブロックの配置先指定
    ・周期ハンドラ管理ブロックの配置先指定
    ・アラームハンドラ管理ブロックの配置先指定
    ・スピンロック管理ブロックの配置先指定
  4.カーネルオブジェクトのコントロールブロック以外のメモリ領域（タスク
    スタック，データキューやメモリプール等バッファ領域の配置場所
    ・タスクスタックの配置先指定
    ・データキュー管理領域の配置先指定
    ・優先度データキュー管理領域の配置先指定
    ・固定長メモリブールバッファの配置先指定
    ・固定長メモリブロック管理ブロックの配置先指定

  5.その他の管理情報

クラスは，1から連続する正の番号で識別する．TCLS_SELF（＝0）により，呼
び出した処理単位が所属するのと同じクラスを指定することができる．

(2) オブジェクトのクラス指定

マルチプロセッサ対応カーネルでは，オブジェクトを登録する静的APIを，そ
のオブジェクトが属するクラスの囲みの中に記述する．

  CLASS(1){
    CRE_TSK(TASK1, { TA_NULL....});
    ...
  }


○ タスクマイグレーション機能

タスクは，タスクマイグレーションAPIを呼び出すことにより，プロセッサへ
の割付けを動的に変更することが可能であり，これをマイグレーションと呼ぶ．

(1) タスクマイグレーションAPI

	mig_tsk			タスクのマイグレーション
	mact_tsk		タスクのマイグレーションと起動
	imact_tsk		タスクのマイグレーションと起動（非タスクコンテキスト）

mig_tsk の対象タスクは，自タスクが割付けられたプロセッサと同一のプロセ
ッサに割り付けられたタスクに制限されている．

(2) 割付け可能プロセッサ

クラスの割付け可能プロセッサの設定により，処理単位がマイグレーションす
ることが可能なプロセッサ（割付け可能なプロセッサ）を限定することが可能
である．


○ タイムイベントハンドラマイグレーション機能

ローカルタイマ方式の場合，タイムイベントハンドラ（周期ハンドラ，アラー
ムハンドラ）のマイグレーションをサポートする．

(1) タイムイベントハンドラマイグレーションAPI

	msta_cyc		周期ハンドラのマイグレーション
	msta_alm		アラームハンドラのマイグレーション
	imsta_alm		アラームハンドラのマイグレーション（非タスクコンテキスト）

いずれのAPIもマイグレショーンのさい，タイムアウト時刻をリセットする．


○スピンロック機能

プロセッサ間の排他制御機能としてスピンロック機能を導入した．スピンロッ
クはネストして取得することはできない．

(1) スピンロックAPI

	loc_spn			スピンロックの取得
	iloc_spn		スピンロックの取得（非タスクコンテキスト）
	unl_spn			スピンロックの返却
	iunl_spn		スピンロックの返却（非タスクコンテキスト）
	try_spn			スピンロックの取得（ポーリング）
	itry_spn		スピンロックの取得（ポーリグ，非タスクコンテキスト）
	ref_spn			スピンロックの状態参照

(2) スピンロック取得状態

スピンロックを取得すると，スピンロック取得状態となる．スピンロック取得
状態中は，そのプロセッサに対する外部割込み、及びタスク切り替えを禁止と
する。


○ その他のマルチプロセッサ向けの機能

マルチプロセッサ向けの機能として以下の機能が導入された．

(1) システム状態管理機能

	get_pid			プロセッサIDの取得
	iget_pid		プロセッサIDの取得（非タスクコンテキスト）
	mrot_rdq		タスクの優先順位の回転（他プロセッサ）
	imrot_rdq		タスクの優先順位の回転（他プロセッサ，非タスクコンテキスト）

(2) システム構成管理機能

初期化ルーチンと終了処理ルーチンをそれぞれクラスに所属しないグローバル
なルーチンとクラスに所属しないローカルなルーチンに分ける．

初期化ルーチンの場合，まずマスタプロセッサでグローバル初期化ルーチンが，
実行された後，ローカル初期化ルーチンが各プロセッサで実行される．

終了処理ルーチンの場合，まずローカル終了処理ルーチンが各プロセッサで実
行された後，グローバル終了処理ルーチンがマスタプロセッサで実行される．


○一部機能の仕様変更

(1) ter_tsk

対象タスクは，自タスクと同じプロセッサに割り付けられているタスクに限ら
れる．対象タスクが自タスクと異なるプロセッサに割り付けられている場合に
は，E_OBJエラーとなる．

また，システムコールの処理時間の上限が定まらないため，使用にあたっては，
注意が必要である．

(2) ref_tsk

prcidに，対象タスクの割付けプロセッサのID番号が返される．

(3) get_utm

ローカルタイマ方式を用いている場合に，他のプロセッサのシステム時刻の現
在値を参照する機能は用意していない．

(4) CRE_CYC

グローバルタイマ方式を用いている場合で，生成する周期ハンドラの所属する
クラスの割付け可能プロセッサが，システム時刻管理プロセッサのみでない場
合には，E_RSATRエラーとなる．

(5) CRE_ALM

グローバルタイマ方式を用いている場合で，生成するアラームハンドラの属す
るクラスの割付け可能プロセッサが，システム時刻管理プロセッサのみでない
場合には，E_RSATRエラーとなる．

(6) cfg_int

CFG_INTの記述が，対象割込み要求ラインに対して登録された割込みサービス
ルーチン（または対象割込み番号に対応する割込みハンドラ番号に対して登録
された割込みハンドラ）と異なるクラスの囲み中にある場合には，E_RSATRエ
ラーとなる．

(7) def_inh

登録する割込みハンドラの属するクラスの初期割付けプロセッサが，その割込
みが要求されるプロセッサでない場合には，E_RSATRエラーとなる．

(8) def_exc

登録するCPU例外ハンドラの属するクラスの初期割付けプロセッサが，そのCPU
例外が発生するプロセッサでない場合には，E_RSATRエラーとなる．

(9) DEF_ICS

非タスクコンテキスト用スタック領域はプロセッサ毎に確保する必要がある．
DEF_ICSにより設定する非タスクコンテキスト用スタック領域は，非タスクコ
ンテキスト用スタック領域が属するクラスの初期割付けプロセッサが使用する．
そのプロセッサに対してすでに非タスクコンテキスト用スタック領域が設定さ
れている場合には，E_OBJエラーとなる．

(10) ATT_INI

クラスに属さないグローバル初期化ルーチンはマスタプロセッサで実行され，
クラスに属するローカル初期化ルーチンはそのクラスの初期割付けプロセッサ
により実行される．

(11) ATT_TER

クラスに属さないグローバル終了処理ルーチンはマスタプロセッサで実行され，
クラスに属するローカル終了処理ルーチンはそのクラスの初期割付けプロセッ
サにより実行される．

○ オブジェクトの配置場所指定

以下に示すカーネル内のデータ構造の配置場所を指定することが可能である．
指定は，ターゲット依存部のコンフィギュレータテンプレートファイルで行う．

・プロセッサコントロールブロック
・非タスクコンテキスト用スタック
・タイムイベントヒープ
・タイムイベントコントロールブロック

以上
