Changeset 95 for ssp_qb_r5f100le_cs/trunk/arch/arm_m_gcc/prc_design.txt
- Timestamp:
- Jun 2, 2015, 3:39:53 PM (9 years ago)
- 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 1 1 ===================================================================== 2 ARM-M vZbT˶Ýv2 ARM-Mプロセッサ依存部設計メモ 3 3 Last Modified: 23 Aug 2008 21:54:54 4 4 ===================================================================== 5 5 6 ±ÌhL 7 gÌÊuï 8 9 ±ÌhL 10 gÍCTOPPERS/ASPJ[lðARMvX-MvZbTÉÚA·é½ß 11 ÌÝvÅ éD 12 13 14 ARMVx-MÌdlÜÆß 15 16 ARMvX-MÌdl̤¿CJ[lÌÝvÉÖW·éÉ¢ÄÜÆßéD 17 18 WX^ 19 20 ÄpWX^ÍR0`R15Ì16íÞ èCR13Ìݪ2oN\¬iPSP,MSPjÆÈ 21 ÁÄ¢éDR15ÍPC, R14ÍNWX^iLRjÆÈÁÄ¢éDR0`R3,R12Í 22 XNb`WX^Å éD 23 24 R[ORxV 25 26 R0`R4ªøC»êÈãÍX^bNDßèlÍCR0`R1Éi[³êéD(ARMÉ 27 æèKè³êÄ¢é½ßCRpCÉ˶¹¸±Ì[ÆÈéD) 28 29 CONTROLWX^ 30 31 PSP,MSPÌØèÖ¦CPrivilageÆUser[hÌWX^DÏXãÍCCXg 32 NVobt@tbV 33 ½ßðÀs·éKvª éiisbjDCONTROL 34 WX^ÌÚ×ÍCARMv7-M Architecture Application Level Reference 35 Manual Ì B1-9 ðQÆ̱ÆD 36 37 ÝxN^ 38 39 xN^e[u^ÅCxN^e[uÌAhXÍCZbgÍ0x00ÅC 40 Vector Table Offset Registeri}bvhWX^j ðì·é±Æ 41 ÅCCÓÌAhXÉzuÂ\Å éD 42 43 Dæx 44 45 lª¬³¢ûªDæxÆÈéD 46 47 DæxÍÅå8bitÅ èCSoCÉÀ³êÄ¢érbgªÙÈéDÀ³ 48 êérbgª8bitȺÌêÍCLSB©ç³øÉÈéDá¦ÎCÀ³êÄ¢ 49 érbgª7bitÌêÍCrbg0ª³øÆÈéD 50 51 DæxÌrbgtB[hÌLSB©çrbgðTuDæxÆÄÔtB[h 52 ÉÝè·é±ÆªÂ\Å éDcèÌãÊrbgðvGvVDæxÆ 53 ÄÔDvGvVDæxª¯¶ÅCTuDæxªÙÈéDæxÌO[ 54 vÍC¨Ý¢ðvGvg·é±ÆªÅ«È¢D 55 56 Reset,NMI,Hard Fault ÈOÌáOÍÝƯlÉDæxªÝèÂ\Å èC 57 Ý}XN@\ÉæèC¶ðÖ~·é±ÆªÂ\Å éD 58 59 CPU[h 60 61 vZbTÍCThread[hàµÍHandler[hÌ¢¸ê©Ì[hÆÈ 62 éD 63 64 ZbgÌóÔ 65 66 ZbgÍThread[hCMSPªLøÆÈÁÄ¢éD 67 68 Handler[h 69 70 áO/Ýðó¯t¯éÆJÚ·é[hDó¯t¯½áO/ÝÌáOÔ 71 ªCIPSRÉZbg³êéDáOÔÍCTRMÅèßçêÄ¢éÔÅ éD 72 73 áO áOÔ 6 ○このドキュメントの位置づけ 7 8 このドキュメントは,TOPPERS/ASPカーネルをARMvX-Mプロセッサに移植するため 9 の設計メモである. 10 11 12 ○ARMVx-Mの仕様まとめ 13 14 ARMvX-Mの仕様のうち,カーネルの設計に関係する事項についてまとめる. 15 16 ●レジスタ 17 18 汎用レジスタはR0〜R15の16種類あり,R13のみが2バンク構成(PSP,MSP)とな 19 っている.R15はPC, R14はリンクレジスタ(LR)となっている.R0〜R3,R12は 20 スクラッチレジスタである. 21 22 ●コーリングコンベンション 23 24 R0〜R4が引数,それ以上はスタック.戻り値は,R0〜R1に格納される.(ARMに 25 より規定されているため,コンパイラに依存せずこのルールとなる.) 26 27 ●CONTROLレジスタ 28 29 PSP,MSPの切り替え,PrivilageとUserモードのレジスタ.変更後は,インスト 30 ラクションバッファフラッシュ命令を実行する必要がある(isb).CONTROLレ 31 ジスタの詳細は,ARMv7-M Architecture Application Level Reference 32 Manual の B1-9 を参照のこと. 33 34 ●割込みベクタ 35 36 ベクタテーブル型で,ベクタテーブルのアドレスは,リセット時は0x00で, 37 Vector 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 53 Reset,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 例外 例外番号 74 71 Reset 1 75 72 Non-makable Interrupt 2 … … 86 83 .. 87 84 88 áO/Ýðó¯t¯éÆCó¯t¯½áO/ÝÌDæxȺÌáO/ 89 ÝðÖ~·éD±ÌDæx}XNð"NVICDæx}XN"ÆÄÔD±ÌDæx 90 ÍC\tgEFA©çÏX·é±ÆªÅ«¸CáO/ÝÌ^[Éæè 91 ÝOÌlÉ©®IÉßéD 92 93 X^bN|C^iPSPÆMSPj 94 95 X^bN|C^ÍCPSPÆMSPª èCr¼IÉgpÂ\Å éDHandler 96 [hÅÍMSPÌÝgpÂ\Å èCThread[hÅÍCONTROLWX^ÅIð 97 \Å éDCONTROLWX^Ì1rbgÚðZbg·éÆPSPªLøÉCNA 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 ÄÔjDEXC_RETURN̺Ê4bitÉæèCJÚæÌ[hâgp·éX^bN| 106 C^ðÏXÂ\Å éDáO^[ÉæèCPRIMASKâBASEPRIÌlÍÏ» 107 µÈ¢DêûCFAULTMASKÌlÍ'0'ÉNA³¹éD 108 109 EXC_RETURN110 111 áO/Ýót¯ÉlrÉÝè³êélDrbg31`4rbgÍSÄ'1'ÅC 112 ºÊ4bitÍCót¯ÌCPU[hâX^bNð½fµ½lÆÈÁÄ¢éD 113 114 0b0001 : Handler [h115 0b1001 : Thread [hwith MSP116 0b1101 : Thread [hwith PSP117 118 Thread[hÆHandler[hÌ»è 119 120 »óÌ[hð»è·éÉÍCIPSRð©ÄC'0'ÈçThread[hC»êÈO 121 ÈçCHandler[hÆÈéD 122 123 BASEPRIWX^ 124 125 Ýèµ½DæxȺÌDæxÌÝÌótðÖ~·éD±ÌDæx}XNð 126 "BASEPRI Dæx}XN"ÆÄÔD'0'ðÝè·éÆCSÄÌÝð·éD127 áO/ÝÌótÆ^[ÉæèÏ»µÈ¢DáO/ÝÉηéÝ 128 Dæx}XNÍCNVICDæx}XNÆBASEPRIÌÝèlÌ¢ûilª¬³¢ 129 ûjÆÈéD 130 131 FAULTMASK132 133 FAULTMASK Í'1'ðZbg·é±ÆÉæèCNMIÈOÌSÄÌÝðÖ~·éD134 FAULTMASK ÍCáOÌ^[Éæè'0'ÉNA³¹éD135 136 PRIMASKÆWFI137 138 PRIMASK ð'1'ÉÝè·éÆCNMI Æ Hardware Fault ÈOÌáO/ÝðÖ139 ~·éDPRIMASKÍÝÌÂÆÝÒ¿ðAg~bNÉs¤½ßÉp¢ 140 éDïÌIÉÍCPRIMASKªZbg³êÄ¢éóÔÅwfiðÀs·éÆCè 141 ÝÒ¿ÆÈèCÝót¯éÆnhðÀs¹¸ÉCwfi©ç^[µ 142 ÄéD 143 144 áO/ÝÌót 145 146 EáO/Ýðót¯éÆCót¯ÉANeBuÈX^bNãÉȺÌR 147 eLXgðÛ¶·é(áOt[ÆÄÔ)D85 例外/割込みを受け付けると,受け付けた例外/割込みの優先度以下の例外/割 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 99 ThreadモードからHandlerモードへの遷移は,例外/割込みを受け付けることで 100 発生する.一方,HandlerモードからThreadモードへの遷移は,PCに 101 EXC_RETURN(0xfffffffx)の値を設定することにより行う(例外リターン処理と 102 呼ぶ).EXC_RETURNの下位4bitにより,遷移先のモードや使用するスタックポ 103 インタを変更可能である.例外リターンにより,PRIMASKやBASEPRIの値は変化 104 しない.一方,FAULTMASKの値は'0'にクリアさせる. 105 106 ●EXC_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 128 ●FAULTMASK 129 130 FAULTMASKは'1'をセットすることにより,NMI以外の全ての割込みを禁止する. 131 FAULTMASKは,例外のリターン処理により'0'にクリアさせる. 132 133 ●PRIMASKとWFI 134 135 PRIMASKを'1'に設定すると,NMI と Hardware Fault 以外の例外/割込みを禁 136 止する.PRIMASKは割込みの許可と割込み待ちをアトミックに行うために用い 137 る.具体的には,PRIMASKがセットされている状態でwfiを実行すると,割り込 138 み待ちとなり,割込み受付けるとハンドラを実行せずに,wfiからリターンし 139 てくる. 140 141 ●例外/割込みの受付 142 143 ・例外/割込みを受付けると,受付け時にアクティブなスタック上に以下のコ 144 ンテキストを保存する(例外フレームと呼ぶ). 148 145 149 146 ----------- … … 166 163 | | <- old SP 167 164 168 EvZbTðHandler[hÆ·éDMSPªLøÆÈéD 169 Eót¯½áO/ÝÌáOÔðIPSRÉÝè·éD 170 ENVICÝDæx}XNðót¯½áO/ÝÌDæxÉÝè·éD 171 ElrÉEXC_RETURNÌlªÝè³êéD 172 ExN^e[uðÇÝÝnhðÀs·éD 173 174 áO/Ý©çÌ^[ 175 176 pc ÉEXC_RETURNÌlðÝè·é±ÆÉæèCáO/Ý©ç^[·éD177 pc ÖÌÝèÉgpÂ\ȽßÉͧÀª èCȺ½ßªgpÂ\Å éD178 179 EPOP/LDM, LDR, BX180 181 ¢ðÛè 182 183 ExN^[e[uÉo^·éÖÌAhXÌLSBÍ'1'É·é׫©?184 ENVICÍáOEÝÌlXgñðàIÉǵĢéçµ¢D 185 (! t@Xð¾ç©É)D186 \tgEFAÅÍClXgÌ Kðí¹êÎC^[X^bNðU¢µ187 ÄàâèÈ¢©D188 189 190 OSÌÀ 191 192 1. ^[Qbg¼165 ・プロセッサをHandlerモードとする.MSPが有効となる. 166 ・受付けた例外/割込みの例外番号をIPSRに設定する. 167 ・NVIC割込み優先度マスクを受付けた例外/割込みの優先度に設定する. 168 ・lrにEXC_RETURNの値が設定される. 169 ・ベクタテーブルを読み込みハンドラを実行する. 170 171 ●例外/割込みからのリターン 172 173 pcにEXC_RETURNの値を設定することにより,例外/割込みからリターンする. 174 pcへの設定に使用可能な命令には制限があり,以下命令が使用可能である. 175 176 ・POP/LDM, LDR, BX 177 178 ●未解決課題 179 180 ・ベクターテーブルに登録する関数のアドレスのLSBは'1'にするべきか? 181 ・NVICは例外・割込みのネスト回数を内部的に管理しているらしい. 182 (!リファレンスを明らかに). 183 ソフトウェアでは,ネストの帳尻を合わせれば,リターンスタックを偽造し 184 ても問題ないか. 185 186 187 ○OSの実装 188 189 1.ターゲット名 193 190 194 191 1-1 cm3(Cortex-M3) … … 196 193 1-3 arm_m 197 194 198 cm3 ÅÍCCoretex-M1(armv6-m)ðT|[g·éêÉâèÆÈéDarmv7mÅÍC199 armv8m ª[X³ê½êÉâèÆÈéDARM˶ÍJSPÅÍCarmv4ÆÈ200 ÁÄ¢½ªCarmv5âarmv7à®ì·é½ßASPÅÍPÉarmƵ½D»Ì½ßC 201 arm_m ª³ïÆl¦çêéD202 203 204 2.Thread [hÆHandler[hÌg¢ª¯195 cm3では,Coretex-M1(armv6-m)をサポートする場合に問題となる.armv7mでは, 196 armv8mがリリースされた場合に問題となる.ARM依存部はJSPでは,armv4とな 197 っていたが,armv5やarmv7も動作するためASPでは単にarmとした.そのため, 198 arm_mが無難と考えられる. 199 200 201 2.ThreadモードとHandlerモードの使い分け 205 202 206 203 2-1 207 ^XNReLXgÍThread[hCñ^XNReLXgÍHandler[208 hŮ쳹éD204 タスクコンテキストはThreadモード,非タスクコンテキストはHandlerモー 205 ドで動作させる. 209 206 210 207 2-2 211 ^XNReLXgÆñ^XNReLXg¤ÉHandler[hŮ쳹212 éD213 214 vZbTÌÝvûjðl¶·éÆ2-1ªLÍD2-1ÅÌâè_ƵÄÍC 215 Ýnh©ç^XNÖÌ^[É[hÌÏXªÈºÌlɽ·é± 216 ƪ°çêéD 217 218 1. Ýnh : Handler[h219 2. ^XNáOnhÌÄÑoµ : Thread[h220 3. ^XNÖÌ^[ : Handler[h221 4. ^XNÌÄJ : Thread[h222 223 3 ÅHandler[hÉÚs·éKvª éÌÍCáOt[ðp¢ÄA·é224 ÉÍCHandler[hÅáO^[ðs¤Kvª é½ßÅ éDARMÅ 225 ÍC¡WX^Ì[hÆCPSRÌAð¯És¦éªCM3Ís¦È¢½ßC 226 ±Ìû@ÅÝæÌ^XNÉ^[·éKvª éD 227 228 2-2 ÌêÌÝnh©ç^XNÖÌ^[É[hÌÏXðȺ229 ɦ·DܽC2-2ÅÍÝDæxÌÅálð^XNÌÀsÌDæxƵ 230 ÄU[u·éKvª éD 231 232 1. Ýnh : Handler[h233 2.NVIC Dæx}XN'0'ð0Ö : Thread[h234 3. ÅáDæxÌHandler[hÖ : Handler[h235 4. ^XNáOnhÌÄÑoµ : Handler[h236 5. ^XNÖÌ^[ÌO : Thread[h237 3. ^XNÖÌ^[ : Handler[h238 4. ^XNÌÄJ : Handler[h239 240 Ýnh©ç^XNÌ^[ÉÖµÄÍC2-2Å ÁÄàC2ðÀs· 241 éêÉCNVICDæx}XNð'0'É·é½ßCáO^[ðs¤Kv 242 ª éDܽCNVIC©ÌªCÝÌlXgñðǵĢé½ßC3©ç4243 ÖÌJÚ̽ßÉC¢Á½ñáO/Ýðót¯½óÔÉ·éKvª é½ 244 ßCÊIÉ2-1ÈãÌJÚªKvÆÈéD 245 246 2-2 ÌêÍCMSPµ©g¦È¢½ßCÝÌüèûÅlXgñð»fµÄC247 X^bNðüêÖ¦éKvª éD 248 249 HRP ÅÛìðp¢éêÍ2-1ÆÈéD250 251 ÈãÌRÉæèC2-1ðÌp·éD½¾µ2-1ÍCJ[lN®ÆIDLE[ 252 v̵¢ð¢·éKvª éD±êçÉ¢ÄÍÊrc_·éD 253 254 255 3. fBXpb`ÌÀs[h208 タスクコンテキストと非タスクコンテキスト共にHandlerモードで動作させ 209 る. 210 211 プロセッサの設計方針を考慮すると2-1が有力.2-1での問題点としては,割込 212 みハンドラからタスクへのリターン時にモードの変更が以下の様に多発するこ 213 とが挙げられる. 214 215 1.割込みハンドラ : Handlerモード 216 2.タスク例外ハンドラの呼び出し : Threadモード 217 3.タスクへのリターン処理 : Handlerモード 218 4.タスクの再開 : Threadモード 219 220 3でHandlerモードに移行する必要があるのは,例外フレームを用いて復帰する 221 には,Handlerモードで例外リターン処理を行う必要があるためである.ARMで 222 は,複数レジスタのロードとCPSRの復帰を同時に行えるが,M3は行えないため, 223 この方法で割込み先のタスクにリターンする必要がある. 224 225 2-2の場合の割込みハンドラからタスクへのリターン時にモードの変更を以下 226 に示す.また,2-2では割込み優先度の最低値をタスクの実行時の優先度とし 227 てリザーブする必要がある. 228 229 1.割込みハンドラ : Handlerモード 230 2.NVIC優先度マスク'0'を0へ : Threadモード 231 3.最低優先度のHandlerモードへ : Handlerモード 232 4.タスク例外ハンドラの呼び出し : Handlerモード 233 5.タスクへのリターンの前処理 : Threadモード 234 3.タスクへのリターン : Handlerモード 235 4.タスクの再開 : Handlerモード 236 237 割込みハンドラからタスクのリターンに関しては,2-2であっても,2を実行す 238 る場合に,NVIC優先度マスクを'0'にするため,例外リターン処理を行う必要 239 がある.また,NVIC自体が,割込みのネスト回数を管理しているため,3から4 240 への遷移のために,いったん例外/割込みを受付けた状態にする必要があるた 241 め,結果的に2-1以上の遷移が必要となる. 242 243 2-2の場合は,MSPしか使えないため,割込みの入り口でネスト回数を判断して, 244 スタックを入れ替える必要がある. 245 246 HRP等でメモリ保護を用いる場合は2-1となる. 247 248 以上の理由により,2-1を採用する.ただし2-1は,カーネル起動時とIDLEルー 249 プの扱いを検討する必要がある.これらについては別途議論する. 250 251 252 3.ディスパッチャの実行モード 256 253 257 254 3-1 258 Thread [hÅÀs·é255 Threadモードで実行する 259 256 260 257 3-2 261 Handler [hÅÀs·é262 263 fBXpb`ðThread[hÅÀs·éÆCÝÉæèvGvg³ê 264 ½^XNÉßéêÍÌæ¤ÈpXÉÈéD 265 266 1. fBXpb`ÄÑoµ : Thread[h267 2. fBXpb`Às : Thread[h268 3. ^XNáOÀs : Thread[h269 4 D^XNÖÌ^[ : Handler[h270 5. ^XNÌÄJ : Thread[h271 272 Ýnh©ç©çfBXpb`µ½^XNÖ^[·éêÍÌp 273 XÉÈéD 274 275 1. Ýnh : Handler[h276 2. fBXpb`Às : Thread[h277 3. ^XNáOnhÌÄÑoµ : Thread[h278 4. ^XNÖÌ^[ : Handler[h279 5. ^XNÌÄJ : Thread[h280 281 êûCfBXpb`ðHandler[hÅÀs·éÆCÝÉæèvG 282 vg³ê½^XNÉßéêÍÌæ¤ÈpXÉÈéD 283 284 1. fBXpb`ÄÑoµ : Thread[h285 2. fBXpb`Às : Handler[h286 3. ^XNáOÀs : Thread[h287 4 D^XNÖÌ^[ : Handler[h288 5. ^XNÌÄJ : Thread[h289 290 ÝnhÌoû©ç©çfBXpb`µ½^XNÖ^[·éêÍ 291 ÌpXÉÈéD 292 293 1. Ýnh : Handler[h294 2. fBXpb`Às : Handler[h295 3. ^XNáOnhÌÄÑoµ : Thread[h296 4. ^XNÖÌ^[ : Handler[h297 5. ^XNÌÄJ : Thread[h298 299 ^XNáOnhªÈ¢OSÌêÍCHandler[hÅÀsµ½ûª[h 300 ÌJÚÌñª¸éªC^XNáOnhª éÆCThread[hÌûªJ 301 Úñª¸é½ßCThread[hÆ·éD 302 303 Ûìðl¶·éÆCfBXpb`ÍHandler[hŮ쳹½ûª 304 ø¦ªæ¢Æl¦çêéiSVCÅnhðÄÑo·ÆHandler[hÆÈé½ 305 ßjD 306 307 308 4. X^bNÌ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 305 4.スタックの使い分け 309 306 310 307 4-1 311 ^XNReLXgðPSP, ñ^XNReLXgðMSP308 タスクコンテキストをPSP, 非タスクコンテキストをMSP 312 309 4-2 313 ^XNReLXgCñ^XNReLXg¤ÉMSP314 315 4-2 ÌêCÝÌüèûÅlXgñð»fµÄCX^bNðüêÖ¦é316 Kvª éD2Å^XNReLXgÍThread[hCñ^XNReLXg 317 ÍHandler[hŮ쳹éƵ½½ßC4-1ðÌp·éÆCÝÌüèû 318 Å©®IÉX^bNªØèÖíéDThread[hÅÌPSPÌANZXàC 319 mrs/msr ½ßÅs¦é½ßC4-1ðÌp·éD320 321 322 5. ReLXgÌ»è310 タスクコンテキスト,非タスクコンテキスト共にMSP 311 312 4-2の場合,割込みの入り口でネスト回数を判断して,スタックを入れ替える 313 必要がある.2でタスクコンテキストはThreadモード,非タスクコンテキスト 314 はHandlerモードで動作させるとしたため,4-1を採用すると,割込みの入り口 315 で自動的にスタックが切り替わる.ThreadモードでのPSPのアクセスも, 316 mrs/msr命令で行えるため,4-1を採用する. 317 318 319 5.コンテキストの判定 323 320 324 321 5-1 325 IPSR ª'0'(Thread[h)Èç^XN^XNReLXgC'1'(Handler[326 h)Èçñ^XNReLXgÆ·éD322 IPSRが'0'(Threadモード)ならタスクタスクコンテキスト,'1'(Handlerモー 323 ド)なら非タスクコンテキストとする. 327 324 328 325 5-2 329 ÝÌlXgñðÛ·éÏðpÓD1ÈãÅñ^XNReLXgD326 割込みのネスト回数を保持する変数を用意.1以上で非タスクコンテキスト. 330 327 331 328 5-3 332 ANeBuÈX^bNÉæè»fiMSPÈçñ^XNReLXgCPSPÈç333 ^XNReLXgÆ·éj334 335 5-1 ÍC\tgEFA¤ÅReLXgÇ̽ßÌðs¤KvªÈ¢Æ336 ¢¤bgª éDµ©µÈªçCJ[lÌN®Thread[hÅ é½ 337 ßCHandler[hÖÚs·éKvª éDASPJ[lÅÍCIDLE[vÀs 338 Íñ^XNReLXgƵĮ쳹éKvª é½ßCIDLE[vÍ 339 Handler [hŮ쳹éKvª éDIDLE[vÍfBXpb`©çÄ340 Ño³êéD3Åèß½æ¤ÉCfBXpb`ðThread[hŮ쳹é 341 ½ßCIDLE[vðÄÑo·ÛÉÍCHandler[hÖJÚ·éKvª éD 342 Handler [hÖÌJÚÍCSVC/PendSVCðp¢éÆÀ»Â\Å éªC6Ì343 ÝÉvGvg³ê½^XNÖÌ^[ÌHandler[hÖÌÚsÅ 344 àSVC/PendSVCÌgpªKvÆÈé½ßCSVCnhÅÍCÇÌÚIÅÄÑo 345 ³ê½©»è·éKvªoÄé½ßCI[owbhªå·éD 346 347 5-2 ÅÍCJ[lN®âIDLE[vÉÏð'1'ÉÝè·êÎ梱ÆÉ348 ÈéD±ÌêCJ[lN®âIDLE[vÉThread[hÅÀsµÄà 349 ®ìÉâèªÈ¢æ¤CÁÉÝÌoüèûÌÝvðÓ·éKvª éD 350 351 J[lN®ÉÖµÄÍCSÝðÖ~µÄ¨èCݪüçÈ¢ÌÅ 352 ÁÉâèÍÈ¢DIDLE[vÍCThread[hÅMSPÆPSPÌIðªÂ\Å 353 é±ÆðpµÄCñ^XNReLXgÌX^bNÅ éMSPÉÏX·éD 354 áO/ÝÌüèûÅÍC½dÝÅ é©ðEXC_RETURNÌ[h»èÌ 355 rbgÅÍÈCX^bNÌ»èrbgÅs¦ÎâèÈ¢DáO/Ý©ç 356 Ì^[ÉÖµÄÍC½dÝÌ»èÍCüèûƯlÉEXC_RETURNÌX 357 ^bN»èrbgÅs¦Îæ¢DáO^[ÉpcÉãü·é 358 EXC_RETURN Ìlðê¥0xfffffffd (Thread[h with MSP)Æ·éÌÅÍÈC359 áO/Ýót¯ÉLRÉÝè³êéEXC_RETURNðp¢é±ÆÉæèCIDLE360 [vÉèñ¾êÅàâèÈ^[·éD 361 362 J[lN®ÍCMSPªANeBuÅ èCÝnhÀsÍHandler363 [hÅ é±Æ©çMSPªANeBuÅèCIDLE[vÉMSPðANeBu 364 ÉÝè·éÆCñ^XNReLXgÍSÄCMSPðANeBuÉµÄ®ì· 365 é±ÆÉÈéDܽCÝÍÝOÉANeBuÈX^bNÌîñªC 366 EXC_RETURN ÉÝè³êéD»Ì½ßCReLXgÌ»èÍCÝlXgñ367 ðÛ·éϪÈÆàCANeBuÈX^bNð©êÎ梱ÆÉÈéD 368 ܽCexc_sense_context()ÉÖµÄÍCáOt[ÉEXC_RETURNðÇÁ 369 µC»ÌàeÉæè»f·êÎæ¢DÈãÌRÉæèC5-3ðÌp·éD 370 371 372 6. ÝÉvGvg³ê½^XNÖÌ^[ÌHandler[hÖÌÚ373 sû@329 アクティブなスタックにより判断(MSPなら非タスクコンテキスト,PSPなら 330 タスクコンテキストとする) 331 332 5-1は,ソフトウェア側でコンテキスト管理のための処理を行う必要がないと 333 いうメリットがある.しかしながら,カーネルの起動時Threadモードであるた 334 め,Handlerモードへ移行する必要がある.ASPカーネルでは,IDLEループ実行 335 は非タスクコンテキストとして動作させる必要があるため,IDLEループは 336 Handlerモードで動作させる必要がある.IDLEループはディスパッチャから呼 337 び出される.3で定めたように,ディスパッチャをThreadモードで動作させる 338 ため,IDLEループを呼び出す際には,Handlerモードへ遷移する必要がある. 339 Handlerモードへの遷移は,SVC/PendSVCを用いると実現可能であるが,6の割 340 込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移行で 341 もSVC/PendSVCの使用が必要となるため,SVCハンドラでは,どの目的で呼び出 342 されたか判定する必要が出てくるため,オーバヘッドが増大する. 343 344 5-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に代入する 355 EXC_RETURNの値を一律0xfffffffd (Threadモード with MSP)とするのではなく, 356 例外/割込み受付け時にLRに設定されるEXC_RETURNを用いることにより,IDLE 357 ループに割り込んだ場合でも問題なくリターンする. 358 359 カーネル起動時は,MSPがアクティブであり,割込みハンドラ実行時はHandler 360 モードであることからMSPがアクティブでり,IDLEループ時にMSPをアクティブ 361 に設定すると,非タスクコンテキストは全て,MSPをアクティブにして動作す 362 ることになる.また,割込み時は割込み前にアクティブなスタックの情報が, 363 EXC_RETURNに設定される.そのため,コンテキストの判定は,割込みネスト回 364 数を保持する変数がなくとも,アクティブなスタックを見ればよいことになる. 365 また,exc_sense_context()に関しては,例外フレーム中にEXC_RETURNを追加 366 し,その内容により判断すればよい.以上の理由により,5-3を採用する. 367 368 369 6.割込みにプリエンプトされたタスクへのリターン時のHandlerモードへの移 370 行方法 374 371 375 372 6-1 376 SVC ðp¢é373 SVCを用いる 377 374 6-2 378 PendSVCðp¢é 379 380 PendSVCÆSVCÌá¢ÍCPendSVCªvªL 381 [CO³êCSVCÍvªL 382 383 [CO³êÈ¢±ÆÅ éDÝÉvGvg³ê½^XNÖÌ^[ 384 ÌHandler[hÖÌÚsÍCL 385 [CO³ê¸É¦ÀɳêéK 386 vª é½ßCÇ¿çÅÀ»µÄàâèÈ¢DÇ¿çðJ[lÌ\[Xµ 387 Ägp·é©ÌIð¾¯Å éD 388 389 Ç¿çðg¤ÆµÄàCDæxÌÝèªâèÆÈéDfBXpb`©ç 390 ÝÉvGvg³ê½^XNÖÌ^[ÜÅÌÍCÈÆàCPU 391 bNóÔÅÀs³êȯêÎÈçÈ¢DSVCâPendSVCÍÇ¿çàÝDæx 392 ð½ßCNVICDæx}XNæèBASEPRIDæx}XNÌûª¢êC 393 ³êÈ¢D 394 395 CPUbNóÔðBASEPRIÌÝèÅÀ»µ½êC»ÌÝèlðSVCâPendSVCÉ 396 Ýèµ½læèá·éKvª éD¾¢·¦éÆCSVCâPendSVCÌDæxð 397 CPUbNÌDæx}XNÌlæè¢li¼ÌÝæè¢DæxjÆ 398 ·éKvª éD 399 400 CPUbNóÔðFAULTMASKâPRIMASKÅÀ»µ½êÍC±êçªÝè³êé 401 ÆCSVCâPendSVCªót¯çêÈ¢½ßC¢Á½ñBASEPRIÉæèÝð} 402 XN·éæ¤ÉÝè·éKvª éD±ÌêàCSVCâPendSVCͼÌÝ 403 æè¢DæxðÝè·éKvª éD 404 405 ÈãÉæèCHandler[hÖÌÚs̽ßÉÍCCPUbNóÔðBASEPRIÅ 406 À»µCSVCâPendSVCÉÝè·éDæxðJ[lÇàÌÅDæxæèê 407 ¢DæxÉÝè·éKvª éD 408 409 410 7. áO/ÝoüèûÅ̽dÝÌ»f 375 PendSVCを用いる 376 377 PendSVCとSVCの違いは,PendSVCが要求がキューイングされ,SVCは要求がキュ 378 ーイングされないことである.割込みにプリエンプトされたタスクへのリター 379 ン時のHandlerモードへの移行は,キューイングされずに即座に処理される必 380 要があるため,どちらで実現しても問題ない.どちらをカーネルのリソースし 381 て使用するかの選択だけである. 382 383 どちらを使うとしても,優先度の設定が問題となる.ディスパッチャから割込 384 みにプリエンプトされたタスクへのリターンまでの処理は,少なくともCPUロ 385 ック状態で実行されなければならない.SVCやPendSVCはどちらも割込み優先度 386 を持つため,NVIC優先度マスクよりBASEPRI優先度マスクの方が高い場合,処 387 理されない. 388 389 CPUロック状態をBASEPRIの設定で実現した場合,その設定値をSVCやPendSVCに 390 設定した値より低くする必要がある.言い換えると,SVCやPendSVCの優先度を 391 CPUロック時の優先度マスクの値より高い値(他の割込みより高い優先度)と 392 する必要がある. 393 394 CPUロック状態をFAULTMASKやPRIMASKで実現した場合は,これらが設定される 395 と,SVCやPendSVCが受付けられないため,いったんBASEPRIにより割込みをマ 396 スクするように設定する必要がある.この場合も,SVCやPendSVCは他の割込み 397 より高い優先度を設定する必要がある. 398 399 以上により,Handlerモードへの移行のためには,CPUロック状態をBASEPRIで 400 実現し,SVCやPendSVCに設定する優先度をカーネル管理内の最高優先度より一 401 つ高い優先度に設定する必要がある. 402 403 404 7. 例外/割込み出入り口での多重割込みの判断 411 405 412 406 7-1 413 EXC_RETURN Ì[h»èrbg407 EXC_RETURNのモード判定ビット 414 408 7-2 415 EXC_RETURN ÌX^bN»èrbg409 EXC_RETURNのスタック判定ビット 416 410 7-3 417 ÝlXgñÌÇÏ418 419 áO/Ýót¯ÍCót¯½áO/ÝȺÌÝÍÖ~·éªCS 420 ÝÖ~óÔÉÍÈçÈ¢D»Ì½ßCÝlXgñÌÇÏðC 421 Ng·éOÉݪüéÂ\«ª é½ßC7-3Ígp·é±ÆªÅ 422 «È¢D 423 424 5 Åc_µ½ÊèCIDLE[vðThread[hÅÀs·é½ßC7-1ÅÍÈC425 7-2 Å»f·éKvª éD426 427 428 8. IDLE [v411 割込みネスト回数の管理変数 412 413 例外/割込み受付け時は,受付けた例外/割込み以下の割込みは禁止するが,全 414 割込み禁止状態にはならない.そのため,割込みネスト回数の管理変数をイン 415 クリメントする前に割込みが入る可能性があるため,7-3は使用することがで 416 きない. 417 418 5で議論した通り,IDLEループをThreadモードで実行するため,7-1ではなく, 419 7-2で判断する必要がある. 420 421 422 8. IDLEループ 429 423 430 424 8-1 431 Thread [hÅÀs425 Threadモードで実行 432 426 8-2 433 Handler [hÅÀs434 435 5 Åc_µ½ÊèCThread[hÅÀsÅ«½ûªI[owbhª¬³¢DÜ436 ½CThread[hÅÀsµÄàCèÝÌoüèûųµñ^XNRe 437 LXgÆ»èÅ«êÎCThread[hÅâèÈ¢D 438 439 440 9 DJ[lÇOÌÝÌT|[g427 Handlerモードで実行 428 429 5で議論した通り,Threadモードで実行できた方がオーバヘッドが小さい.ま 430 た,Threadモードで実行しても,割り込みの出入り口で正しく非タスクコンテ 431 キストと判定できれば,Threadモードで問題ない. 432 433 434 9.カーネル管理外の割込みのサポート 441 435 442 436 9-1 443 J[lÇOÌÝðT|[gµÈ¢437 カーネル管理外の割込みをサポートしない 444 438 9-2 445 J[lÇOÌÝðT|[g·é446 447 xN^e[uðT|[gµÄ¨èCÝnhàC¾êÅLqÂ\Å 448 é½ßCT|[gªeÕÅ é½ßCT|[g·éD 449 450 451 10. CPU bN439 カーネル管理外の割込みをサポートする 440 441 ベクタテーブルをサポートしており,割込みハンドラもC言語で記述可能であ 442 るため,サポートが容易であるため,サポートする. 443 444 445 10. CPUロック 452 446 453 447 10-1 454 BASEPRI ðgp448 BASEPRIを使用 455 449 10-2 456 FAULTMASK/PRIMASK ðgp457 458 J[lÌÇOÌÝðT|[g·éÈçCBASEPRIðgp·éKvª 459 éD 460 461 462 11. ÝbNÆCPUáOÌÖW450 FAULTMASK/PRIMASKを使用 451 452 カーネルの管理外の割込みをサポートするなら,BASEPRIを使用する必要があ 453 る. 454 455 456 11. 割込みロックとCPU例外の関係 463 457 464 458 11-1 465 BASEPRI ðgp459 BASEPRIを使用 466 460 11-2 467 FAULTMASK/PRIMASKðgp 468 469 FAULTMASK/PRIMASKðgp·éÆCNMI Æ Hardware Fault ÈOÌCPUáOàÖ 470 ~³êĵܤD 471 472 BASEPRIðp¢éÆCÝbNÉàCPUáOðót¯½¢êÍC 473 BASEPRIðp¢ÄCÅDæxðCPUáO̽ßÉU[u·éKvª éD 474 475 ÝbNàCCPUáOðót¯éæ¤Éµ½¯êÎBASEPRIðgp·éK 476 vª éD 477 478 ÊIRON4.0dlÌ3.5.3ÅÍCCPUáOÌDæxÍÌæ¤ÉèßçêÄ¢éD 479 480 "CPUáOnhÌDæÊÍCCPUáOª¶µ½ÌDæxÆCfBX 481 pb`ÌDæÊÌ¢¸ê©æèà¢D" 482 483 CPUáOª¶µ½ÌDæxæèà¢Æ éÌÅCCPUbNâÝ 484 bNóÔÌ^XNŶµ½êÅàCDæµÄÀs³êé׫¾Æàl¦ç 485 êéD 486 487 êûCTOPPERSWÝfÌdlÅÍCCPUáOÍCvZbT 488 ÉÙÈé½ßCCPUáOÌfÌW»¢ÌÎÛOƵĢéD»Ì 489 ½ßCARM-MÅ̵¢ðßÄC}j 490 AɾL·êÎæ¢Æl¦çêéD 491 492 493 12. ODæxÆàDæxÌÏ· 494 495 ODæxÆÍAPIÅwè·éÝDæx(PRI^)̱ÆÅ èClª¬³¢ 496 ÙÇDæxª¢DÝnhÉÍC-1©çA±µ½ÌlðÝèÂ\Å 497 éDàDæxÍCBASEPRIâNVICÌDæxWX^ÉÝè·élÅ éD 498 499 À³êéÝDæxÌrbgð TBITW_IPRI Æ·éÆCÝèÂ\ÈO 500 DæxÍÌæ¤ÉÈéD 501 502 TIPM_ENAALLi0j` -(1 << TBITW_IPRI) 503 504 505 13. J[lÇàÌÅDæx(CPUbNóÔÅÌDæx}XN) 506 507 6.Åq×½æ¤ÉCÝÌoûÅSVCnhðÄÑo·Kvª é½ßC 508 SVCnhÍCPUbNóÔÌBASEPRIÉÝè·éDæx}XNæè¢Dæx 509 ðÝè·éKvª éD 510 511 À³êéÝDæxÌrbgð TBITW_IPRICDæxÌTuDæxÌ 512 rbgðTBIT_IPRIÆ·éÆCCPUbNóÔiJ[lÇàÝÉÝè 513 Â\ÈÅDæxjƵÄwèÂ\ÈDæx}XNÌÝèÍÍÍȺÌlÌÍ 514 ÍÆÈéD 515 516 -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) ` -1 517 518 519 14. ¢ðÛè 520 521 EÝbNÆCPUáOÌÖW 522 BASEPRIðgÁ½ÆµÄàC éCPUáOɼÌáOª¶·éÆC» 523 ÌáOÍó¯t¯çêÈ¢½ßCITRONdlͽ¹È¢D 524 -> «çßÄ}j 525 ALÚɦ°é©. 526 veNVÌáOà}XNÂ\Å é½ßvD 527 528 529 ÈãD 461 FAULTMASK/PRIMASKを使用 462 463 FAULTMASK/PRIMASKを使用すると,NMI と Hardware Fault 以外のCPU例外も禁 464 止されてしまう. 465 466 BASEPRIを用いると,割込みロック中にもCPU例外を受付けたい場合は, 467 BASEPRIを用いて,最高優先度をCPU例外のためにリザーブする必要がある. 468 469 割込みロック時も,CPU例外を受付けるようにしたければBASEPRIを使用する必 470 要がある. 471 472 μIRON4.0仕様の3.5.3では,CPU例外の優先度は次のように定められている. 473 474 "CPU例外ハンドラの優先順位は,CPU例外が発生した処理の優先度と,ディス 475 パッチャの優先順位のいずれかよりも高い." 476 477 CPU例外が発生した処理の優先度よりも高いとあるので,CPUロックや割込みロ 478 ック状態のタスクで発生した場合でも,優先して実行されるべきだとも考えら 479 れる. 480 481 一方,TOPPERS標準割込み処理モデルの仕様書では,CPU例外は,プロセッサ毎 482 に異なるため,CPU例外の処理モデルの標準化検討の対象外としている.その 483 ため,ARM-Mでの扱いを決めて,マニュアルに明記すればよいと考えられる. 484 485 486 12. 外部優先度と内部優先度の変換 487 488 外部優先度とはAPIで指定する割込み優先度(PRI型)のことであり,値が小さい 489 ほど優先度が高い.割込みハンドラには,-1から連続した負の値を設定可能で 490 ある.内部優先度は,BASEPRIやNVICの優先度レジスタに設定する値である. 491 492 実装される割込み優先度のビット幅を TBITW_IPRI とすると,設定可能な外部 493 優先度は次のようになる. 494 495 TIPM_ENAALL(=0)〜 -(1 << TBITW_IPRI) 496 497 498 13. カーネル管理内の最高優先度(CPUロック状態での優先度マスク) 499 500 6.で述べたように,割込みの出口でSVCハンドラを呼び出す必要があるため, 501 SVCハンドラはCPUロック状態のBASEPRIに設定する優先度マスクより高い優先度 502 を設定する必要がある. 503 504 実装される割込み優先度のビット幅を TBITW_IPRI,優先度中のサブ優先度の 505 ビット幅をTBIT_IPRIとすると,CPUロック状態(カーネル管理内割込みに設定 506 可能な最高優先度)として指定可能な優先度マスクの設定範囲は以下の値の範 507 囲となる. 508 509 -(2^(TBIW_IPRI)) + (2^TBITW_SUBIPRI)) 〜 -1 510 511 512 14. 未解決課題 513 514 ・割込みロックとCPU例外の関係 515 BASEPRIを使ったとしても,あるCPU例外処理中に他の例外が発生すると,そ 516 の例外は受け付けられないため,ITRON仕様は満たせない. 517 ->あきらめてマニュアル記載に逃げるか. 518 メモリプロテクションの例外もマスク可能であるため要件等. 519 520 521 以上. -
Property svn:mime-type
set to
Note:
See TracChangeset
for help on using the changeset viewer.