===================================================================== ARMV6-M プロセッサ依存部 Last Modified: '15/05/21 ===================================================================== (1) 対応しているターゲットシステムの種類・構成 ARMV6-M依存部は,ARMV6-Mアーキテクチャをターゲットとしている.ARMV6-Mは, ARMとは異なり,ARM命令を実行できないため,ARM依存部と分けている. また,ARMV7-Mアーキテクチャに対してもレジスタ構成や利用可能な命令セットが異なるため, ARM-M依存部から分けて管理している. (注) ARMV6-M依存部は,TOPPERS/SSP に含まれるARM-M依存部を ARMV6-M アーキテクチャをもつ プロセッサ向けに対応させたものである. ARMV6-Mプロセッサには一部不要と思われる定義(例外番号など)も含まれるが, コンフィギュレーターで事前にチェック可能と思われる部分もあるためビルドや動作に支障が生じる 部分を除き,現状オリジナルのままとしている. (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の制限事項はなく,ターゲット定義で使用可能な割込み属性は特にな い. ○カーネル管理外の割込み ARMv6では割込みマスクレベルをソフトウェアで制御できないため, カーネル管理外の割込みはサポートしない. (3-3) CPU例外処理に関する規定 ○CPU例外ハンドラ番号 CPU例外ハンドラ番号としては,例外発生時にIPSRにセットされる例外番号 を用いる.各例外の例外番号は以下の通りである. 例外 例外番号 Reset 1 Non-makable Interrupt 2 Hard Fault 3 SVCall 11 PendSV 14 SysTick(オプション) 15 外部割込み0(IRQ0) 16 外部割込み1(IRQ1) 17 .. なお,Resetと,SVCallについては,カーネルが使用するため,ユーザーは使 用することができない. (3-4) CPUロック・割込みロック CPUロックおよび割込みロックは,PRIMASKを'1'に設定することで実現している. (注) ARMv6-MではBASEPRIおよびFAULTMASKを利用することができない. (3-5) 性能評価用システム時刻の参照に関する規定 ARMv6-M版ではget_utmをサポートしない. (3-6) スタートアップルーチンでの初期化内容 スタートアップルーチンは,Threadモードで呼び出されることを前提としてい る.実行後,割込みロック状態(PRIMASKをセット)とする.割込みロック 状態は,カーネルの初期化終了時に許可する.スタートアップルーチンで, 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/armv6_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) バージョン履歴 2015/05/21 ・SSP-1.3.0 に対応 2014/03/10 ・オリジナルのARM-M依存部と分けて併存できるようにするため, アーキテクチャ名を ARM-M から ARMV6-M とした 2013/06/20 ・ARMv6アーキテクチャ向けに変更 ・コンテキスト判別をネストカウンタを用いる方法に変更 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例外発生回数のインクリメントが行われていなかった 問題の修正