=====================================================================
                         ARM-Mプロセッサ依存部
                                  Last Modified: 23 Aug 2008 22:04:49
=====================================================================


(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
    ./makeoffset.c
    ./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
 ・最初のリリース
