Ignore:
Timestamp:
Jun 2, 2015, 3:39:53 PM (9 years ago)
Author:
nmir-saito
Message:

ファイルの mime-type 変更

File:
1 edited

Legend:

Unmodified
Added
Removed
  • ssp_qb_r5f100le_cs/trunk/arch/arm_m_gcc/prc_design.txt

    • Property svn:mime-type set to text/plain; charset=shift_jis
    r93 r95  
    11=====================================================================
    2                          ARM-MƒvƒƒZƒbƒTˆË‘¶•”ÝŒvƒƒ‚
     2                         ARM-Mプロセッサ依存部設計メモ
    33                                  Last Modified: 23 Aug 2008 21:54:54
    44=====================================================================
    55
    6 ›‚±‚̃hƒLƒ
    7 ƒƒ“ƒg‚̈ʒu‚¯
    8 
    9 ‚±‚̃hƒLƒ
    10 ƒƒ“ƒg‚́CTOPPERS/ASPƒJ[ƒlƒ‹‚ðARMvX-MƒvƒƒZƒbƒT‚ɈڐA‚·‚邽‚ß
    11 ‚̐݌vƒƒ‚‚Å‚ ‚éD
    12 
    13 
    14 ›ARMVx-M‚ÌŽd—l‚Ü‚Æ‚ß
    15 
    16 ARMvX-M‚ÌŽd—l‚Ì‚¤‚¿CƒJ[ƒlƒ‹‚̐݌v‚ÉŠÖŒW‚·‚鎖€‚ɂ‚¢‚Ä‚Ü‚Æ‚ß‚éD
    17 
    18 œƒŒƒWƒXƒ^
    19 
    20 ”Ä—pƒŒƒWƒXƒ^‚ÍR0`R15‚Ì16Ží—Þ‚ ‚èCR13‚Ì‚Ý‚ª2ƒoƒ“ƒN\¬iPSP,MSPj‚Æ‚È
    21 ‚Á‚Ä‚¢‚éDR15‚ÍPC, R14‚̓Šƒ“ƒNƒŒƒWƒXƒ^iLRj‚Æ‚È‚Á‚Ä‚¢‚éDR0`R3,R12‚Í
    22 ƒXƒNƒ‰ƒbƒ`ƒŒƒWƒXƒ^‚Å‚ ‚éD
    23 
    24 œƒR[ƒŠƒ“ƒOƒRƒ“ƒxƒ“ƒVƒ‡ƒ“
    25 
    26 R0`R4‚ªˆø”C‚»‚êˆÈã‚̓Xƒ^ƒbƒND–ß‚è’l‚́CR0`R1‚ÉŠi”[‚³‚ê‚éD(ARM‚É
    27 ‚æ‚è‹K’肳‚ê‚Ä‚¢‚邽‚߁CƒRƒ“ƒpƒCƒ‰‚Ɉˑ¶‚¹‚¸‚±‚̃‹[ƒ‹‚Æ‚È‚éD)
    28 
    29 œCONTROLƒŒƒWƒXƒ^
    30 
    31 PSP,MSP‚̐؂è‘Ö‚¦CPrivilage‚ÆUserƒ‚[ƒh‚̃ŒƒWƒXƒ^D•ÏXŒã‚́CƒCƒ“ƒXƒg
    32 ƒ‰ƒNƒVƒ‡ƒ“ƒoƒbƒtƒ@ƒtƒ‰ƒbƒVƒ
    33 –½—ß‚ðŽÀs‚·‚é•K—v‚ª‚ ‚éiisbjDCONTROLƒŒ
    34 ƒWƒXƒ^‚̏ڍׂ́CARMv7-M Architecture Application Level Reference
    35 Manual ‚Ì B1-9 ‚ðŽQÆ‚Ì‚±‚ƁD
    36 
    37 œŠ„ž‚݃xƒNƒ^
    38 
    39 ƒxƒNƒ^ƒe[ƒuƒ‹Œ^‚ŁCƒxƒNƒ^ƒe[ƒuƒ‹‚̃AƒhƒŒƒX‚́CƒŠƒZƒbƒgŽž‚Í0x00‚ŁC
    40 Vector Table Offset Registeriƒƒ‚ƒŠƒ}ƒbƒvƒhƒŒƒWƒXƒ^j ‚𑀍삷‚邱‚Æ
    41 ‚ŁC”CˆÓ‚̃AƒhƒŒƒX‚É”z’u‰Â”\‚Å‚ ‚éD
    42 
    43 œ—Dæ“x
    44 
    45 ’l‚ª¬‚³‚¢•û‚ª‚—Dæ“x‚Æ‚È‚éD
    46 
    47 —Dæ“x‚͍őå8bit‚Å‚ ‚èCSoC–ˆ‚ÉŽÀ‘•‚³‚ê‚Ä‚¢‚éƒrƒbƒg•‚ªˆÙ‚È‚éDŽÀ‘•‚³
    48 ‚ê‚éƒrƒbƒg‚ª8bitˆÈ‰º‚̏ꍇ‚́CLSB‚©‚ç–³Œø‚É‚È‚éD—Ⴆ‚΁CŽÀ‘•‚³‚ê‚Ä‚¢
    49 ‚éƒrƒbƒg•‚ª7bit‚̏ꍇ‚́Cƒrƒbƒg0‚ª–³Œø‚Æ‚È‚éD
    50 
    51 —Dæ“x‚̃rƒbƒgƒtƒB[ƒ‹ƒh‚ÌLSB‚©‚琔ƒrƒbƒg‚ðƒTƒu—Dæ“x‚ƌĂԃtƒB[ƒ‹ƒh
    52 ‚ɐݒ肷‚邱‚Æ‚ª‰Â”\‚Å‚ ‚éDŽc‚è‚̏ãˆÊƒrƒbƒg‚ðƒvƒŠƒGƒ“ƒvƒVƒ‡ƒ“—Dæ“x‚Æ
    53 ŒÄ‚ԁDƒvƒŠƒGƒ“ƒvƒVƒ‡ƒ“—Dæ“x‚ª“¯‚¶‚ŁCƒTƒu—Dæ“x‚ªˆÙ‚È‚é—Dæ“x‚̃Oƒ‹[
    54 ƒv‚́C‚¨ŒÝ‚¢‚ðƒvƒŠƒGƒ“ƒvƒg‚·‚邱‚Æ‚ª‚Å‚«‚È‚¢D
    55 
    56 Reset,NMI,Hard Fault ˆÈŠO‚Ì—áŠO‚ÍŠ„ž‚Ý‚Æ“¯—l‚É—Dæ“x‚ªÝ’è‰Â”\‚Å‚ ‚èC
    57 Š„ž‚݃}ƒXƒN‹@”\‚É‚æ‚èC”­¶‚ð‹ÖŽ~‚·‚邱‚Æ‚ª‰Â”\‚Å‚ ‚éD
    58 
    59 œCPUƒ‚[ƒh
    60 
    61 ƒvƒƒZƒbƒT‚́CThreadƒ‚[ƒh‚à‚µ‚­‚ÍHandlerƒ‚[ƒh‚Ì‚¢‚¸‚ê‚©‚̃‚[ƒh‚Æ‚È
    62 ‚éD
    63 
    64 œƒŠƒZƒbƒgŽž‚̏ó‘Ô
    65 
    66 ƒŠƒZƒbƒgŽž‚ÍThreadƒ‚[ƒhCMSP‚ª—LŒø‚Æ‚È‚Á‚Ä‚¢‚éD
    67 
    68 œHandlerƒ‚[ƒh
    69 
    70 —áŠO/Š„ž‚Ý‚ðŽó‚¯•t‚¯‚é‚Æ‘JˆÚ‚·‚郂[ƒhDŽó‚¯•t‚¯‚½—áŠO/Š„ž‚Ý‚Ì—áŠO”Ô
    71 †‚ªCIPSR‚ɃZƒbƒg‚³‚ê‚éD—áŠO”ԍ†‚́CTRM‚Å’è‚ß‚ç‚ê‚Ä‚¢‚é”ԍ†‚Å‚ ‚éD
    72 
    73         —áŠO              —áŠO”ԍ†
     6○このドキュメントの位置づけ
     7
     8このドキュメントは,TOPPERS/ASPカーネルをARMvX-Mプロセッサに移植するため
     9の設計メモである.
     10
     11
     12○ARMVx-Mの仕様まとめ
     13
     14ARMvX-Mの仕様のうち,カーネルの設計に関係する事項についてまとめる.
     15
     16●レジスタ
     17
     18汎用レジスタはR0〜R15の16種類あり,R13のみが2バンク構成(PSP,MSP)とな
     19っている.R15はPC, R14はリンクレジスタ(LR)となっている.R0〜R3,R12は
     20スクラッチレジスタである.
     21
     22●コーリングコンベンション
     23
     24R0〜R4が引数,それ以上はスタック.戻り値は,R0〜R1に格納される.(ARMに
     25より規定されているため,コンパイラに依存せずこのルールとなる.)
     26
     27●CONTROLレジスタ
     28
     29PSP,MSPの切り替え,PrivilageとUserモードのレジスタ.変更後は,インスト
     30ラクションバッファフラッシュ命令を実行する必要がある(isb).CONTROLレ
     31ジスタの詳細は,ARMv7-M Architecture Application Level Reference
     32Manual の B1-9 を参照のこと.
     33
     34●割込みベクタ
     35
     36ベクタテーブル型で,ベクタテーブルのアドレスは,リセット時は0x00で,
     37Vector Table Offset Register(メモリマップドレジスタ) を操作すること
     38で,任意のアドレスに配置可能である.
     39
     40●優先度
     41
     42値が小さい方が高優先度となる.
     43
     44優先度は最大8bitであり,SoC毎に実装されているビット幅が異なる.実装さ
     45れるビットが8bit以下の場合は,LSBから無効になる.例えば,実装されてい
     46るビット幅が7bitの場合は,ビット0が無効となる.
     47
     48優先度のビットフィールドのLSBから数ビットをサブ優先度と呼ぶフィールド
     49に設定することが可能である.残りの上位ビットをプリエンプション優先度と
     50呼ぶ.プリエンプション優先度が同じで,サブ優先度が異なる優先度のグルー
     51プは,お互いをプリエンプトすることができない.
     52
     53Reset,NMI,Hard Fault 以外の例外は割込みと同様に優先度が設定可能であり,
     54割込みマスク機能により,発生を禁止することが可能である.
     55
     56●CPUモード
     57
     58プロセッサは,ThreadモードもしくはHandlerモードのいずれかのモードとな
     59る.
     60
     61●リセット時の状態
     62
     63リセット時はThreadモード,MSPが有効となっている.
     64
     65●Handlerモード
     66
     67例外/割込みを受け付けると遷移するモード.受け付けた例外/割込みの例外番
     68号が,IPSRにセットされる.例外番号は,TRMで定められている番号である.
     69
     70        例外              例外番号
    7471  Reset                      1
    7572  Non-makable Interrupt      2
     
    8683  ..
    8784
    88 —áŠO/Š„ž‚Ý‚ðŽó‚¯•t‚¯‚é‚ƁCŽó‚¯•t‚¯‚½—áŠO/Š„ž‚Ý‚Ì—Dæ“xˆÈ‰º‚Ì—áŠO/Š„
    89 ž‚Ý‚ð‹ÖŽ~‚·‚éD‚±‚Ì—Dæ“xƒ}ƒXƒN‚ð"NVIC—Dæ“xƒ}ƒXƒN"‚ƌĂԁD‚±‚Ì—Dæ“x
    90 ‚́Cƒ\ƒtƒgƒEƒFƒA‚©‚ç•ÏX‚·‚邱‚Æ‚ª‚Å‚«‚¸C—áŠO/Š„ž‚݂̃Šƒ^[ƒ“‚É‚æ‚è
    91 Š„ž‚Ý‘O‚Ì’l‚ÉŽ©“®“I‚É–ß‚éD
    92 
    93 œƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^iPSP‚ÆMSPj
    94 
    95 ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^‚́CPSP‚ÆMSP‚ª‚ ‚èC”r‘¼“I‚ÉŽg—p‰Â”\‚Å‚ ‚éDHandlerƒ‚
    96 [ƒh‚Å‚ÍMSP‚Ì‚ÝŽg—p‰Â”\‚Å‚ ‚èCThreadƒ‚[ƒh‚Å‚ÍCONTROLƒŒƒWƒXƒ^‚Å‘I‘ð‰Â
    97 ”\‚Å‚ ‚éDCONTROLƒŒƒWƒXƒ^‚Ì1ƒrƒbƒg–Ú‚ðƒZƒbƒg‚·‚é‚ÆPSP‚ª—LŒø‚ɁCƒNƒŠƒA
    98 ‚·‚é‚ƁCMSP‚ª—LŒø‚É‚È‚éD
    99 
    100 œThreadƒ‚[ƒh‚ÆHandlerƒ‚[ƒh‚Ì‘JˆÚ
    101 
    102 Threadƒ‚[ƒh‚©‚çHandlerƒ‚[ƒh‚Ö‚Ì‘JˆÚ‚́C—áŠO/Š„ž‚Ý‚ðŽó‚¯•t‚¯‚邱‚Æ‚Å
    103 ”­¶‚·‚éDˆê•ûCHandlerƒ‚[ƒh‚©‚çThreadƒ‚[ƒh‚Ö‚Ì‘JˆÚ‚́CPC‚É
    104 EXC_RETURN(0xfffffffx)‚Ì’l‚ðÝ’è‚·‚邱‚Æ‚É‚æ‚ès‚¤i—áŠOƒŠƒ^[ƒ“ˆ—‚Æ
    105 ŒÄ‚ԁjDEXC_RETURN‚̉ºˆÊ4bit‚É‚æ‚èC‘JˆÚæ‚̃‚[ƒh‚âŽg—p‚·‚éƒXƒ^ƒbƒNƒ|
    106 ƒCƒ“ƒ^‚ð•ÏX‰Â”\‚Å‚ ‚éD—áŠOƒŠƒ^[ƒ“‚É‚æ‚èCPRIMASK‚âBASEPRI‚Ì’l‚͕ω»
    107 ‚µ‚È‚¢Dˆê•ûCFAULTMASK‚Ì’l‚Í'0'‚ɃNƒŠƒA‚³‚¹‚éD
    108 
    109 œEXC_RETURN
    110 
    111 —áŠO/Š„ž‚ÝŽó•t‚¯Žž‚Élr‚ɐݒ肳‚ê‚é’lDƒrƒbƒg31`4ƒrƒbƒg‚Í‘S‚Ä'1'‚ŁC
    112 ‰ºˆÊ4bit‚́CŽó•t‚¯Žž‚ÌCPUƒ‚[ƒh‚âƒXƒ^ƒbƒN‚𔽉f‚µ‚½’l‚Æ‚È‚Á‚Ä‚¢‚éD
    113 
    114  0b0001 : Handlerƒ‚[ƒh
    115  0b1001 : Threadƒ‚[ƒh with MSP
    116  0b1101 : Threadƒ‚[ƒh with PSP
    117 
    118 œThreadƒ‚[ƒh‚ÆHandlerƒ‚[ƒh‚Ì”»’è
    119 
    120 Œ»ó‚̃‚[ƒh‚ð”»’è‚·‚é‚ɂ́CIPSR‚ðŒ©‚ÄC'0'‚È‚çThreadƒ‚[ƒhC‚»‚êˆÈŠO
    121 ‚È‚çCHandlerƒ‚[ƒh‚Æ‚È‚éD
    122 
    123 œBASEPRIƒŒƒWƒXƒ^
    124 
    125 Ý’肵‚½—Dæ“xˆÈ‰º‚Ì—Dæ“x‚ÌŠ„ž‚Ý‚ÌŽó•t‚ð‹ÖŽ~‚·‚éD‚±‚Ì—Dæ“xƒ}ƒXƒN‚ð
    126 "BASEPRI—Dæ“xƒ}ƒXƒN"‚ƌĂԁD'0'‚ðÝ’è‚·‚é‚ƁC‘S‚Ä‚ÌŠ„ž‚Ý‚ð‹–‰Â‚·‚éD
    127 —áŠO/Š„ž‚Ý‚ÌŽó•t‚ƃŠƒ^[ƒ“‚É‚æ‚è•Ï‰»‚µ‚È‚¢D—áŠO/Š„ž‚݂ɑ΂·‚銄ž‚Ý
    128 —Dæ“xƒ}ƒXƒN‚́CNVIC—Dæ“xƒ}ƒXƒN‚ÆBASEPRI‚̐ݒè’l‚̍‚‚¢•ûi’l‚ª¬‚³‚¢
    129 •ûj‚Æ‚È‚éD
    130 
    131 œFAULTMASK
    132 
    133 FAULTMASK‚Í'1'‚ðƒZƒbƒg‚·‚邱‚Æ‚É‚æ‚èCNMIˆÈŠO‚Ì‘S‚Ä‚ÌŠ„ž‚Ý‚ð‹ÖŽ~‚·‚éD
    134 FAULTMASK‚́C—áŠO‚̃Šƒ^[ƒ“ˆ—‚É‚æ‚è'0'‚ɃNƒŠƒA‚³‚¹‚éD
    135 
    136 œPRIMASK‚ÆWFI
    137 
    138 PRIMASK‚ð'1'‚ɐݒ肷‚é‚ƁCNMI ‚Æ Hardware Fault ˆÈŠO‚Ì—áŠO/Š„ž‚Ý‚ð‹Ö
    139 Ž~‚·‚éDPRIMASK‚ÍŠ„ž‚Ý‚Ì‹–‰Â‚ÆŠ„ž‚Ý‘Ò‚¿‚ðƒAƒgƒ~ƒbƒN‚ɍs‚¤‚½‚ß‚É—p‚¢
    140 ‚éD‹ï‘Ì“I‚ɂ́CPRIMASK‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚éó‘Ô‚Åwfi‚ðŽÀs‚·‚é‚ƁCŠ„‚荞
    141 ‚Ý‘Ò‚¿‚Æ‚È‚èCŠ„ž‚ÝŽó•t‚¯‚é‚ƃnƒ“ƒhƒ‰‚ðŽÀs‚¹‚¸‚ɁCwfi‚©‚烊ƒ^[ƒ“‚µ
    142 ‚Ä‚­‚éD
    143 
    144 œ—áŠO/Š„ž‚Ý‚ÌŽó•t
    145 
    146 E—áŠO/Š„ž‚Ý‚ðŽó•t‚¯‚é‚ƁCŽó•t‚¯Žž‚ɃAƒNƒeƒBƒu‚ȃXƒ^ƒbƒNã‚Ɉȉº‚̃R
    147   ƒ“ƒeƒLƒXƒg‚ð•Û‘¶‚·‚é(—áŠOƒtƒŒ[ƒ€‚ƌĂÔ)D
     85例外/割込みを受け付けると,受け付けた例外/割込みの優先度以下の例外/割
     86込みを禁止する.この優先度マスクを"NVIC優先度マスク"と呼ぶ.この優先度
     87は,ソフトウェアから変更することができず,例外/割込みのリターンにより
     88割込み前の値に自動的に戻る.
     89
     90●スタックポインタ(PSPとMSP)
     91
     92スタックポインタは,PSPとMSPがあり,排他的に使用可能である.Handlerモ
     93ードではMSPのみ使用可能であり,ThreadモードではCONTROLレジスタで選択可
     94能である.CONTROLレジスタの1ビット目をセットするとPSPが有効に,クリア
     95すると,MSPが有効になる.
     96
     97●ThreadモードとHandlerモードの遷移
     98
     99ThreadモードからHandlerモードへの遷移は,例外/割込みを受け付けることで
     100発生する.一方,HandlerモードからThreadモードへの遷移は,PCに
     101EXC_RETURN(0xfffffffx)の値を設定することにより行う(例外リターン処理と
     102呼ぶ).EXC_RETURNの下位4bitにより,遷移先のモードや使用するスタックポ
     103インタを変更可能である.例外リターンにより,PRIMASKやBASEPRIの値は変化
     104しない.一方,FAULTMASKの値は'0'にクリアさせる.
     105
     106EXC_RETURN
     107
     108例外/割込み受付け時にlrに設定される値.ビット31〜4ビットは全て'1'で,
     109下位4bitは,受付け時のCPUモードやスタックを反映した値となっている.
     110
     111 0b0001 : Handlerモード
     112 0b1001 : Threadモード with MSP
     113 0b1101 : Threadモード with PSP
     114
     115●ThreadモードとHandlerモードの判定
     116
     117現状のモードを判定するには,IPSRを見て,'0'ならThreadモード,それ以外
     118なら,Handlerモードとなる.
     119
     120●BASEPRIレジスタ
     121
     122設定した優先度以下の優先度の割込みの受付を禁止する.この優先度マスクを
     123"BASEPRI優先度マスク"と呼ぶ.'0'を設定すると,全ての割込みを許可する.
     124例外/割込みの受付とリターンにより変化しない.例外/割込みに対する割込み
     125優先度マスクは,NVIC優先度マスクとBASEPRIの設定値の高い方(値が小さい
     126方)となる.
     127
     128FAULTMASK
     129
     130FAULTMASKは'1'をセットすることにより,NMI以外の全ての割込みを禁止する.
     131FAULTMASKは,例外のリターン処理により'0'にクリアさせる.
     132
     133●PRIMASKとWFI
     134
     135PRIMASKを'1'に設定すると,NMI と Hardware Fault 以外の例外/割込みを禁
     136止する.PRIMASKは割込みの許可と割込み待ちをアトミックに行うために用い
     137る.具体的には,PRIMASKがセットされている状態でwfiを実行すると,割り込
     138み待ちとなり,割込み受付けるとハンドラを実行せずに,wfiからリターンし
     139てくる.
     140
     141●例外/割込みの受付
     142
     143・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ
     144  ンテキストを保存する(例外フレームと呼ぶ).
    148145
    149146   -----------
     
    166163  |           | <- old SP
    167164
    168 EƒvƒƒZƒbƒT‚ðHandlerƒ‚[ƒh‚Æ‚·‚éDMSP‚ª—LŒø‚Æ‚È‚éD
    169 EŽó•t‚¯‚½—áŠO/Š„ž‚Ý‚Ì—áŠO”ԍ†‚ðIPSR‚ɐݒ肷‚éD
    170 ENVICŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðŽó•t‚¯‚½—áŠO/Š„ž‚Ý‚Ì—Dæ“x‚ɐݒ肷‚éD
    171 Elr‚ÉEXC_RETURN‚Ì’l‚ªÝ’肳‚ê‚éD
    172 EƒxƒNƒ^ƒe[ƒuƒ‹‚ð“ǂݍž‚݃nƒ“ƒhƒ‰‚ðŽÀs‚·‚éD
    173 
    174 œ—áŠO/Š„ž‚Ý‚©‚ç‚̃Šƒ^[ƒ“
    175 
    176 pc‚ÉEXC_RETURN‚Ì’l‚ðÝ’è‚·‚邱‚Æ‚É‚æ‚èC—áŠO/Š„ž‚Ý‚©‚烊ƒ^[ƒ“‚·‚éD
    177 pc‚ւ̐ݒè‚ÉŽg—p‰Â”\‚È–½—߂ɂ͐§ŒÀ‚ª‚ ‚èCˆÈ‰º–½—ß‚ªŽg—p‰Â”\‚Å‚ ‚éD
    178 
    179   EPOP/LDM, LDR, BX
    180 
    181 œ–¢‰ðŒˆ‰Û‘è
    182 
    183 EƒxƒNƒ^[ƒe[ƒuƒ‹‚É“o˜^‚·‚éŠÖ”‚̃AƒhƒŒƒX‚ÌLSB‚Í'1'‚É‚·‚é‚ׂ«‚©?
    184 ENVIC‚Í—áŠOEŠ„ž‚݂̃lƒXƒg‰ñ”‚ð“à•”“I‚ÉŠÇ—‚µ‚Ä‚¢‚é‚炵‚¢D
    185   (!ƒŠƒtƒ@ƒŒƒ“ƒX‚𖾂炩‚É)D
    186     ƒ\ƒtƒgƒEƒFƒA‚ł́CƒlƒXƒg‚Ì’ K‚ð‡‚í‚¹‚ê‚΁CƒŠƒ^[ƒ“ƒXƒ^ƒbƒN‚ð‹U‘¢‚µ
    187     ‚Ä‚à–â‘è‚È‚¢‚©D
    188 
    189 
    190 ›OS‚ÌŽÀ‘•
    191 
    192 1.ƒ^[ƒQƒbƒg–¼
     165・プロセッサをHandlerモードとする.MSPが有効となる.
     166・受付けた例外/割込みの例外番号をIPSRに設定する.
     167・NVIC割込み優先度マスクを受付けた例外/割込みの優先度に設定する.
     168・lrにEXC_RETURNの値が設定される.
     169・ベクタテーブルを読み込みハンドラを実行する.
     170
     171●例外/割込みからのリターン
     172
     173pcにEXC_RETURNの値を設定することにより,例外/割込みからリターンする.
     174pcへの設定に使用可能な命令には制限があり,以下命令が使用可能である.
     175
     176  POP/LDM, LDR, BX
     177
     178●未解決課題
     179
     180・ベクターテーブルに登録する関数のアドレスのLSBは'1'にするべきか?
     181・NVICは例外・割込みのネスト回数を内部的に管理しているらしい.
     182  (!リファレンスを明らかに).
     183    ソフトウェアでは,ネストの帳尻を合わせれば,リターンスタックを偽造し
     184    ても問題ないか.
     185
     186
     187○OSの実装
     188
     1891.ターゲット名
    193190
    194191 1-1 cm3(Cortex-M3)
     
    196193 1-3 arm_m
    197194
    198 cm3‚ł́CCoretex-M1(armv6-m)‚ðƒTƒ|[ƒg‚·‚éê‡‚É–â‘è‚Æ‚È‚éDarmv7m‚ł́C
    199 armv8m‚ªƒŠƒŠ[ƒX‚³‚ꂽê‡‚É–â‘è‚Æ‚È‚éDARMˆË‘¶•”‚ÍJSP‚ł́Carmv4‚Æ‚È
    200 ‚Á‚Ä‚¢‚½‚ªCarmv5‚âarmv7‚à“®ì‚·‚邽‚ßASP‚Å‚Í’P‚Éarm‚Æ‚µ‚½D‚»‚Ì‚½‚߁C
    201 arm_m‚ª–³“ï‚ƍl‚¦‚ç‚ê‚éD
    202 
    203 
    204 2.Threadƒ‚[ƒh‚ÆHandlerƒ‚[ƒh‚ÌŽg‚¢•ª‚¯
     195cm3では,Coretex-M1(armv6-m)をサポートする場合に問題となる.armv7mでは,
     196armv8mがリリースされた場合に問題となる.ARM依存部はJSPでは,armv4とな
     197っていたが,armv5やarmv7も動作するためASPでは単にarmとした.そのため,
     198arm_mが無難と考えられる.
     199
     200
     2012.ThreadモードとHandlerモードの使い分け
    205202
    206203 2-1
    207   ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÍThreadƒ‚[ƒhC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÍHandlerƒ‚[
    208   ƒh‚Å“®ì‚³‚¹‚éD
     204  タスクコンテキストはThreadモード,非タスクコンテキストはHandlerモー
     205  ドで動作させる.
    209206
    210207 2-2
    211   ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‹¤‚ÉHandlerƒ‚[ƒh‚Å“®ì‚³‚¹
    212   ‚éD
    213 
    214 ƒvƒƒZƒbƒT‚̐݌v•ûj‚ðl—¶‚·‚é‚Æ2-1‚ª—L—́D2-1‚Å‚Ì–â‘è“_‚Æ‚µ‚ẮCŠ„ž
    215 ‚݃nƒ“ƒhƒ‰‚©‚çƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“Žž‚Ƀ‚[ƒh‚̕ύX‚ªˆÈ‰º‚Ì—l‚É‘½”­‚·‚邱
    216 ‚Æ‚ª‹“‚°‚ç‚ê‚éD
    217 
    218 1.Š„ž‚݃nƒ“ƒhƒ‰               : Handlerƒ‚[ƒh
    219 2.ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ : Threadƒ‚[ƒh
    220 3.ƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“ˆ—       : Handlerƒ‚[ƒh
    221 4.ƒ^ƒXƒN‚̍ĊJ                 : Threadƒ‚[ƒh
    222 
    223 3‚ÅHandlerƒ‚[ƒh‚Ɉڍs‚·‚é•K—v‚ª‚ ‚é‚̂́C—áŠOƒtƒŒ[ƒ€‚ð—p‚¢‚Ä•œ‹A‚·‚é
    224 ‚ɂ́CHandlerƒ‚[ƒh‚Å—áŠOƒŠƒ^[ƒ“ˆ—‚ðs‚¤•K—v‚ª‚ ‚邽‚ß‚Å‚ ‚éDARM‚Å
    225 ‚́C•¡”ƒŒƒWƒXƒ^‚̃[ƒh‚ÆCPSR‚Ì•œ‹A‚𓯎ž‚ɍs‚¦‚邪CM3‚͍s‚¦‚È‚¢‚½‚߁C
    226 ‚±‚Ì•û–@‚ÅŠ„ž‚ݐæ‚̃^ƒXƒN‚ɃŠƒ^[ƒ“‚·‚é•K—v‚ª‚ ‚éD
    227 
    228 2-2‚̏ꍇ‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‚©‚çƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“Žž‚Ƀ‚[ƒh‚̕ύX‚ðˆÈ‰º
    229 ‚ÉŽ¦‚·D‚Ü‚½C2-2‚Å‚ÍŠ„ž‚Ý—Dæ“x‚̍Œá’l‚ðƒ^ƒXƒN‚ÌŽÀsŽž‚Ì—Dæ“x‚Æ‚µ
    230 ‚ăŠƒU[ƒu‚·‚é•K—v‚ª‚ ‚éD
    231 
    232 1.Š„ž‚݃nƒ“ƒhƒ‰               : Handlerƒ‚[ƒh
    233 2.NVIC—Dæ“xƒ}ƒXƒN'0'‚ð0‚Ö     : Threadƒ‚[ƒh
    234 3.Å’á—Dæ“x‚ÌHandlerƒ‚[ƒh‚Ö  : Handlerƒ‚[ƒh
    235 4.ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ : Handlerƒ‚[ƒh
    236 5.ƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“‚Ì‘Oˆ—   : Threadƒ‚[ƒh
    237 3.ƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“           : Handlerƒ‚[ƒh
    238 4.ƒ^ƒXƒN‚̍ĊJ                 : Handlerƒ‚[ƒh
    239 
    240 Š„ž‚݃nƒ“ƒhƒ‰‚©‚çƒ^ƒXƒN‚̃Šƒ^[ƒ“‚ÉŠÖ‚µ‚ẮC2-2‚Å‚ ‚Á‚Ä‚àC2‚ðŽÀs‚·
    241 ‚éê‡‚ɁCNVIC—Dæ“xƒ}ƒXƒN‚ð'0'‚É‚·‚邽‚߁C—áŠOƒŠƒ^[ƒ“ˆ—‚ðs‚¤•K—v
    242 ‚ª‚ ‚éD‚Ü‚½CNVICŽ©‘Ì‚ªCŠ„ž‚݂̃lƒXƒg‰ñ”‚ðŠÇ—‚µ‚Ä‚¢‚邽‚߁C3‚©‚ç4
    243 ‚Ö‚Ì‘JˆÚ‚Ì‚½‚߂ɁC‚¢‚Á‚½‚ñ—áŠO/Š„ž‚Ý‚ðŽó•t‚¯‚½ó‘Ô‚É‚·‚é•K—v‚ª‚ ‚邽
    244 ‚߁CŒ‹‰Ê“I‚É2-1ˆÈã‚Ì‘JˆÚ‚ª•K—v‚Æ‚È‚éD
    245 
    246 2-2‚̏ꍇ‚́CMSP‚µ‚©Žg‚¦‚È‚¢‚½‚߁CŠ„ž‚Ý‚Ì“ü‚èŒû‚ŃlƒXƒg‰ñ”‚ð”»’f‚µ‚āC
    247 ƒXƒ^ƒbƒN‚ð“ü‚ê‘Ö‚¦‚é•K—v‚ª‚ ‚éD
    248 
    249 HRP“™‚сƒ‚ƒŠ•ÛŒì‚ð—p‚¢‚éê‡‚Í2-1‚Æ‚È‚éD
    250 
    251 ˆÈã‚Ì——R‚É‚æ‚èC2-1‚ðÌ—p‚·‚éD‚½‚¾‚µ2-1‚́CƒJ[ƒlƒ‹‹N“®Žž‚ÆIDLEƒ‹[
    252 ƒv‚̈µ‚¢‚ðŒŸ“¢‚·‚é•K—v‚ª‚ ‚éD‚±‚ê‚ç‚ɂ‚¢‚Ä‚Í•Ê“r‹c˜_‚·‚éD
    253 
    254 
    255 3.ƒfƒBƒXƒpƒbƒ`ƒƒ‚ÌŽÀsƒ‚[ƒh
     208  タスクコンテキストと非タスクコンテキスト共にHandlerモードで動作させ
     209  る.
     210
     211プロセッサの設計方針を考慮すると2-1が有力.2-1での問題点としては,割込
     212みハンドラからタスクへのリターン時にモードの変更が以下の様に多発するこ
     213とが挙げられる.
     214
     2151.割込みハンドラ               : Handlerモード
     2162.タスク例外ハンドラの呼び出し : Threadモード
     2173.タスクへのリターン処理       : Handlerモード
     2184.タスクの再開                 : Threadモード
     219
     2203でHandlerモードに移行する必要があるのは,例外フレームを用いて復帰する
     221には,Handlerモードで例外リターン処理を行う必要があるためである.ARMで
     222は,複数レジスタのロードとCPSRの復帰を同時に行えるが,M3は行えないため,
     223この方法で割込み先のタスクにリターンする必要がある.
     224
     2252-2の場合の割込みハンドラからタスクへのリターン時にモードの変更を以下
     226に示す.また,2-2では割込み優先度の最低値をタスクの実行時の優先度とし
     227てリザーブする必要がある.
     228
     2291.割込みハンドラ               : Handlerモード
     2302.NVIC優先度マスク'0'を0へ     : Threadモード
     2313.最低優先度のHandlerモードへ  : Handlerモード
     2324.タスク例外ハンドラの呼び出し : Handlerモード
     2335.タスクへのリターンの前処理   : Threadモード
     2343.タスクへのリターン           : Handlerモード
     2354.タスクの再開                 : Handlerモード
     236
     237割込みハンドラからタスクのリターンに関しては,2-2であっても,2を実行す
     238る場合に,NVIC優先度マスクを'0'にするため,例外リターン処理を行う必要
     239がある.また,NVIC自体が,割込みのネスト回数を管理しているため,3から4
     240への遷移のために,いったん例外/割込みを受付けた状態にする必要があるた
     241め,結果的に2-1以上の遷移が必要となる.
     242
     2432-2の場合は,MSPしか使えないため,割込みの入り口でネスト回数を判断して,
     244スタックを入れ替える必要がある.
     245
     246HRP等でメモリ保護を用いる場合は2-1となる.
     247
     248以上の理由により,2-1を採用する.ただし2-1は,カーネル起動時とIDLEルー
     249プの扱いを検討する必要がある.これらについては別途議論する.
     250
     251
     2523.ディスパッチャの実行モード
    256253
    257254 3-1
    258   Threadƒ‚[ƒh‚ÅŽÀs‚·‚é
     255  Threadモードで実行する
    259256
    260257 3-2
    261   Handlerƒ‚[ƒh‚ÅŽÀs‚·‚é
    262 
    263 ƒfƒBƒXƒpƒbƒ`ƒƒ‚ðThreadƒ‚[ƒh‚ÅŽÀs‚·‚é‚ƁCŠ„ž‚Ý‚É‚æ‚èƒvƒŠƒGƒ“ƒvƒg‚³‚ê
    264 ‚½ƒ^ƒXƒN‚É–ß‚éê‡‚ÍŽŸ‚̂悤‚ȃpƒX‚É‚È‚éD
    265 
    266  1. ƒfƒBƒXƒpƒbƒ`ƒƒŒÄ‚яo‚µ : Threadƒ‚[ƒh
    267  2. ƒfƒBƒXƒpƒbƒ`ƒƒŽÀs     : Threadƒ‚[ƒh
    268  3. ƒ^ƒXƒN—áŠOŽÀs         : Threadƒ‚[ƒh
    269  4Dƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“ˆ— : Handlerƒ‚[ƒh
    270  5. ƒ^ƒXƒN‚̍ĊJ           : Threadƒ‚[ƒh
    271 
    272 Š„ž‚݃nƒ“ƒhƒ‰‚©‚玩‚çƒfƒBƒXƒpƒbƒ`‚µ‚½ƒ^ƒXƒN‚ÖƒŠƒ^[ƒ“‚·‚éê‡‚ÍŽŸ‚̃p
    273 ƒX‚É‚È‚éD
    274 
    275  1.Š„ž‚݃nƒ“ƒhƒ‰               : Handlerƒ‚[ƒh
    276  2.ƒfƒBƒXƒpƒbƒ`ƒƒŽÀs           : Threadƒ‚[ƒh
    277  3.ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ : Threadƒ‚[ƒh
    278  4.ƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“           : Handlerƒ‚[ƒh
    279  5.ƒ^ƒXƒN‚̍ĊJ                 : Threadƒ‚[ƒh
    280 
    281 ˆê•ûCƒfƒBƒXƒpƒbƒ`ƒƒ‚ðHandlerƒ‚[ƒh‚ÅŽÀs‚·‚é‚ƁCŠ„ž‚Ý‚É‚æ‚èƒvƒŠƒGƒ“
    282 ƒvƒg‚³‚ꂽƒ^ƒXƒN‚É–ß‚éê‡‚ÍŽŸ‚̂悤‚ȃpƒX‚É‚È‚éD
    283 
    284  1. ƒfƒBƒXƒpƒbƒ`ƒƒŒÄ‚яo‚µ : Threadƒ‚[ƒh
    285  2. ƒfƒBƒXƒpƒbƒ`ƒƒŽÀs     : Handlerƒ‚[ƒh
    286  3. ƒ^ƒXƒN—áŠOŽÀs         : Threadƒ‚[ƒh
    287  4Dƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“     : Handlerƒ‚[ƒh
    288  5. ƒ^ƒXƒN‚̍ĊJ           : Threadƒ‚[ƒh
    289 
    290 Š„ž‚݃nƒ“ƒhƒ‰‚̏oŒû‚©‚玩‚çƒfƒBƒXƒpƒbƒ`‚µ‚½ƒ^ƒXƒN‚ÖƒŠƒ^[ƒ“‚·‚éê‡‚Í
    291 ŽŸ‚̃pƒX‚É‚È‚éD
    292 
    293  1.Š„ž‚݃nƒ“ƒhƒ‰               : Handlerƒ‚[ƒh
    294  2.ƒfƒBƒXƒpƒbƒ`ƒƒŽÀs           : Handlerƒ‚[ƒh
    295  3.ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚̌Ăяo‚µ : Threadƒ‚[ƒh
    296  4.ƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“           : Handlerƒ‚[ƒh
    297  5.ƒ^ƒXƒN‚̍ĊJ                 : Threadƒ‚[ƒh
    298 
    299 ƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚ª‚È‚¢OS‚̏ꍇ‚́CHandlerƒ‚[ƒh‚ÅŽÀs‚µ‚½•û‚ªƒ‚[ƒh
    300 ‚Ì‘JˆÚ‚̉ñ”‚ªŒ¸‚邪Cƒ^ƒXƒN—áŠOƒnƒ“ƒhƒ‰‚ª‚ ‚é‚ƁCThreadƒ‚[ƒh‚Ì•û‚ª‘J
    301 ˆÚ‰ñ”‚ªŒ¸‚邽‚߁CThreadƒ‚[ƒh‚Æ‚·‚éD
    302 
    303 ƒƒ‚ƒŠ•ÛŒì‚ðl—¶‚·‚é‚ƁCƒfƒBƒXƒpƒbƒ`ƒƒ‚ÍHandlerƒ‚[ƒh‚Å“®ì‚³‚¹‚½•û‚ª
    304 Œø—¦‚ª‚æ‚¢‚ƍl‚¦‚ç‚ê‚éiSVC‚Ńnƒ“ƒhƒ‰‚ðŒÄ‚яo‚·‚ÆHandlerƒ‚[ƒh‚ƂȂ邽
    305 ‚߁jD
    306 
    307 
    308 4.ƒXƒ^ƒbƒN‚ÌŽg‚¢•ª‚¯
     258  Handlerモードで実行する
     259
     260ディスパッチャをThreadモードで実行すると,割込みによりプリエンプトされ
     261たタスクに戻る場合は次のようなパスになる.
     262
     263 1. ディスパッチャ呼び出し : Threadモード
     264 2. ディスパッチャ実行     : Threadモード
     265 3. タスク例外実行         : Threadモード
     266 4.タスクへのリターン処理 : Handlerモード
     267 5. タスクの再開           : Threadモード
     268
     269割込みハンドラから自らディスパッチしたタスクへリターンする場合は次のパ
     270スになる.
     271
     272 1.割込みハンドラ               : Handlerモード
     273 2.ディスパッチャ実行           : Threadモード
     274 3.タスク例外ハンドラの呼び出し : Threadモード
     275 4.タスクへのリターン           : Handlerモード
     276 5.タスクの再開                 : Threadモード
     277
     278一方,ディスパッチャをHandlerモードで実行すると,割込みによりプリエン
     279プトされたタスクに戻る場合は次のようなパスになる.
     280
     281 1. ディスパッチャ呼び出し : Threadモード
     282 2. ディスパッチャ実行     : Handlerモード
     283 3. タスク例外実行         : Threadモード
     284 4.タスクへのリターン     : Handlerモード
     285 5. タスクの再開           : Threadモード
     286
     287割込みハンドラの出口から自らディスパッチしたタスクへリターンする場合は
     288次のパスになる.
     289
     290 1.割込みハンドラ               : Handlerモード
     291 2.ディスパッチャ実行           : Handlerモード
     292 3.タスク例外ハンドラの呼び出し : Threadモード
     293 4.タスクへのリターン           : Handlerモード
     294 5.タスクの再開                 : Threadモード
     295
     296タスク例外ハンドラがないOSの場合は,Handlerモードで実行した方がモード
     297の遷移の回数が減るが,タスク例外ハンドラがあると,Threadモードの方が遷
     298移回数が減るため,Threadモードとする.
     299
     300メモリ保護を考慮すると,ディスパッチャはHandlerモードで動作させた方が
     301効率がよいと考えられる(SVCでハンドラを呼び出すとHandlerモードとなるた
     302め).
     303
     304
     3054.スタックの使い分け
    309306
    310307 4-1
    311   ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ðPSP, ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ðMSP
     308  タスクコンテキストをPSP, 非タスクコンテキストをMSP
    312309 4-2
    313   ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‹¤‚ÉMSP
    314 
    315 4-2‚̏ꍇCŠ„ž‚Ý‚Ì“ü‚èŒû‚ŃlƒXƒg‰ñ”‚ð”»’f‚µ‚āCƒXƒ^ƒbƒN‚ð“ü‚ê‘Ö‚¦‚é
    316 •K—v‚ª‚ ‚éD2‚Ń^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÍThreadƒ‚[ƒhC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg
    317 ‚ÍHandlerƒ‚[ƒh‚Å“®ì‚³‚¹‚é‚Æ‚µ‚½‚½‚߁C4-1‚ðÌ—p‚·‚é‚ƁCŠ„ž‚Ý‚Ì“ü‚èŒû
    318 ‚ÅŽ©“®“I‚ɃXƒ^ƒbƒN‚ªØ‚è‘Ö‚í‚éDThreadƒ‚[ƒh‚Å‚ÌPSP‚̃AƒNƒZƒX‚àC
    319 mrs/msr–½—߂ōs‚¦‚邽‚߁C4-1‚ðÌ—p‚·‚éD
    320 
    321 
    322 5.ƒRƒ“ƒeƒLƒXƒg‚Ì”»’è
     310  タスクコンテキスト,非タスクコンテキスト共にMSP
     311
     3124-2の場合,割込みの入り口でネスト回数を判断して,スタックを入れ替える
     313必要がある.2でタスクコンテキストはThreadモード,非タスクコンテキスト
     314はHandlerモードで動作させるとしたため,4-1を採用すると,割込みの入り口
     315で自動的にスタックが切り替わる.ThreadモードでのPSPのアクセスも,
     316mrs/msr命令で行えるため,4-1を採用する.
     317
     318
     3195.コンテキストの判定
    323320
    324321 5-1
    325   IPSR‚ª'0'(Threadƒ‚[ƒh)‚È‚çƒ^ƒXƒNƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgC'1'(Handlerƒ‚[
    326   ƒh)‚È‚ç”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ‚·‚éD
     322  IPSRが'0'(Threadモード)ならタスクタスクコンテキスト,'1'(Handlerモー
     323  ド)なら非タスクコンテキストとする.
    327324
    328325 5-2
    329   Š„ž‚݂̃lƒXƒg‰ñ”‚ð•ÛŽ‚·‚é•Ï”‚ð—pˆÓD1ˆÈã‚Å”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgD
     326  割込みのネスト回数を保持する変数を用意.1以上で非タスクコンテキスト.
    330327
    331328 5-3
    332   ƒAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚É‚æ‚è”»’fiMSP‚È‚ç”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgCPSP‚È‚ç
    333   ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ‚·‚éj
    334 
    335 5-1‚́Cƒ\ƒtƒgƒEƒFƒA‘¤‚ŃRƒ“ƒeƒLƒXƒgŠÇ—‚Ì‚½‚߂̏ˆ—‚ðs‚¤•K—v‚ª‚È‚¢‚Æ
    336 ‚¢‚¤ƒƒŠƒbƒg‚ª‚ ‚éD‚µ‚©‚µ‚È‚ª‚çCƒJ[ƒlƒ‹‚Ì‹N“®ŽžThreadƒ‚[ƒh‚Å‚ ‚邽
    337 ‚߁CHandlerƒ‚[ƒh‚ֈڍs‚·‚é•K—v‚ª‚ ‚éDASPƒJ[ƒlƒ‹‚ł́CIDLEƒ‹[ƒvŽÀs
    338 ‚Í”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Æ‚µ‚Ä“®ì‚³‚¹‚é•K—v‚ª‚ ‚邽‚߁CIDLEƒ‹[ƒv‚Í
    339 Handlerƒ‚[ƒh‚Å“®ì‚³‚¹‚é•K—v‚ª‚ ‚éDIDLEƒ‹[ƒv‚̓fƒBƒXƒpƒbƒ`ƒƒ‚©‚çŒÄ
    340 ‚яo‚³‚ê‚éD3‚Å’è‚ß‚½‚悤‚ɁCƒfƒBƒXƒpƒbƒ`ƒƒ‚ðThreadƒ‚[ƒh‚Å“®ì‚³‚¹‚é
    341 ‚½‚߁CIDLEƒ‹[ƒv‚ðŒÄ‚яo‚·Û‚ɂ́CHandlerƒ‚[ƒh‚Ö‘JˆÚ‚·‚é•K—v‚ª‚ ‚éD
    342 Handlerƒ‚[ƒh‚Ö‚Ì‘JˆÚ‚́CSVC/PendSVC‚ð—p‚¢‚é‚ÆŽÀŒ»‰Â”\‚Å‚ ‚邪C6‚ÌŠ„
    343 ž‚݂ɃvƒŠƒGƒ“ƒvƒg‚³‚ꂽƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“Žž‚ÌHandlerƒ‚[ƒh‚ւ̈ڍs‚Å
    344 ‚àSVC/PendSVC‚ÌŽg—p‚ª•K—v‚ƂȂ邽‚߁CSVCƒnƒ“ƒhƒ‰‚ł́C‚Ç‚Ì–Ú“I‚ŌĂяo
    345 ‚³‚ꂽ‚©”»’è‚·‚é•K—v‚ªo‚Ä‚­‚邽‚߁CƒI[ƒoƒwƒbƒh‚ª‘‘å‚·‚éD
    346 
    347 5-2‚ł́CƒJ[ƒlƒ‹‹N“®Žž‚âIDLEƒ‹[ƒvŽž‚ɕϐ”‚ð'1'‚ɐݒ肷‚ê‚΂悢‚±‚Æ‚É
    348 ‚È‚éD‚±‚̏ꍇCƒJ[ƒlƒ‹‹N“®Žž‚âIDLEƒ‹[ƒvŽž‚ÉThreadƒ‚[ƒh‚ÅŽÀs‚µ‚Ä‚à
    349 “®ì‚É–â‘肪‚È‚¢‚悤C“Á‚ÉŠ„ž‚݂̏o“ü‚èŒû‚̐݌v‚𒍈ӂ·‚é•K—v‚ª‚ ‚éD
    350 
    351 ƒJ[ƒlƒ‹‹N“®Žž‚ÉŠÖ‚µ‚ẮC‘SŠ„ž‚Ý‚ð‹ÖŽ~‚µ‚Ä‚¨‚èCŠ„ž‚Ý‚ª“ü‚ç‚È‚¢‚Ì‚Å
    352 “Á‚É–â‘è‚Í‚È‚¢DIDLEƒ‹[ƒvŽž‚́CThreadƒ‚[ƒh‚ÅMSP‚ÆPSP‚Ì‘I‘ð‚ª‰Â”\‚Å‚ 
    353 ‚邱‚Æ‚ð—˜—p‚µ‚āC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚̃Xƒ^ƒbƒN‚Å‚ ‚éMSP‚ɕύX‚·‚éD
    354 —áŠO/Š„ž‚Ý‚Ì“ü‚èŒû‚ł́C‘½dŠ„ž‚Ý‚Å‚ ‚é‚©‚ðEXC_RETURN‚̃‚[ƒh”»’è‚Ì
    355 ƒrƒbƒg‚Å‚Í‚È‚­CƒXƒ^ƒbƒN‚Ì”»’èƒrƒbƒg‚ōs‚¦‚Ζâ‘è‚È‚¢D—áŠO/Š„ž‚Ý‚©‚ç
    356 ‚̃Šƒ^[ƒ“‚ÉŠÖ‚µ‚ẮC‘½dŠ„ž‚Ý‚Ì”»’è‚́C“ü‚èŒû‚Æ“¯—l‚ÉEXC_RETURN‚̃X
    357 ƒ^ƒbƒN”»’èƒrƒbƒg‚ōs‚¦‚΂悢D—áŠOƒŠƒ^[ƒ“ˆ—Žž‚Épc‚É‘ã“ü‚·‚é
    358 EXC_RETURN‚Ì’l‚ðˆê—¥0xfffffffd (Threadƒ‚[ƒh with MSP)‚Æ‚·‚é‚Ì‚Å‚Í‚È‚­C
    359 —áŠO/Š„ž‚ÝŽó•t‚¯Žž‚ÉLR‚ɐݒ肳‚ê‚éEXC_RETURN‚ð—p‚¢‚邱‚Æ‚É‚æ‚èCIDLE
    360 ƒ‹[ƒv‚ÉŠ„‚荞‚ñ‚¾ê‡‚Å‚à–â‘è‚È‚­ƒŠƒ^[ƒ“‚·‚éD
    361 
    362 ƒJ[ƒlƒ‹‹N“®Žž‚́CMSP‚ªƒAƒNƒeƒBƒu‚Å‚ ‚èCŠ„ž‚݃nƒ“ƒhƒ‰ŽÀsŽž‚ÍHandler
    363 ƒ‚[ƒh‚Å‚ ‚邱‚Æ‚©‚çMSP‚ªƒAƒNƒeƒBƒu‚Å‚èCIDLEƒ‹[ƒvŽž‚ÉMSP‚ðƒAƒNƒeƒBƒu
    364 ‚ɐݒ肷‚é‚ƁC”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚Í‘S‚āCMSP‚ðƒAƒNƒeƒBƒu‚É‚µ‚Ä“®ì‚·
    365 ‚邱‚Æ‚É‚È‚éD‚Ü‚½CŠ„ž‚ÝŽž‚ÍŠ„ž‚Ý‘O‚ɃAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚̏î•ñ‚ªC
    366 EXC_RETURN‚ɐݒ肳‚ê‚éD‚»‚Ì‚½‚߁CƒRƒ“ƒeƒLƒXƒg‚Ì”»’è‚́CŠ„ž‚݃lƒXƒg‰ñ
    367 ”‚ð•ÛŽ‚·‚é•Ï”‚ª‚È‚­‚Æ‚àCƒAƒNƒeƒBƒu‚ȃXƒ^ƒbƒN‚ðŒ©‚ê‚΂悢‚±‚Æ‚É‚È‚éD
    368 ‚Ü‚½Cexc_sense_context()‚ÉŠÖ‚µ‚ẮC—áŠOƒtƒŒ[ƒ€’†‚ÉEXC_RETURN‚ð’ljÁ
    369 ‚µC‚»‚Ì“à—e‚É‚æ‚è”»’f‚·‚ê‚΂悢DˆÈã‚Ì——R‚É‚æ‚èC5-3‚ðÌ—p‚·‚éD
    370 
    371 
    372 6.Š„ž‚݂ɃvƒŠƒGƒ“ƒvƒg‚³‚ꂽƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“Žž‚ÌHandlerƒ‚[ƒh‚ւ̈Ú
    373   s•û–@
     329  アクティブなスタックにより判断(MSPなら非タスクコンテキスト,PSPなら
     330  タスクコンテキストとする)
     331
     3325-1は,ソフトウェア側でコンテキスト管理のための処理を行う必要がないと
     333いうメリットがある.しかしながら,カーネルの起動時Threadモードであるた
     334め,Handlerモードへ移行する必要がある.ASPカーネルでは,IDLEループ実行
     335は非タスクコンテキストとして動作させる必要があるため,IDLEループは
     336Handlerモードで動作させる必要がある.IDLEループはディスパッチャから呼
     337び出される.3で定めたように,ディスパッチャをThreadモードで動作させる
     338ため,IDLEループを呼び出す際には,Handlerモードへ遷移する必要がある.
     339Handlerモードへの遷移は,SVC/PendSVCを用いると実現可能であるが,6の割
     340込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移行で
     341もSVC/PendSVCの使用が必要となるため,SVCハンドラでは,どの目的で呼び出
     342されたか判定する必要が出てくるため,オーバヘッドが増大する.
     343
     3445-2では,カーネル起動時やIDLEループ時に変数を'1'に設定すればよいことに
     345なる.この場合,カーネル起動時やIDLEループ時にThreadモードで実行しても
     346動作に問題がないよう,特に割込みの出入り口の設計を注意する必要がある.
     347
     348カーネル起動時に関しては,全割込みを禁止しており,割込みが入らないので
     349特に問題はない.IDLEループ時は,ThreadモードでMSPとPSPの選択が可能であ
     350ることを利用して,非タスクコンテキストのスタックであるMSPに変更する.
     351例外/割込みの入り口では,多重割込みであるかをEXC_RETURNのモード判定の
     352ビットではなく,スタックの判定ビットで行えば問題ない.例外/割込みから
     353のリターンに関しては,多重割込みの判定は,入り口と同様にEXC_RETURNのス
     354タック判定ビットで行えばよい.例外リターン処理時にpcに代入する
     355EXC_RETURNの値を一律0xfffffffd (Threadモード with MSP)とするのではなく,
     356例外/割込み受付け時にLRに設定されるEXC_RETURNを用いることにより,IDLE
     357ループに割り込んだ場合でも問題なくリターンする.
     358
     359カーネル起動時は,MSPがアクティブであり,割込みハンドラ実行時はHandler
     360モードであることからMSPがアクティブでり,IDLEループ時にMSPをアクティブ
     361に設定すると,非タスクコンテキストは全て,MSPをアクティブにして動作す
     362ることになる.また,割込み時は割込み前にアクティブなスタックの情報が,
     363EXC_RETURNに設定される.そのため,コンテキストの判定は,割込みネスト回
     364数を保持する変数がなくとも,アクティブなスタックを見ればよいことになる.
     365また,exc_sense_context()に関しては,例外フレーム中にEXC_RETURNを追加
     366し,その内容により判断すればよい.以上の理由により,5-3を採用する.
     367
     368
     3696.割込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移
     370  行方法
    374371
    375372 6-1
    376   SVC‚ð—p‚¢‚é
     373  SVCを用いる
    377374 6-2
    378   PendSVC‚ð—p‚¢‚é
    379 
    380 PendSVC‚ÆSVC‚̈Ⴂ‚́CPendSVC‚ª—v‹‚ªƒLƒ
    381 [ƒCƒ“ƒO‚³‚êCSVC‚Í—v‹‚ªƒLƒ
    382 
    383 [ƒCƒ“ƒO‚³‚ê‚È‚¢‚±‚Æ‚Å‚ ‚éDŠ„ž‚݂ɃvƒŠƒGƒ“ƒvƒg‚³‚ꂽƒ^ƒXƒN‚ւ̃Šƒ^[
    384 ƒ“Žž‚ÌHandlerƒ‚[ƒh‚ւ̈ڍs‚́CƒLƒ
    385 [ƒCƒ“ƒO‚³‚ꂸ‚É‘¦À‚ɏˆ—‚³‚ê‚é•K
    386 —v‚ª‚ ‚邽‚߁C‚Ç‚¿‚ç‚ÅŽÀŒ»‚µ‚Ä‚à–â‘è‚È‚¢D‚Ç‚¿‚ç‚ðƒJ[ƒlƒ‹‚̃Šƒ\[ƒX‚µ
    387 ‚ÄŽg—p‚·‚é‚©‚Ì‘I‘ð‚¾‚¯‚Å‚ ‚éD
    388 
    389 ‚Ç‚¿‚ç‚ðŽg‚¤‚Æ‚µ‚Ä‚àC—Dæ“x‚̐ݒ肪–â‘è‚Æ‚È‚éDƒfƒBƒXƒpƒbƒ`ƒƒ‚©‚犄ž
    390 ‚݂ɃvƒŠƒGƒ“ƒvƒg‚³‚ꂽƒ^ƒXƒN‚ւ̃Šƒ^[ƒ“‚܂ł̏ˆ—‚́C­‚È‚­‚Æ‚àCPUƒ
    391 ƒbƒNó‘Ô‚ÅŽÀs‚³‚ê‚È‚¯‚ê‚΂Ȃç‚È‚¢DSVC‚âPendSVC‚Í‚Ç‚¿‚ç‚àŠ„ž‚Ý—Dæ“x
    392 ‚ðŽ‚Â‚½‚߁CNVIC—Dæ“xƒ}ƒXƒN‚æ‚èBASEPRI—Dæ“xƒ}ƒXƒN‚Ì•û‚ª‚‚¢ê‡Cˆ
    393 —‚³‚ê‚È‚¢D
    394 
    395 CPUƒƒbƒNó‘Ô‚ðBASEPRI‚̐ݒè‚ÅŽÀŒ»‚µ‚½ê‡C‚»‚̐ݒè’l‚ðSVC‚âPendSVC‚É
    396 Ý’肵‚½’l‚æ‚è’á‚­‚·‚é•K—v‚ª‚ ‚éDŒ¾‚¢Š·‚¦‚é‚ƁCSVC‚âPendSVC‚Ì—Dæ“x‚ð
    397 CPUƒƒbƒNŽž‚Ì—Dæ“xƒ}ƒXƒN‚Ì’l‚æ‚荂‚¢’li‘¼‚ÌŠ„ž‚Ý‚æ‚荂‚¢—Dæ“xj‚Æ
    398 ‚·‚é•K—v‚ª‚ ‚éD
    399 
    400 CPUƒƒbƒNó‘Ô‚ðFAULTMASK‚âPRIMASK‚ÅŽÀŒ»‚µ‚½ê‡‚́C‚±‚ê‚炪Ý’肳‚ê‚é
    401 ‚ƁCSVC‚âPendSVC‚ªŽó•t‚¯‚ç‚ê‚È‚¢‚½‚߁C‚¢‚Á‚½‚ñBASEPRI‚É‚æ‚芄ž‚Ý‚ðƒ}
    402 ƒXƒN‚·‚é‚悤‚ɐݒ肷‚é•K—v‚ª‚ ‚éD‚±‚̏ꍇ‚àCSVC‚âPendSVC‚Í‘¼‚ÌŠ„ž‚Ý
    403 ‚æ‚荂‚¢—Dæ“x‚ðÝ’è‚·‚é•K—v‚ª‚ ‚éD
    404 
    405 ˆÈã‚É‚æ‚èCHandlerƒ‚[ƒh‚ւ̈ڍs‚Ì‚½‚߂ɂ́CCPUƒƒbƒNó‘Ô‚ðBASEPRI‚Å
    406 ŽÀŒ»‚µCSVC‚âPendSVC‚ɐݒ肷‚é—Dæ“x‚ðƒJ[ƒlƒ‹ŠÇ—“à‚̍ō‚—Dæ“x‚æ‚èˆê
    407 ‚‚‚¢—Dæ“x‚ɐݒ肷‚é•K—v‚ª‚ ‚éD
    408 
    409 
    410 7. —áŠO/Š„ž‚ݏo“ü‚èŒû‚Å‚Ì‘½dŠ„ž‚Ý‚Ì”»’f
     375  PendSVCを用いる
     376
     377PendSVCとSVCの違いは,PendSVCが要求がキューイングされ,SVCは要求がキュ
     378ーイングされないことである.割込みにプリエンプトされたタスクへのリター
     379ン時のHandlerモードへの移行は,キューイングされずに即座に処理される必
     380要があるため,どちらで実現しても問題ない.どちらをカーネルのリソースし
     381て使用するかの選択だけである.
     382
     383どちらを使うとしても,優先度の設定が問題となる.ディスパッチャから割込
     384みにプリエンプトされたタスクへのリターンまでの処理は,少なくともCPUロ
     385ック状態で実行されなければならない.SVCやPendSVCはどちらも割込み優先度
     386を持つため,NVIC優先度マスクよりBASEPRI優先度マスクの方が高い場合,処
     387理されない.
     388
     389CPUロック状態をBASEPRIの設定で実現した場合,その設定値をSVCやPendSVCに
     390設定した値より低くする必要がある.言い換えると,SVCやPendSVCの優先度を
     391CPUロック時の優先度マスクの値より高い値(他の割込みより高い優先度)と
     392する必要がある.
     393
     394CPUロック状態をFAULTMASKやPRIMASKで実現した場合は,これらが設定される
     395と,SVCやPendSVCが受付けられないため,いったんBASEPRIにより割込みをマ
     396スクするように設定する必要がある.この場合も,SVCやPendSVCは他の割込み
     397より高い優先度を設定する必要がある.
     398
     399以上により,Handlerモードへの移行のためには,CPUロック状態をBASEPRIで
     400実現し,SVCやPendSVCに設定する優先度をカーネル管理内の最高優先度より一
     401つ高い優先度に設定する必要がある.
     402
     403
     4047. 例外/割込み出入り口での多重割込みの判断
    411405
    4124067-1
    413  EXC_RETURN‚̃‚[ƒh”»’èƒrƒbƒg
     407 EXC_RETURNのモード判定ビット
    4144087-2
    415  EXC_RETURN‚̃Xƒ^ƒbƒN”»’èƒrƒbƒg
     409 EXC_RETURNのスタック判定ビット
    4164107-3
    417  Š„ž‚݃lƒXƒg‰ñ”‚ÌŠÇ—•Ï”
    418 
    419 —áŠO/Š„ž‚ÝŽó•t‚¯Žž‚́CŽó•t‚¯‚½—áŠO/Š„ž‚݈ȉº‚ÌŠ„ž‚Ý‚Í‹ÖŽ~‚·‚邪C‘S
    420 Š„ž‚Ý‹ÖŽ~ó‘Ô‚É‚Í‚È‚ç‚È‚¢D‚»‚Ì‚½‚߁CŠ„ž‚݃lƒXƒg‰ñ”‚ÌŠÇ—•Ï”‚ðƒCƒ“
    421 ƒNƒŠƒƒ“ƒg‚·‚é‘O‚ÉŠ„ž‚Ý‚ª“ü‚é‰Â”\«‚ª‚ ‚邽‚߁C7-3‚ÍŽg—p‚·‚邱‚Æ‚ª‚Å
    422 ‚«‚È‚¢D
    423 
    424 5‚Å‹c˜_‚µ‚½’Ê‚èCIDLEƒ‹[ƒv‚ðThreadƒ‚[ƒh‚ÅŽÀs‚·‚邽‚߁C7-1‚Å‚Í‚È‚­C
    425 7-2‚Å”»’f‚·‚é•K—v‚ª‚ ‚éD
    426 
    427 
    428 8. IDLEƒ‹[ƒv
     411 割込みネスト回数の管理変数
     412
     413例外/割込み受付け時は,受付けた例外/割込み以下の割込みは禁止するが,全
     414割込み禁止状態にはならない.そのため,割込みネスト回数の管理変数をイン
     415クリメントする前に割込みが入る可能性があるため,7-3は使用することがで
     416きない.
     417
     4185で議論した通り,IDLEループをThreadモードで実行するため,7-1ではなく,
     4197-2で判断する必要がある.
     420
     421
     4228. IDLEループ
    429423
    4304248-1
    431  Threadƒ‚[ƒh‚ÅŽÀs
     425 Threadモードで実行
    4324268-2
    433  Handlerƒ‚[ƒh‚ÅŽÀs
    434 
    435 5‚Å‹c˜_‚µ‚½’Ê‚èCThreadƒ‚[ƒh‚ÅŽÀs‚Å‚«‚½•û‚ªƒI[ƒoƒwƒbƒh‚ª¬‚³‚¢D‚Ü
    436 ‚½CThreadƒ‚[ƒh‚ÅŽÀs‚µ‚Ä‚àCŠ„‚荞‚݂̏o“ü‚èŒû‚Ő³‚µ‚­”ñƒ^ƒXƒNƒRƒ“ƒe
    437 ƒLƒXƒg‚Æ”»’è‚Å‚«‚ê‚΁CThreadƒ‚[ƒh‚Å–â‘è‚È‚¢D
    438 
    439 
    440 9DƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚݂̃Tƒ|[ƒg
     427 Handlerモードで実行
     428
     4295で議論した通り,Threadモードで実行できた方がオーバヘッドが小さい.ま
     430た,Threadモードで実行しても,割り込みの出入り口で正しく非タスクコンテ
     431キストと判定できれば,Threadモードで問題ない.
     432
     433
     4349.カーネル管理外の割込みのサポート
    441435
    4424369-1
    443  ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ðƒTƒ|[ƒg‚µ‚È‚¢
     437 カーネル管理外の割込みをサポートしない
    4444389-2
    445  ƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ðƒTƒ|[ƒg‚·‚é
    446 
    447 ƒxƒNƒ^ƒe[ƒuƒ‹‚ðƒTƒ|[ƒg‚µ‚Ä‚¨‚èCŠ„ž‚݃nƒ“ƒhƒ‰‚àCŒ¾Œê‚Å‹Lq‰Â”\‚Å‚ 
    448 ‚邽‚߁CƒTƒ|[ƒg‚ª—eˆÕ‚Å‚ ‚邽‚߁CƒTƒ|[ƒg‚·‚éD
    449 
    450 
    451 10. CPUƒƒbƒN
     439 カーネル管理外の割込みをサポートする
     440
     441ベクタテーブルをサポートしており,割込みハンドラもC言語で記述可能であ
     442るため,サポートが容易であるため,サポートする.
     443
     444
     44510. CPUロック
    452446
    45344710-1
    454  BASEPRI‚ðŽg—p
     448 BASEPRIを使用
    45544910-2
    456  FAULTMASK/PRIMASK‚ðŽg—p
    457 
    458 ƒJ[ƒlƒ‹‚ÌŠÇ—ŠO‚ÌŠ„ž‚Ý‚ðƒTƒ|[ƒg‚·‚é‚È‚çCBASEPRI‚ðŽg—p‚·‚é•K—v‚ª‚ 
    459 ‚éD
    460 
    461 
    462 11. Š„ž‚݃ƒbƒN‚ÆCPU—áŠO‚ÌŠÖŒW
     450 FAULTMASK/PRIMASKを使用
     451
     452カーネルの管理外の割込みをサポートするなら,BASEPRIを使用する必要があ
     453る.
     454
     455
     45611. 割込みロックとCPU例外の関係
    463457
    46445811-1
    465  BASEPRI‚ðŽg—p
     459 BASEPRIを使用
    46646011-2
    467  FAULTMASK/PRIMASK‚ðŽg—p
    468 
    469 FAULTMASK/PRIMASK‚ðŽg—p‚·‚é‚ƁCNMI ‚Æ Hardware Fault ˆÈŠO‚ÌCPU—áŠO‚à‹Ö
    470 Ž~‚³‚ê‚Ä‚µ‚Ü‚¤D
    471 
    472 BASEPRI‚ð—p‚¢‚é‚ƁCŠ„ž‚݃ƒbƒN’†‚É‚àCPU—áŠO‚ðŽó•t‚¯‚½‚¢ê‡‚́C
    473 BASEPRI‚ð—p‚¢‚āCÅ‚—Dæ“x‚ðCPU—áŠO‚Ì‚½‚߂ɃŠƒU[ƒu‚·‚é•K—v‚ª‚ ‚éD
    474 
    475 Š„ž‚݃ƒbƒNŽž‚àCCPU—áŠO‚ðŽó•t‚¯‚é‚悤‚É‚µ‚½‚¯‚ê‚ÎBASEPRI‚ðŽg—p‚·‚é•K
    476 —v‚ª‚ ‚éD
    477 
    478 ƒÊIRON4.0Žd—l‚Ì3.5.3‚ł́CCPU—áŠO‚Ì—Dæ“x‚ÍŽŸ‚̂悤‚É’è‚ß‚ç‚ê‚Ä‚¢‚éD
    479 
    480 "CPU—áŠOƒnƒ“ƒhƒ‰‚Ì—Dæ‡ˆÊ‚́CCPU—áŠO‚ª”­¶‚µ‚½ˆ—‚Ì—Dæ“x‚ƁCƒfƒBƒX
    481 ƒpƒbƒ`ƒƒ‚Ì—Dæ‡ˆÊ‚Ì‚¢‚¸‚ê‚©‚æ‚è‚à‚‚¢D"
    482 
    483 CPU—áŠO‚ª”­¶‚µ‚½ˆ—‚Ì—Dæ“x‚æ‚è‚à‚‚¢‚Æ‚ ‚é‚̂ŁCCPUƒƒbƒN‚⊄ž‚݃
    484 ƒbƒNó‘Ԃ̃^ƒXƒN‚Å”­¶‚µ‚½ê‡‚Å‚àC—Dæ‚µ‚ÄŽÀs‚³‚ê‚é‚ׂ«‚¾‚Æ‚àl‚¦‚ç
    485 ‚ê‚éD
    486 
    487 ˆê•ûCTOPPERS•W€Š„ž‚ݏˆ—ƒ‚ƒfƒ‹‚ÌŽd—l‘‚ł́CCPU—áŠO‚́CƒvƒƒZƒbƒT–ˆ
    488 ‚ɈقȂ邽‚߁CCPU—áŠO‚̏ˆ—ƒ‚ƒfƒ‹‚Ì•W€‰»ŒŸ“¢‚̑ΏۊO‚Æ‚µ‚Ä‚¢‚éD‚»‚Ì
    489 ‚½‚߁CARM-M‚ł̈µ‚¢‚ðŒˆ‚ß‚ÄCƒ}ƒjƒ
    490 ƒAƒ‹‚É–¾‹L‚·‚ê‚΂悢‚ƍl‚¦‚ç‚ê‚éD
    491 
    492 
    493 12. ŠO•”—Dæ“x‚Æ“à•”—Dæ“x‚Ì•ÏŠ·
    494 
    495 ŠO•”—Dæ“x‚Æ‚ÍAPI‚ÅŽw’è‚·‚銄ž‚Ý—Dæ“x(PRIŒ^)‚Ì‚±‚Æ‚Å‚ ‚èC’l‚ª¬‚³‚¢
    496 ‚Ù‚Ç—Dæ“x‚ª‚‚¢DŠ„ž‚݃nƒ“ƒhƒ‰‚ɂ́C-1‚©‚ç˜A‘±‚µ‚½•‰‚Ì’l‚ðÝ’è‰Â”\‚Å
    497 ‚ ‚éD“à•”—Dæ“x‚́CBASEPRI‚âNVIC‚Ì—Dæ“xƒŒƒWƒXƒ^‚ɐݒ肷‚é’l‚Å‚ ‚éD
    498 
    499 ŽÀ‘•‚³‚ê‚銄ž‚Ý—Dæ“x‚̃rƒbƒg•‚ð TBITW_IPRI ‚Æ‚·‚é‚ƁCÝ’è‰Â”\‚ÈŠO•”
    500 —Dæ“x‚ÍŽŸ‚̂悤‚É‚È‚éD
    501 
    502   TIPM_ENAALLi0j` -(1 << TBITW_IPRI)
    503 
    504 
    505 13. ƒJ[ƒlƒ‹ŠÇ—“à‚̍ō‚—Dæ“x(CPUƒƒbƒNó‘Ô‚Å‚Ì—Dæ“xƒ}ƒXƒN)
    506 
    507 6.‚ŏq‚ׂ½‚悤‚ɁCŠ„ž‚݂̏oŒû‚ÅSVCƒnƒ“ƒhƒ‰‚ðŒÄ‚яo‚·•K—v‚ª‚ ‚邽‚߁C
    508 SVCƒnƒ“ƒhƒ‰‚ÍCPUƒƒbƒNó‘Ô‚ÌBASEPRI‚ɐݒ肷‚é—Dæ“xƒ}ƒXƒN‚æ‚荂‚¢—Dæ“x
    509 ‚ðÝ’è‚·‚é•K—v‚ª‚ ‚éD
    510 
    511 ŽÀ‘•‚³‚ê‚銄ž‚Ý—Dæ“x‚̃rƒbƒg•‚ð TBITW_IPRIC—Dæ“x’†‚̃Tƒu—Dæ“x‚Ì
    512 ƒrƒbƒg•‚ðTBIT_IPRI‚Æ‚·‚é‚ƁCCPUƒƒbƒNó‘ԁiƒJ[ƒlƒ‹ŠÇ—“àŠ„ž‚݂ɐݒè
    513 ‰Â”\‚ȍō‚—Dæ“xj‚Æ‚µ‚ÄŽw’è‰Â”\‚È—Dæ“xƒ}ƒXƒN‚̐ݒè”͈͈͂ȉº‚Ì’l‚Ì”Í
    514 ˆÍ‚Æ‚È‚éD
    515 
    516     -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) ` -1
    517 
    518 
    519 14. –¢‰ðŒˆ‰Û‘è
    520 
    521 EŠ„ž‚݃ƒbƒN‚ÆCPU—áŠO‚ÌŠÖŒW
    522   BASEPRI‚ðŽg‚Á‚½‚Æ‚µ‚Ä‚àC‚ ‚éCPU—áŠOˆ—’†‚É‘¼‚Ì—áŠO‚ª”­¶‚·‚é‚ƁC‚»
    523   ‚Ì—áŠO‚͎󂯕t‚¯‚ç‚ê‚È‚¢‚½‚߁CITRONŽd—l‚Í–ž‚½‚¹‚È‚¢D
    524   ->‚ ‚«‚ç‚߂ă}ƒjƒ
    525 ƒAƒ‹‹LÚ‚É“¦‚°‚é‚©.
    526   ƒƒ‚ƒŠƒvƒƒeƒNƒVƒ‡ƒ“‚Ì—áŠO‚àƒ}ƒXƒN‰Â”\‚Å‚ ‚邽‚ß—vŒ“™D
    527 
    528 
    529 ˆÈãD
     461 FAULTMASK/PRIMASKを使用
     462
     463FAULTMASK/PRIMASKを使用すると,NMI と Hardware Fault 以外のCPU例外も禁
     464止されてしまう.
     465
     466BASEPRIを用いると,割込みロック中にもCPU例外を受付けたい場合は,
     467BASEPRIを用いて,最高優先度をCPU例外のためにリザーブする必要がある.
     468
     469割込みロック時も,CPU例外を受付けるようにしたければBASEPRIを使用する必
     470要がある.
     471
     472μIRON4.0仕様の3.5.3では,CPU例外の優先度は次のように定められている.
     473
     474"CPU例外ハンドラの優先順位は,CPU例外が発生した処理の優先度と,ディス
     475パッチャの優先順位のいずれかよりも高い."
     476
     477CPU例外が発生した処理の優先度よりも高いとあるので,CPUロックや割込みロ
     478ック状態のタスクで発生した場合でも,優先して実行されるべきだとも考えら
     479れる.
     480
     481一方,TOPPERS標準割込み処理モデルの仕様書では,CPU例外は,プロセッサ毎
     482に異なるため,CPU例外の処理モデルの標準化検討の対象外としている.その
     483ため,ARM-Mでの扱いを決めて,マニュアルに明記すればよいと考えられる.
     484
     485
     48612. 外部優先度と内部優先度の変換
     487
     488外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい
     489ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で
     490ある.内部優先度は,BASEPRIやNVICの優先度レジスタに設定する値である.
     491
     492実装される割込み優先度のビット幅を TBITW_IPRI とすると,設定可能な外部
     493優先度は次のようになる.
     494
     495  TIPM_ENAALL(=0)〜 -(1 << TBITW_IPRI)
     496
     497
     49813. カーネル管理内の最高優先度(CPUロック状態での優先度マスク)
     499
     5006.で述べたように,割込みの出口でSVCハンドラを呼び出す必要があるため,
     501SVCハンドラはCPUロック状態のBASEPRIに設定する優先度マスクより高い優先度
     502を設定する必要がある.
     503
     504実装される割込み優先度のビット幅を TBITW_IPRI,優先度中のサブ優先度の
     505ビット幅をTBIT_IPRIとすると,CPUロック状態(カーネル管理内割込みに設定
     506可能な最高優先度)として指定可能な優先度マスクの設定範囲は以下の値の範
     507囲となる.
     508
     509    -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) 〜 -1
     510
     511
     51214. 未解決課題
     513
     514・割込みロックとCPU例外の関係
     515  BASEPRIを使ったとしても,あるCPU例外処理中に他の例外が発生すると,そ
     516  の例外は受け付けられないため,ITRON仕様は満たせない.
     517  ->あきらめてマニュアル記載に逃げるか.
     518  メモリプロテクションの例外もマスク可能であるため要件等.
     519
     520
     521以上.
Note: See TracChangeset for help on using the changeset viewer.