TOPPERS/FDMPKernel ドキュメント

1.0

TOPPERS-FDMP(Function Distributed Multi Processor) カーネル
  • はじめに
    • 本カーネルは,JSP 1.4.1 をベースに機能分散マルチプロセッサに 拡張したものである. -
      TODO:
      検討点(未解決もくは未決定)
  • 方針
    • プロセッサ毎のディレクトリをどう管理するか -> 出来るだけプロセッサ毎にはシステム依存部は分けない方針 ->OMAPレベルのヘテロの場合は別途検討
    • プロセッサ間割込み カーネル外なのか? カーネル内なのか? ipi_initialize(VP_INT exinf)kernel_start()から呼ぶべきか? それともATT_INI()で呼び出すべきか? ->こだわりなし

  • FDMP動作アーキテクチャ
    • FDMPを動作させるためには,以下のアーキテクチャを満たす必要がある
      • 各プロセッサのデータ(rodataも含む)を置くローカルメモリが お互いにアクセス可能.ローカルメモリは全てのプロセッサから 見て同じアドレスでアクセスできる必要がある.
      • 任意のプロセッサに割込み(プロセッサ間割込み)を発生可能
      • プロセッサ間での排他制御のための機構及びその機構を用いて ロックをプロセッサ数x2個作成可能であること.ただし2個でも 動作は可能.
        • 例 : test & set 命令, Mutex 回路

  • カーネル構築方法
    • シングルプロセッサと異なる点についてのみ説明する.
    • CFGファイルを用意する.
    • FDMP用のコンフィギュレータを実行する.実行により各プロセッサ毎に プロセッサ名でオブジェクト生成用のディレクトリ(プロセッサディレ クトリ)が生成されて以下のファイルが生成される. class_id.h, kernel_id.h, kernel_cfg.c
    • class_id.h(クラスIDファイルファイル)には,クラスID付きのオブジェ クトIDが定義されている. 例えばPE1のTASK1というタスクをPE1以外からアクセスするには, class_id.h をインクルードし,PE1_TASK1というIDでAPIを実行すれば よい.
    • 各プロセッサのプロセッサディレクトリで make depend を実行して 依存関係ファイルを生成した後,make を実行してカーネルオブジェ クトを生成する.
    • カーネルモデル
      • 基本モデル(ローカルクラスのみ) モデルの拡張性を保持するため,クラスコントロールブロックを用いる モデルは残しておく.

  • タスク状態不整合問題
    • ロック/ディスパッチ禁止状態で実行中のタスクに対してsus_tsk/ter_tsk が発行された場合の振る舞い(セマンティクス)を決定.
    • 仕様
      • sus_tsk(ID tskid)
        • CPUロック/ディスパッチ禁止中のタスクに対してsus_tsk()を発行す ると,タスクは一時的に過渡的な状態(run-suspend)になる.
      • ter_tsk(ID tskid)
        • CPUロック/ディスパッチ禁止中のタスクに対してter_tsk()を発行 すると,タスクは一時的に過渡的な状態(run-terminated)になる.
    • 実装方法
      • ter_tskを発行したことを示すterflgをTCBに追加.
      • ret_intではこのフラグをチェックして,TRUEだとコンテキストを 保存せずにディスパッチャーに飛ぶ. ret_intでチェックするのは以下の二つの理由からである. 1. CPUロック解除時に,ter_tsk()の処理の結果,発行されたプロ セッサ間割込みが有効になるためである. 2. 割込みハンドラ実行時(runtskより優先度が高い)に,ter_tsk() が発行される可能性がある.
      • terflgのクリアはactivate_rで行う.
      • activate_context()はスタックをつぶさないように変更
      • sus_tsk対象タスクがruntskかつenadspがFALSEなら,割り込みを 発行しないようにすると無駄な割り込みを防げる.
    • sus_tsk(ID tskid)の検討
      • CPUロック状態の runtsk に発行
        • 特に対策の必要はなし
        • sus_tsk()の実行後,プロセッサ間割り込みを発生する
        • CPUロック中はAPIが発行できない。
        • CPUロックを解除した時点で割り込みを受け付ける
        • タスクの状態はsuspendに移行しているため,rsm_tsk()は正しく 動作する.
      • ディスパッチ禁止状態の runtsk に発行
        • 特に対策の必要はなし
        • sus_tsk()実行後,プロセッサ間割り込みを発生する
        • 割り込みは許可されているので、割り込みルーチンに入りるが, ディスパッチ禁止中のため,何もせずにリターン.
        • ena_dsp()が実行されると,ディスパッチを行う.ena_dsp()の 中でタスクロックをとるため,sus_tsk()とのレーシングは発生 しない.
        • タスクの状態はsuspendに移行しているため,rsm_tsk()は正しく 動作する.
      • APIの発行
        • CPUロック状態では,自タスクを待ち状態にするAPIは発行できない. いいかえると,自分の状態は変更できない.そのため,API発行は 問題ない.また,ext_tsk()は原則エラーだが,TOPPERSではワー ニングにして処理.
    • ter_tsk(ID tskid)の検討
      • CPUロック状態の runtsk に発行
        • 特に対策の必要はなし
        • CPUロック解放時点でプロセッサ間割り込みが入りディスパッチが 発生する.
        • 一般にタスクを初期化してしまい,スタックを壊す可能性がある. ただし、スタックを壊さないように修正することは可能.
      • ディスパッチ禁止runtsk に発行
        • 特に対策の必要はなし
      • APIの発行
      • terflgセットはディスパッチ要求(プロセッサ間割込み)の発行前に行うこと
        • 逆にすると,プロセッサ間割込みの出口のret_intで,terflgを見落とす 恐れがある.

  • デットロック回避
    • 対象API
    • TCBへの追加エントリ
      • BOOL pend_tertsk : ter_tsk(ID tskid) 実行中を表す
      • BOOL pend_chgpri : chg_pri(ID tskid, PRI tskpri)実行中を表す.
      • BOOL pend_relwai : タスクの待ち解除実行中を表す
      • UINT pend_newpri : 優先度変更保留の新優先度(内部表現)
    • タイムアウト(wait_tmout(TCB *tcb))
      • 再ロック後に待ちでなければ何もしなくてもよい.タイムアウト処理は 対象タスクと同一プロセッサで動作しているので,対象タスクはこの間 に動作せず,他のオブジェクト待ちになることはない.
    • rel_wai(ID tskid)
      • 再ロック後に,対象タスクが別の待ちオブジェクトに対して待ち状態 になっていれば,何もせずにE_OBJを返す.同じ待ち状態なら待ちを 解除してE_OKを返す.
    • chg_pri(ID tskid, PRI tskpri)
      • 最初のロックでnewpriをTCBに登録してロックを開放.他のルーチンで の待ち状態解除時にはnewpriを見て優先度を変更.再ロック後にnewpri の値が有効なら同じ待ちのはずなので通常の優先度変更を行う.
    • ter_tsk(ID tskid)
      • 最初のロックでTCBのpend_tertskをTRUEにしてロック開放.待ち状態解 除時にはpend_tertskを見てTRUEならタスク終了処理.再ロック後に pend_tertskがTRUEなら同じオブジェクトに対する待ちのはずなので通 常のタスク終了処理を行う.
    • pend_tertsk/pend_chgpri/pend_relwaiをチェックするタイミング

  • コーディングの際の注意点
    • NESTED_LOCK使用時の注意点
      • XXX_NESTED_LOCK()は,T_ACQUIRE_LOCK()との間をリトライで 繰り返し実行するため,この間は非破壊コードでなければならない.

  • プロセッサ間割込み
    • 他のプロセッサに対してのディスパッチ要求はプロセッサ間割込みにより 実現する.
    • 関連ファイル
    • 関数

  • CCB/EXCCB
    • CCBの内容
      • INIT prcid
      • LOCKOBJ tsk_lock
      • LOCKOBJ obj_lock
      • QUEUE *p_ready_queue;
      • UINT *p_ready_primap;
      • TCB **p_runtsk;
      • TCB **p_schedtsk;
      • BOOL *p_enadsp;
      • TMEVTN *p_tmevt_heap;
      • UINT *p_last_index; タイムイベントヒープのインデックス
      • CBTCB tsk;
      • CBTCB sem;
      • CBTCB flg;
      • CBTCB dtq;
      • CBTCB mbx;
      • CBTCB mpf;
      • CBTCB cyc;
      • FP p_activate_r;
      • FP p_call_cychdr;

CCBの登録内容の初期化 EXCCBは各モジュールの初期化ルーチン(xxx_initialize())で初期化される. その後,EXCCBからCCBにコピーが行われる.

  • ターゲット依存部
    • ターゲット依存部の多くはJSPカーネルと共通である.ここでは,JSPカー ネルのターゲット依存部をFDMPカーネルに流用するための情報として,Nios2 における,JSPカーネルとFDMPカーネルのターゲット依存部の相違点ついてま とめる.
    • cpu_config.h : 変更
      • init_tsk_lock() : 追加 戻り値はEXCCBの tsk_lock_ptr に登録される
      • init_obj_lock() : 追加 戻り値はEXCCBの obj_lock_ptr に登録される
    • cpu_context.h : 変更
    • cpu_support.S : 変更 ret_int ret_exc TCBのterflgをチェックして,trueならばディスパッチャーに飛ぶ activate_r スタックからではなく,tinibからtaskやexinfを取得するように変更 タスク例外のチェックコード call_texrtn から dispatch_call_texrtn に変更
    • makeoffset.c : 変更 terflg, tinib, task, exinf のオフセットを取得するように変更
    • nios2.h Mutexの定義とドライバを追加
    • mp_config.c : 新規追加
    • mp_config.h : 新規追加

  • ディレクトリファイル構成 各ファイルの前の記号 N : 新規作成 S : シングルと同じ D : マルチプロセッサ用に手を入れた
    • ./include : インクルードディレクトリ
      • N : ipi.h : プロセッサ間割込み関連の関数のextern宣言
      • S : itron.h : ITRON仕様共通規定のデータ型・定数・マクロ
      • D : kernel.h : μITRON4.0仕様標準インクルードファイル
      • S : kernel_cfg.h : kernel_cfg.c 用インクルードファイル
      • S : kernel_debug.h : μITRON4.0仕様 デバッグ用インクルードファイル
      • S : logtask.h : システムログタスク
      • S : s_services.h : デバイスドライバ用 標準インクルードファイル
      • S : serial.h : シリアルインタフェースドライバ
      • S : sil.h : システムインタフェースレイヤ(ターゲット共通部)
      • D : t_config.h : ターゲット依存情報の定義
      • S : t_services.h : アプリケーション用 標準インクルードファイル
      • S : t_stddef.h : カーネル・アプリケーション 共通インクルードファイル
      • S : t_syslog.h : システムログ機能
      • S : timer.h : システムクロックドライバ
    • ./kernel : カーネル共通部
      • D : banner.c : カーネル起動メッセージの出力
      • D : check.h : エラーチェック用マクロ
      • N : class.c : クラス管理モジュール
      • N : class.h : クラス管理モジュール
      • D : cyclic.c : 周期ハンドラ機能
      • D : cyclic.h : 周期ハンドラ機能
      • D : dataqueue.c : データキュー機能
      • D : dataqueue.h : データキュー機能
      • D : eventflag.c : イベントフラグ機能
      • D : eventflag.h : イベントフラグ機能
      • S : exception.c : CPU例外管理機能 ソースファイル
      • S : exception.h : CPU例外管理機能 ヘッダーファイル
      • D : interrupt.c : 割込み管理機能
      • D : interrupt.h : 割込み管理機能
      • D : fdmp_kernel.h : FDMPカーネル 標準インクルードファイル
      • N : lock.h : ロックオブジェクトの定義
      • D : mailbox.c : メールボックス機能
      • D : mailbox.h : メールボックス機能
      • D : mempfix.c : 固定長メモリプール機能
      • D : mempfix.h : 固定長メモリプール機能
      • S : queue.h : キュー操作ライブラリ
      • D : semaphore.c : セマフォ機能
      • D : semaphore.h : セマフォ機能
      • D : startup.c : カーネルの初期化と終了処理
      • D : sys_manage.c : システム状態管理機能
      • S : syslog.c : システムログ機能 ソースファイル
      • S : syslog.h : システムログ機能 ヘッダーファイル
      • D : task.c : タスク管理モジュール
      • D : task.h : タスク管理モジュール
      • D : task_except.c : タスク例外処理の要求
      • D : task_manage.c : タスク管理機能
      • D : task_sync.c : タスク付属同期機能
      • D : time_event.c : タイムイベント管理モジュール
      • D : time_event.h : タイムイベント管理モジュール
      • S : time_manage.c : システム時刻管理機能
      • D : wait.c : 待ち状態管理モジュール
      • D : wait.h : 待ち状態管理モジュール
    • ./systask : システムタスク
      • S : logtask.c : システムログタスク
      • S : logtask.cfg : システムログタスクのコンフィギュレーションファイル
      • S : newlibrt.c : newlibサポートファイル
      • S : serial.c : シリアルインタフェースドライバ
      • S : serial.cfg : シリアルインタフェースドライバのコンフィギュレーションファイル
      • S : timer.c : システムクロックドライバ
      • S : timer.cfg : システムクロックドライバのコンフィギュレーションファイル
      • N : ipi.c : プロセッサ間割り込みドライバ
      • N : ipi.cfg : プロセッサ間割込みのコンフィギュレーションファイル
    • ./library : カーネルライブラリ
      • S : log_output.c : システムログのフォーマット出力
      • S : strerror.c : エラーメッセージ文字列を返す関数
      • S : t_perror.c : エラーメッセージの出力
      • S : vasyslog.c : 可変数引数のシステムログライブラリ
    • ./config/nios2 : プロセッサ依存部 (Nios2)
      • D : Makefile.config : プロセッサ依存部用Makefile
      • S : cpu_config.c : プロセッサ依存モジュール ソースファイル
      • D : cpu_config.h : プロセッサ依存モジュール ヘッダーファイル
      • D : cpu_context.h : タスクコンテキスト操作ルーチン
      • S : cpu_defs.h : プロセッサに依存する定
      • S : cpu_insn.h : プロセッサの特殊命令のインライン関数定義
      • D : cpu_support.S : プロセッサ依存モジュール アセンブリ言語部
      • S : hw_serial.cfg : SIOドライバ(Nios2 UART用)のコンフィギュレーションファイル
      • S : hw_serial.h : シリアルI/Oデバイス(SIO)ドライバ(Nios2 UART用)
      • S : hw_timer.h : プロセッサ依存タイマモジュール
      • D : makeoffset.c : オフセット情報生成ファイル
      • N : mp_config.c : マルチプロセッササポートモジュール ソースファイル
      • N : mp_config.h : マルチプロセッササポートモジュール ヘッダーファイル
      • S : nios2.c : Nios2標準ペリフェラル用ドライバ ソースファイル
      • S : nios2.h : Nios2標準ペリフェラル用ドライバ ヘッダーファイル
      • S : start.S : カーネル用のスタートアップモジュール
      • S : tool_config.h : 開発環境依存モジュール
      • S : tool_defs.h : 開発環境に依存する定義
    • ./config/nios2/nios2_dev_board/ : システム依存部
      • S : Makefile.config : システム依存部用Makefile
      • D : nios2elf_PE1.l : リンカスクリプト
      • D : nios2elf_PE2.l : リンカスクリプト
      • S : sys_config.c : ターゲットシステム依存モジュール ソースファイル
      • S : sys_config.h : ターゲットシステム依存モジュール ヘッダーファイル
      • D : sys_defs.h : システムに依存定義
      • S : sys_support.S : ターゲットシステム依存モジュール アセンブリ言語部

  • ./config/microblaze/ : プロセッサ依存部(Microbalze)
    • D : Makefile.config : プロセッサ依存部用Makefile
    • S : cpu_config.c : プロセッサ依存モジュール ソースファイル
    • D : cpu_config.h : プロセッサ依存モジュール ヘッダーファイル
    • D : cpu_context.h : タスクコンテキスト操作ルーチン
    • S : cpu_defs.h : プロセッサに依存する定
    • S : cpu_insn.h : プロセッサの特殊命令のインライン関数定義
    • D : cpu_support.S : プロセッサ依存モジュール アセンブリ言語部
    • S : hw_serial.cfg : SIOドライバ(Microblaze UART Lite用)のコンフィギュレーションファイル
    • S : hw_serial.h : シリアルI/Oデバイス(SIO)ドライバ(MicroBlaze opb_uart用)
    • S : hw_timer.h : プロセッサ依存タイマモジュール
    • D : makeoffset.c : オフセット情報生成ファイル
    • D : mbelf.l : リンカスクリプト
    • D : mbelf_rom.l : ROM化対応リンカスクリプト
    • S : microblaze.c : 標準ペリフェラル用ドライバ ソースファイル
    • D : microblaze.h : 標準ペリフェラル用ドライバ ヘッダーファイル
    • S : microblaze_asm.inc : Microblazeアセンブラ用定義ファイル
    • N : mp_config.c : マルチプロセッササポートモジュール ソースファイル
    • N : mp_config.h : マルチプロセッササポートモジュール ヘッダーファイル
    • S : start.S : カーネル用のスタートアップモジュール
  • ./config/microblaze/pe1/ : システム依存部(MireMulti)
    • S : Makefile.config : システム依存部用Makefile
    • S : sys_defs.h : システムに依存定義
    • S : sys_config.c : ターゲットシステム依存モジュール ソースファイル
    • S : sys_config.h : ターゲットシステム依存モジュール ヘッダーファイル
    • S : sys_support.S : ターゲットシステム依存モジュール アセンブリ言語部

Copyright © 2006 by TAKAGI Nobuhisa.
このページは Mon Apr 3 23:49:11 2006 に Doxygen によって生成されました。