===================================================================== ARM-Mプロセッサ依存部 Last Modified: '13/04/07 ===================================================================== (1) 対応しているターゲットシステムの種類・構成 ARM-M依存部は,ARMVx-Mアーキテクチャをターゲットとしている.ARMVx-Mは, ARMとは異なり,ARM命令を実行できないため,ARM依存部と分けている. (2) 使用する開発環境と動作検証した条件(バージョン,オプション等) カーネルはGCCを用いてコンパイルする.動作確認したバージョンは各ターゲ ット依存部のドキュメントに記載する. (3) ターゲット定義事項の規定 (3-1) データ型に関する規定 データ型は arch/gcc/tool_stddef.h で定義されている内容で,float型と double型は,それぞれIEEE754準拠の単精度浮動小数点数と倍精度浮動小数点 数である. (3-2) 割込み処理に関する規定 ○割込みハンドラ番号と割込み番号の割当て,両者の対応 割込みハンドラ番号と割込み番号は,例外発生時にIPSRにセットされる例外番 号を用いる.SYSTICKは15番で,外部割込みは16番からの番号が割り付けられ ている. ○割込み優先度の段階数(TMIN_INTPRIの値),その設定方法 割込み優先度の段階数は,SoC毎にハードウェア的にサポートする割込み優先 度ビット幅が異なるので,ターゲット依存部毎に異なる.ターゲット依存部で は,割込み優先度のビット幅(TBITW_IPRI)とその割込み優先度中のサブ優先 度のビット幅(TBITW_SUBPRI)を定義する.各ビット幅の値と設定可能な優先 度の範囲は次の通りである. -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) 〜 -1 例えば優先度のビット幅(TBITW_IPRI)が8bit,サブ優先度のビット幅 (TBITW_SUBIPRI) が1bitの場合は,-254 〜 -1 の範囲である. この範囲で,カーネル管理内の割込みの最高優先度(TMIN_INTPRI)をターゲ ット依存部で設定する. 各割込みの割込み優先度は,CFG_INTでTMIN_INTPRI以上の値を指定する. ○dis_intとena_intのサポートの有無,その制限事項 dis_intとena_intをサポートする.制限事項は特にない. ○CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性) CFG_INTの制限事項はなく,ターゲット定義で使用可能な割込み属性は特にな い. ○カーネル管理外の割込み カーネル管理外の割込みをサポートする.指定方法は,割込み優先度の段階数 で指定した,サポートする割込み優先度の最高値(最小値)より, TMIN_INTPRIを大きく設定すると,TMIN_INTPRIより値が小い(高優先度)な割 込み優先度を設定した割込みを割込み優先度として扱う. カーネル管理外の割込みはOS実行中も禁止になることはなく(厳密には割込み の出口でごく短い区間禁止される),割込み発生時は,カーネルのコードを経 由せずに呼び出される. カーネル管理外の割込みに対する,DEF_INH,CFG_INTはサポートする. (3-3) CPU例外処理に関する規定 ○CPU例外ハンドラ番号 CPU例外ハンドラ番号としては,例外発生時にIPSRにセットされる,例外番号 を用いる.各例外の例外番号は以下の通りである. 例外 例外番号 Reset 1 Non-makable Interrupt 2 Hard Fault 3 Memory Management 4 Bus Fault 5 Usage Fault 6 SVCall 11 Debug Monitor 12 PendSV 14 なお,Resetと,SVCallについては,カーネルが使用するため,ユーザーは使 用することができない. (3-4) CPUロック・割込みロック CPUロックは,basepriをTMIN_INTPRIの優先度の割込みを禁止する値に設定す る.割込みロックは,FAULTMASKを'1'に設定することで実現している. (3-5) 性能評価用システム時刻の参照に関する規定 get_utmをサポートする.精度に関しては,ターゲット毎に異なる. (3-6) スタートアップルーチンでの初期化内容 スタートアップルーチンは,Threadモードで呼び出されることを前提としてい る.実行後,割込みロック状態(FAULTMASKをセット)とする.割込みロック 状態は,カーネルの初期化終了時に許可する.スタートアップルーチンで, MSPをアクティブなスタックとし,MSPの内容を初期化するためには,INIT_MSP をターゲット依存部で定義する. (3-7) ベクタテーブルオフセットの初期化 プロセッサ依存の初期化処理で,Vector Table Offset Register をターゲッ ト依存部の初期化ルーチンで設定する.なお,ベクターテーブルは,.vector のセクション属性が付加されているため,リンカスクリプトでこのセクション を指定して配置する. (4) タイマドライバ関連の情報 カーネルのタイムティックとして,SYSTICを使用する場合は,prc_config.c をコンパイル対象とし,コンフィギュレーションファイルに prc_config.cfg を指定すること. 周期の基本は1msecとする.周期をCALIBRATIONレジスタの設定内容を元に計算 する場合は,SYSTIC_USE_CALIBRATION を定義する.CALIBRATIONレジスタを用 いない場合は,1msec周期分のカウント値を TIMER_CLOCK に設定する.クロッ クソースとして,外部クロックを用いる場合は,SYSTIC_USE_STCLK を用いる. (5) ターゲット依存部での設定項目 ターゲット依存部では以下のマクロを定義する必要がある. ・TMAX_INTNO : 割込み番号の最大値(通常の割込み番号 + 15) ・TBITW_IPRI : 割込み優先度のビット幅 ・TBITW_SUBIPRI : 割込み優先度のビット幅中のサブ優先度のビット幅 ・TMIN_INTPRI : 割込み優先度の最小値(最高値) ・TIC_NUME : タイムティックの周期の分子 ・TIC_DENO : タイムティックの周期の分母 ・TIMER_CLOCK : タイマ値の内部表現とミリ秒単位との変換 ・INTPRI_TIMER : タイマ割込み割込み優先度 ・INTATR_TIMER : タイマ割込みの割込み属性 ・INIT_MSP : スタートアップルーチンでMSPを初期化する場合は定義 ・DEFAULT_ISTKSZ : スタックサイズ(8byte単位で指定) ・SIL_DLY_TIM1 : 微少時間待ちのための定義 ・SIL_DLY_TIM2 : 微少時間待ちのための定義 (6) ディレクトリ構成・ファイル構成 ./arch/arm_m_gcc/ ./Makefile.prc ./arm_m.h ./prc.tf ./prc_cfg1_out.h ./prc_check.tf ./prc_config.c ./prc_config.h ./prc_def.csv ./prc_insn.h ./prc_kernel.h ./prc_rename.def ./prc_rename.h ./prc_sil.h ./prc_stddef.h ./prc_support.S ./prc_test.h ./prc_timer.c ./prc_timer.cfg ./prc_timer.h ./prc_unrename.h ./prc_user.txt ./start.S (12) バージョン履歴 2008/08/22 ・prc_user.txt/prc_design.txt ・2008/8/21の技術検討会での議論結果を反映. ・prc_support.S/prc_config.c/prc_config.h/arm_m.h ・コンテキスト判定をexc_ncntからアクティブなスタックに変更 ・prc_config.c ・set_exc_int_priority() でサポート可能なIRQの上限を239に拡張. ・start.S ・起動時はThreadモードを前提としていることを明記. ・ブートローダー等から起動される場合を想定し,MSPを有効にするように 変更. ・prc_timer.c ・コメントを修正 ・デバッグ用コードを削除 2008/07/11 ・最初のリリース 2013/04/07 ・例外処理発生時に割込み/CPU例外発生回数のインクリメントが行われていなかった 問題の修正