Changeset 318 for asp3_gr_sakura/trunk/arch/rx630_gcc/prc_kernel_impl.h
- Timestamp:
- Aug 3, 2017, 10:46:41 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
asp3_gr_sakura/trunk/arch/rx630_gcc/prc_kernel_impl.h
- Property svn:keywords deleted
-
Property svn:mime-type
changed from
text/x-chdr
totext/x-chdr; charset=UTF-8
r317 r318 11 11 * Copyright (C) 2013 by Mitsuhiro Matsuura 12 12 * 13 * ä¸è¨èä½æ¨©è 14 ã¯ï¼ä»¥ä¸ã®(1)ï½(4)ã®æ¡ä»¶ãæºããå ´åã«éãï¼æ¬ã½ããã¦ã§ 15 * ã¢ï¼æ¬ã½ããã¦ã§ã¢ãæ¹å¤ãããã®ãå«ãï¼ä»¥ä¸åãï¼ã使ç¨ã»è¤è£½ã»æ¹ 16 * å¤ã»åé 17 å¸ï¼ä»¥ä¸ï¼å©ç¨ã¨å¼ã¶ï¼ãããã¨ãç¡åã§è¨±è«¾ããï¼ 18 * (1) æ¬ã½ããã¦ã§ã¢ãã½ã¼ã¹ã³ã¼ãã®å½¢ã§å©ç¨ããå ´åã«ã¯ï¼ä¸è¨ã®èä½ 19 * 権表示ï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãï¼ãã®ã¾ã¾ã®å½¢ã§ã½ã¼ 20 * ã¹ã³ã¼ãä¸ã«å«ã¾ãã¦ãããã¨ï¼ 21 * (2) æ¬ã½ããã¦ã§ã¢ãï¼ã©ã¤ãã©ãªå½¢å¼ãªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 22 * ç¨ã§ããå½¢ã§åé 23 å¸ããå ´åã«ã¯ï¼åé 24 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨ 25 * è 26 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®èä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ 27 * ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 28 * (3) æ¬ã½ããã¦ã§ã¢ãï¼æ©å¨ã«çµã¿è¾¼ããªã©ï¼ä»ã®ã½ããã¦ã§ã¢éçºã«ä½¿ 29 * ç¨ã§ããªãå½¢ã§åé 30 å¸ããå ´åã«ã¯ï¼æ¬¡ã®ããããã®æ¡ä»¶ãæºããã 31 * ã¨ï¼ 32 * (a) åé 33 å¸ã«ä¼´ãããã¥ã¡ã³ãï¼å©ç¨è 34 ããã¥ã¢ã«ãªã©ï¼ã«ï¼ä¸è¨ã®è 35 * ä½æ¨©è¡¨ç¤ºï¼ãã®å©ç¨æ¡ä»¶ããã³ä¸è¨ã®ç¡ä¿è¨¼è¦å®ãæ²è¼ãããã¨ï¼ 36 * (b) åé 37 å¸ã®å½¢æ 38 ãï¼å¥ã«å®ããæ¹æ³ã«ãã£ã¦ï¼TOPPERSããã¸ã§ã¯ãã« 39 * å ±åãããã¨ï¼ 40 * (4) æ¬ã½ããã¦ã§ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ 41 * 害ãããï¼ä¸è¨èä½æ¨©è 42 ããã³TOPPERSããã¸ã§ã¯ããå 43 責ãããã¨ï¼ 44 * ã¾ãï¼æ¬ã½ããã¦ã§ã¢ã®ã¦ã¼ã¶ã¾ãã¯ã¨ã³ãã¦ã¼ã¶ããã®ãããªãç 45 * ç±ã«åºã¥ãè«æ±ãããï¼ä¸è¨èä½æ¨©è 46 ããã³TOPPERSããã¸ã§ã¯ãã 47 * å 48 責ãããã¨ï¼ 13 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ 14 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改 15 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. 16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 18 * スコード中に含まれていること. 19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 20 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 21 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 22 * の無保証規定を掲載すること. 23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 24 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 25 * と. 26 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 27 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 28 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 29 * 報告すること. 30 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 31 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 32 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理 33 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを 34 * 免責すること. 49 35 * 50 * æ¬ã½ããã¦ã§ã¢ã¯ï¼ç¡ä¿è¨¼ã§æä¾ããã¦ãããã®ã§ããï¼ä¸è¨èä½æ¨©è 51 ã 52 * ãã³TOPPERSããã¸ã§ã¯ãã¯ï¼æ¬ã½ããã¦ã§ã¢ã«é¢ãã¦ï¼ç¹å®ã®ä½¿ç¨ç®ç 53 * ã«å¯¾ããé©åæ§ãå«ãã¦ï¼ãããªãä¿è¨¼ãè¡ããªãï¼ã¾ãï¼æ¬ã½ããã¦ã§ 54 * ã¢ã®å©ç¨ã«ããç´æ¥çã¾ãã¯éæ¥çã«çãããããªãæ害ã«é¢ãã¦ãï¼ã 55 * ã®è²¬ä»»ãè² ããªãï¼ 36 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 37 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的 38 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ 39 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ 40 * の責任を負わない. 56 41 * 57 42 * @(#) $Id$ … … 59 44 60 45 /* 61 * ããã»ããµä¾åã¢ã¸ã¥ã¼ã«ï¼RX630ç¨ï¼62 * 63 * ãã®ã¤ã³ã¯ã«ã¼ããã¡ã¤ã«ã¯ï¼target_kernel_impl.hï¼ã¾ãã¯ï¼ããããã¤ã³ã¯64 * ã«ã¼ãããããã¡ã¤ã«ï¼ã®ã¿ããã¤ã³ã¯ã«ã¼ããããï¼ä»ã®ãã¡ã¤ã«ãã65 * ç´æ¥ã¤ã³ã¯ã«ã¼ããã¦ã¯ãªããªãï¼46 * プロセッサ依存モジュール(RX630用) 47 * 48 * このインクルードファイルは,target_kernel_impl.h(または,そこからインク 49 * ルードされるファイル)のみからインクルードされる.他のファイルから 50 * 直接インクルードしてはならない. 66 51 */ 67 52 … … 70 55 71 56 /* 72 * ããã»ããµã®ç¹æ®å½ä»¤ã®ã¤ã³ã©ã¤ã³é¢æ°å®ç¾©57 * プロセッサの特殊命令のインライン関数定義 73 58 */ 74 59 #include "prc_insn.h" … … 78 63 79 64 /* 80 * éã¿ã¹ã¯ã³ã³ããã¹ãç¨ã®ã¹ã¿ãã¯åæå¤65 * 非タスクコンテキスト用のスタック初期値 81 66 */ 82 67 … … 84 69 85 70 /* 86 * ã¿ã¹ã¯ã³ã³ããã¹ããããã¯ã®å®ç¾©71 * タスクコンテキストブロックの定義 87 72 */ 88 73 typedef struct task_context_block { 89 void *sp; /* ã¹ã¿ãã¯ãã¤ã³ã¿*/90 FP pc; /* ããã°ã©ã ã«ã¦ã³ã¿*/74 void *sp; /* スタックポインタ */ 75 FP pc; /* プログラムカウンタ */ 91 76 } TSKCTXB; 92 77 93 78 94 79 /* 95 * å²è¾¼ã¿çºçåæ°ãä¿åããå¤æ°80 * 割込み発生回数を保存する変数 96 81 */ 97 82 extern uint16_t intnest; … … 100 85 101 86 /* 102 * CPUããã¯ç¶æ 103 ã§ã®å²è¾¼ã¿åªå 104 度ãã¹ã¯ 105 * 106 * TIPM_LOCKã¯ï¼CPUããã¯ç¶æ 107 ã§ã®å²è¾¼ã¿åªå 108 度ãã¹ã¯ï¼ããªãã¡ï¼ã«ã¼ã 109 * ã«ç®¡çå¤ã®ãã®ãé¤ããã¹ã¦ã®å²è¾¼ã¿è¦æ±ããã¹ã¯ããå¤ã«å®ç¾©ããï¼ 110 * 111 * TMIN_INTPRIå¤æ´ãããã¨ã§ç®¡çå¤å²è¾¼ã¿ã®æç¡ã決å®ããï¼ 112 * ä¾ãã°TMIN_INTPRIã-14ã«è¨å®ããã¨ï¼ã¬ãã«15ã®å²è¾¼ã¿ãã«ã¼ãã«ç®¡çå¤ã¨ 113 * ãªãï¼TMIN_INTPRIã-15ã«è¨å®ããã¨ï¼NMI以å¤ã«ã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿ã 114 * è¨ããªããã¨ã«ãªãï¼ãã®å ´åã«ã¯-15ã«è¨å®ãããã¨ãæ¨å¥¨ããï¼ï¼ 87 * CPUロック状態での割込み優先度マスク 88 * 89 * TIPM_LOCKは,CPUロック状態での割込み優先度マスク,すなわち,カーネ 90 * ル管理外のものを除くすべての割込み要求をマスクする値に定義する. 91 * 92 * TMIN_INTPRI変更することで管理外割込みの有無を決定する. 93 * 例えばTMIN_INTPRIを-14に設定すると,レベル15の割込みがカーネル管理外と 94 * なる.TMIN_INTPRIを-15に設定すると,NMI以外にカーネル管理外の割込みを 95 * 設けないことになる(この場合には-15に設定することを推奨する). 115 96 */ 116 97 #ifndef TIPM_LOCK … … 121 102 122 103 /* 123 * TOPPERSæ¨æºå²è¾¼ã¿å¦çã¢ãã«ã®å®ç¾ 124 */ 125 /* 126 * ã³ã³ããã¹ãã®åç 127 § 128 * 129 * RXã§ã¯ï¼å²è¾¼ã¿ã®æ»ãå 130 ãã¿ã¹ã¯ãã©ãããå¤æããããã« intnest 131 * ã使ç¨ãã¦ããï¼ãããç¨ãã¦ã³ã³ããã¹ããå¤æããï¼ 104 * TOPPERS標準割込み処理モデルの実現 105 */ 106 /* 107 * コンテキストの参照 108 * 109 * RXでは,割込みの戻り先がタスクかどうかを判断するために intnest 110 * を使用している.これを用いてコンテキストを判断する. 132 111 */ 133 112 Inline bool_t 134 113 sense_context( void ) 135 114 { 136 /* ãã¹ãã«ã¦ã³ã¿0ãã大ãªãéã¿ã¹ã¯ã³ã³ããã¹ã*/115 /* ネストカウンタ0より大なら非タスクコンテキスト */ 137 116 return ( intnest > 0U ); 138 117 } … … 140 119 141 120 /* 142 * CPUããã¯ãã©ã°å®ç¾ã®ããã®å¤æ° 143 * 144 * ãããã®å¤æ°ã¯ï¼CPUããã¯ç¶æ 145 ã®æã®ã¿æ¸ãæãã¦ãããã®ã¨ããï¼ 121 * CPUロックフラグ実現のための変数 122 * 123 * これらの変数は,CPUロック状態の時のみ書き換えてよいものとする. 146 124 */ 147 125 #if TIPM_LOCK != -15 148 extern bool_t lock_flag; /* CPUããã¯ãã©ã°ã®å¤ãä¿æããå¤æ° */ 149 extern uint32_t saved_ipl; /* å²è¾¼ã¿åªå 150 度ã¬ãã«ãä¿åããå¤æ° */ 126 extern bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */ 127 extern uint32_t saved_ipl; /* 割込み優先度レベルを保存する変数 */ 151 128 #endif /* TIPM_LOCK != -15 */ 152 129 … … 155 132 156 133 /* 157 * å²è¾¼ã¿åªå 158 度ãã¹ã¯ã®å¤é¨è¡¨ç¾ã¨å 159 é¨è¡¨ç¾ã®å¤æ 160 * 161 * RX630ã§ã¯ï¼ããã»ããµã¹ãã¼ã¿ã¹ã¯ã¼ãã¬ã¸ã¹ã¿ï¼PSWï¼ã®ä¸ãã 162 * 24ï½27ãããç®ã®4ãããã«å²è¾¼ã¿åªå 163 度ã¬ãã«ï¼IPLï¼ãç½®ããã¦ããï¼ 164 * ã«ã¼ãã«ç®¡çå¤å²è¾¼ã¿ãå®è£ 165 ããå ´åã«IPLã使ç¨ããå¶å¾¡ãè¡ãï¼ 166 * ã«ã¼ãã«ã¯å²è¾¼ã¿åªå 167 度ãã¹ã¯ï¼-1ããé£ç¶ããè² ã®å¤ï¼ã§ç®¡çãã㦠168 * ããããIPLã¨ã®å¤æãå¿ 169 è¦ã¨ãªãï¼ 170 */ 171 #define IPL_TO_IPM( ipl ) (-(( PRI )(( ipl ) >> 24U ))) /* IPLãIPMã« */ 172 #define IPM_TO_IPL( ipm ) ((( uint32_t )(-( ipm ))) << 24U ) /* IPMãIPLã« */ 173 174 175 /* 176 * CPUããã¯ç¶æ 177 ã§ã®å²è¾¼ã¿åªå 178 度ãã¹ã¯ã®IPL 134 * 割込み優先度マスクの外部表現と内部表現の変換 135 * 136 * RX630では,プロセッサステータスワードレジスタ(PSW)の下から 137 * 24~27ビット目の4ビットに割込み優先度レベル(IPL)が置かれている. 138 * カーネル管理外割込みを実装する場合にIPLを使用した制御を行う. 139 * カーネルは割込み優先度マスク(-1から連続した負の値)で管理されて 140 * いるためIPLとの変換が必要となる. 141 */ 142 #define IPL_TO_IPM( ipl ) (-(( PRI )(( ipl ) >> 24U ))) /* IPLをIPMに */ 143 #define IPM_TO_IPL( ipm ) ((( uint32_t )(-( ipm ))) << 24U ) /* IPMをIPLに */ 144 145 146 /* 147 * CPUロック状態での割込み優先度マスクのIPL 179 148 */ 180 149 #define IPL_LOCK ( IPM_TO_IPL( TIPM_LOCK ) ) 181 150 182 151 /* 183 * TIPM_ENAALLï¼å²è¾¼ã¿åªå 184 度ãã¹ã¯å 185 ¨è§£é¤ï¼ã®IPL 152 * TIPM_ENAALL(割込み優先度マスク全解除)のIPL 186 153 */ 187 154 #define IPL_ENAALL ( IPM_TO_IPL( TIPM_ENAALL ) ) … … 191 158 192 159 /* 193 * å²è¾¼ã¿è¦å æ¯ã®ã¬ãã« & å±æ§å®ç¾©ãã¼ãã«194 * ( ãã³ãã¬ã¼ããã¡ã¤ã«ã«ããåºå)160 * 割込み要因毎のレベル & 属性定義テーブル 161 * (テンプレートファイルによる出力) 195 162 */ 196 163 typedef struct cfg_int_info { … … 203 170 204 171 /* 205 * å²è¾¼ã¿çªå·ã®ç¯å²ã®å¤å® 206 * 207 * å²è¾¼ã¿çªå·ãæå¹ãªå¤ãå³å¯ã«ãã§ãã¯ãããã, 208 * ã³ã³ãã£ã®ã¥ã¬ã¼ã¿åºåãã¼ãã«ãåç 209 §ãã. 172 * 割込み番号の範囲の判定 173 * 174 * 割込み番号が有効な値か厳密にチェックするため, 175 * コンフィギュレータ出力テーブルを参照する. 210 176 */ 211 177 #define VALID_INTNO( intno ) \ … … 214 180 #define VALID_INTNO_CFGINT( intno ) VALID_INTNO( intno ) 215 181 216 /* cre_int ã§æå¹ãªå²è¾¼ã¿çªå·ã®æå®*/182 /* cre_intで有効な割込み番号の指定 */ 217 183 #define VALID_INTNO_CREINT VALID_INTNO_CFGINT((intno)) 218 184 219 /* cre_isr ã§æå¹ãªå²è¾¼ã¿çªå·ã®æå®*/185 /* cre_isrで有効な割込み番号の指定 */ 220 186 #define VALID_INTNO_CREISR(intno) VALID_INTNO_CFGINT((intno)) 221 187 222 188 223 189 /* 224 * å²è¾¼ã¿å¶å¾¡ã¬ã¸ã¹ã¿é¢é£ã®å®ç¾©190 * 割込み制御レジスタ関連の定義 225 191 */ 226 192 #define IRQ_POSEDGE ( 0x08U ) … … 231 197 232 198 /* 233 * CPUããã¯ç¶æ 234 ã¸ã®ç§»è¡ 235 * 236 * IPMï¼ãã¼ãã¦ã§ã¢ã®å²è¾¼ã¿åªå 237 度ãã¹ã¯ï¼ãï¼saved_iipmã«ä¿åãï¼ã«ã¼ 238 * ãã«ç®¡çå¤ã®ãã®ãé¤ããã¹ã¦ã®å²è¾¼ã¿è¦æ±ããã¹ã¯ããå¤ï¼TIPM_LOCKï¼ 239 * ã«è¨å®ããï¼ã¾ãï¼lock_flagãTRUEã«ããï¼ 240 * 241 * IPMãï¼æåããTIPM_LOCKã¨åããããããé«ãå ´åã«ã¯ï¼ããã 242 * saved_iipmã«ä¿åããã®ã¿ã§ï¼TIPM_LOCKã«ã¯è¨å®ããªãï¼ããã¯ï¼ã¢ãã« 243 * ä¸ã®å²è¾¼ã¿åªå 244 度ãã¹ã¯ãï¼TIPM_LOCKã¨åããããããé«ãã¬ãã«ã«è¨å® 245 * ããã¦ããç¶æ 246 ã«ãããï¼ 247 * 248 * ãã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 249 ï¼lock_flagãTRUEã®ç¶æ 250 ï¼ã§å¼ã°ãããã¨ã¯ 251 * ãªããã®ã¨æ³å®ãã¦ããï¼ 199 * CPUロック状態への移行 200 * 201 * IPM(ハードウェアの割込み優先度マスク)を,saved_iipmに保存し,カー 202 * ネル管理外のものを除くすべての割込み要求をマスクする値(TIPM_LOCK) 203 * に設定する.また,lock_flagをTRUEにする. 204 * 205 * IPMが,最初からTIPM_LOCKと同じかそれより高い場合には,それを 206 * saved_iipmに保存するのみで,TIPM_LOCKには設定しない.これは,モデル 207 * 上の割込み優先度マスクが,TIPM_LOCKと同じかそれより高いレベルに設定 208 * されている状態にあたる. 209 * 210 * この関数は,CPUロック状態(lock_flagがTRUEの状態)で呼ばれることは 211 * ないものと想定している. 252 212 */ 253 213 Inline void … … 260 220 261 221 /* 262 * current_ipl() ã®è¿ãå¤ãç´æ¥saved_iplã«ä¿åããï¼ä¸æå¤æ°ipl263 * ãç¨ãã¦ããã®ã¯ï¼current_ipl()ãå¼ãã ç´å¾ã«å²è¾¼ã¿ãçºçãï¼264 * èµ·åãããå²è¾¼ã¿å¦çã§saved_iplãå¤æ´ãããå¯è½æ§ãããããã§265 * ããï¼222 * current_ipl()の返り値を直接saved_iplに保存せず,一時変数ipl 223 * を用いているのは,current_ipl()を呼んだ直後に割込みが発生し, 224 * 起動された割込み処理でsaved_iplが変更される可能性があるためで 225 * ある. 266 226 */ 267 227 ipl = current_ipl(); … … 278 238 279 239 /* 280 * CPUããã¯ç¶æ 281 ã®è§£é¤ 282 * 283 * lock_flagãFALSEã«ãï¼IPMï¼ãã¼ãã¦ã§ã¢ã®å²è¾¼ã¿åªå 284 度ãã¹ã¯ï¼ãï¼ 285 * saved_iipmã«ä¿åããå¤ã«æ»ãï¼ 286 * 287 * ãã®é¢æ°ã¯ï¼CPUããã¯ç¶æ 288 ï¼lock_flagãtrueã®ç¶æ 289 ï¼ã§ã®ã¿å¼ã°ããã 290 * ã®ã¨æ³å®ãã¦ããï¼ 240 * CPUロック状態の解除 241 * 242 * lock_flagをFALSEにし,IPM(ハードウェアの割込み優先度マスク)を, 243 * saved_iipmに保存した値に戻す. 244 * 245 * この関数は,CPUロック状態(lock_flagがtrueの状態)でのみ呼ばれるも 246 * のと想定している. 291 247 */ 292 248 Inline void … … 304 260 305 261 /* 306 * CPUããã¯ç¶æ 307 ã®åç 308 § 262 * CPUロック状態の参照 309 263 */ 310 264 Inline bool_t … … 320 274 321 275 /* 322 * å²è¾¼ã¿å±æ§ã®è¨å®ã®ãã§ãã¯276 * 割込み属性の設定のチェック 323 277 */ 324 278 Inline bool_t … … 329 283 330 284 /* 331 * ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 332 度ãã¹ã¯ã®è¨å® 333 * 334 * CPUããã¯ãã©ã°ãã¯ãªã¢ããã¦ããæã¯ï¼ãã¼ãã¦ã§ã¢ã®å²è¾¼ã¿åªå 335 度ã 336 * ã¹ã¯ãè¨å®ããï¼CPUããã¯ãã©ã°ãã»ããããã¦ããæã¯ï¼saved_iipm 337 * ãè¨å®ãï¼ããã«ï¼ãã¼ãã¦ã§ã¢ã®å²è¾¼ã¿åªå 338 度ãã¹ã¯ãï¼è¨å®ããã㨠339 * ããï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 340 度ãã¹ã¯ã¨TIPM_LOCKã®é«ãæ¹ã«è¨å®ããï¼ 285 * (モデル上の)割込み優先度マスクの設定 286 * 287 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優先度マ 288 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm 289 * を設定し,さらに,ハードウェアの割込み優先度マスクを,設定しようと 290 * した(モデル上の)割込み優先度マスクとTIPM_LOCKの高い方に設定する. 341 291 */ 342 292 Inline void … … 360 310 361 311 /* 362 * ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 363 度ãã¹ã¯ã®åç 364 § 365 * 366 * CPUããã¯ãã©ã°ãã¯ãªã¢ããã¦ããæã¯ãã¼ãã¦ã§ã¢ã®å²è¾¼ã¿åªå 367 度ã 368 * ã¹ã¯ãï¼ã»ããããã¦ããæã¯saved_iipmãåç 369 §ããï¼ 312 * (モデル上の)割込み優先度マスクの参照 313 * 314 * CPUロックフラグがクリアされている時はハードウェアの割込み優先度マ 315 * スクを,セットされている時はsaved_iipmを参照する. 370 316 */ 371 317 Inline PRI … … 389 335 390 336 /* 391 * å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ã®ã»ãã392 * 393 * å²è¾¼ã¿å±æ§ãè¨å®ããã¦ããªãå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ãã¦å²è¾¼ã¿è¦æ±ç¦æ¢394 * ãã©ã°ãã»ãããããã¨ããå ´åã«ã¯ï¼FALSEãè¿ãï¼337 * 割込み要求禁止フラグのセット 338 * 339 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止 340 * フラグをセットしようとした場合には,FALSEを返す. 395 341 */ 396 342 Inline bool_t … … 398 344 { 399 345 /* 400 * ã¬ãã«å®ç¾©ã0ã§ããå ´åã¯CFG_INTããã¦ããªã346 * レベル定義が0である場合はCFG_INTされていない 401 347 */ 402 348 if( cfg_int_table[intno].intpri == 0 ){ … … 411 357 412 358 /* 413 * å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ã®ã¯ãªã¢414 * 415 * å²è¾¼ã¿å±æ§ãè¨å®ããã¦ããªãå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ãã¦å²è¾¼ã¿è¦æ±ç¦æ¢416 * ãã©ã°ãã¯ãªã¢ãããã¨ããå ´åã«ã¯ï¼FALSEãè¿ãï¼359 * 割込み要求禁止フラグのクリア 360 * 361 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止 362 * フラグをクリアしようとした場合には,FALSEを返す. 417 363 */ 418 364 Inline bool_t … … 420 366 { 421 367 /* 422 * ã¬ãã«å®ç¾©ã0ã§ããå ´åã¯CFG_INTããã¦ããªã368 * レベル定義が0である場合はCFG_INTされていない 423 369 */ 424 370 if( cfg_int_table[intno].intpri == 0 ){ … … 433 379 434 380 /* 435 * å²è¾¼ã¿è¦æ±ãã¯ãªã¢ã§ããç¶æ 436 ãï¼ 381 * 割込み要求がクリアできる状態か? 437 382 */ 438 383 Inline bool_t … … 443 388 444 389 /* 445 * å²è¾¼ã¿è¦æ±ã®ã¯ãªã¢390 * 割込み要求のクリア 446 391 */ 447 392 Inline void … … 453 398 454 399 /* 455 * å²è¾¼ã¿ãè¦æ±ã§ããç¶æ 456 ãï¼ 400 * 割込みが要求できる状態か? 457 401 */ 458 402 Inline bool_t … … 463 407 464 408 /* 465 * å²è¾¼ã¿ã®è¦æ±466 * 注æï¼ãããã§ãµãã¼ãããã¦ããªãæä½409 * 割込みの要求 410 * 注意:チップでサポートされていない操作 467 411 */ 468 412 Inline void … … 473 417 474 418 /* 475 * å²è¾¼ã¿è¦æ±ã®ãã§ãã¯419 * 割込み要求のチェック 476 420 */ 477 421 Inline bool_t … … 479 423 { 480 424 /* 481 * å²è¾¼ã¿è¦æ±ã¬ã¸ã¹ã¿ã¯0 or 1ã§ãããªããã,482 * ãã®ã¾ã¾ã®å¤ãè¿ã.425 * 割込み要求レジスタは0 or 1でしかないため, 426 * そのままの値を返す. 483 427 */ 484 428 return ( *IR_REG(intno) ); … … 486 430 487 431 /* 488 * å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å®432 * 割込み要求ラインの属性の設定 489 433 */ 490 434 extern void config_int( INTNO intno, ATR intatr, PRI intpri ); 491 435 492 436 /* 493 * å²è¾¼ã¿ãåãä»ããããã®é 494 延å¦ç 437 * 割込みを受け付けるための遅延処理 495 438 */ 496 439 Inline void … … 500 443 501 444 /* 502 * æé«åªå 503 é ä½ã¿ã¹ã¯ã¸ã®ãã£ã¹ãããï¼prc_support.a30ï¼ 504 * 505 * dispatchã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãããå¼ã³åºããããµã¼ãã¹ã³ã¼ã«å¦çã 506 * ãå¼ã³åºãã¹ããã®ã§ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 507 ã»ãã£ã¹ãã 508 * ã許å¯ç¶æ 509 ã»ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 510 度ãã¹ã¯å 511 ¨è§£é¤ç¶æ 512 ã§å¼ã³åºã㪠513 * ããã°ãªããªãï¼ 445 * 最高優先順位タスクへのディスパッチ(prc_support.a30) 446 * 447 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か 448 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ 449 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな 450 * ければならない. 514 451 */ 515 452 extern void dispatch( void ); 516 453 517 454 /* 518 * éã¿ã¹ã¯ã³ã³ããã¹ãããã®ãã£ã¹ãããè¦æ±455 * 非タスクコンテキストからのディスパッチ要求 519 456 */ 520 457 #define request_dispatch() 521 458 522 459 /* 523 * ãã£ã¹ãããã£ã®åä½éå§ï¼prc_support.a30ï¼ 524 * 525 * start_dispatchã¯ï¼ã«ã¼ãã«èµ·åæã«å¼ã³åºãã¹ããã®ã§ï¼ãã¹ã¦ã®å²è¾¼ 526 * ã¿ãç¦æ¢ããç¶æ 527 ï¼å 528 ¨å²è¾¼ã¿ããã¯ç¶æ 529 ã¨åçã®ç¶æ 530 ï¼ã§å¼ã³åºããªããã° 531 * ãªããªãï¼ 460 * ディスパッチャの動作開始(prc_support.a30) 461 * 462 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込 463 * みを禁止した状態(全割込みロック状態と同等の状態)で呼び出さなければ 464 * ならない. 532 465 */ 533 466 extern void start_dispatch( void ) NoReturn; 534 467 535 468 /* 536 * ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã£ã¹ãããï¼prc_support.a30ï¼ 537 * 538 * exit_and_dispatchã¯ï¼ext_tskããå¼ã³åºãã¹ããã®ã§ï¼ã¿ã¹ã¯ã³ã³ãã 539 * ã¹ãã»CPUããã¯ç¶æ 540 ã»ãã£ã¹ããã許å¯ç¶æ 541 ã»ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 542 543 * 度ãã¹ã¯å 544 ¨è§£é¤ç¶æ 545 ã§å¼ã³åºããªããã°ãªããªãï¼ 469 * 現在のコンテキストを捨ててディスパッチ(prc_support.a30) 470 * 471 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ 472 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先 473 * 度マスク全解除状態で呼び出さなければならない. 546 474 */ 547 475 #define _kernel_exit_and_dispatch(); \ … … 552 480 553 481 /* 554 * ã«ã¼ãã«ã®çµäºå¦çã®å¼åºãï¼prc_support.a30ï¼555 * 556 * call_exit_kernel ã¯ï¼ã«ã¼ãã«ã®çµäºæã«å¼ã³åºãã¹ããã®ã§ï¼éã¿ã¹ã¯557 * ã³ã³ããã¹ãã«åãæãã¦ï¼ã«ã¼ãã«ã®çµäºå¦çï¼exit_kernelï¼ãå¼ã³åº558 * ãï¼482 * カーネルの終了処理の呼出し(prc_support.a30) 483 * 484 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク 485 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出 486 * す. 559 487 */ 560 488 extern void call_exit_kernel( void ) NoReturn; 561 489 562 490 /* 563 * ã¿ã¹ã¯ã³ã³ããã¹ãã®åæå 564 * 565 * ã¿ã¹ã¯ãä¼æ¢ç¶æ 566 ããå®è¡ã§ããç¶æ 567 ã«ç§»è¡ããæã«å¼ã°ããï¼ãã®æç¹ 568 * ã§ã¹ã¿ãã¯é åã使ã£ã¦ã¯ãªããªãï¼ 569 * 570 * activate_contextãï¼ã¤ã³ã©ã¤ã³é¢æ°ã§ã¯ãªããã¯ãå®ç¾©ã¨ãã¦ããã®ã¯ï¼ 571 * ãã®æç¹ã§ã¯TCBãå®ç¾©ããã¦ããªãããã§ããï¼ 491 * タスクコンテキストの初期化 492 * 493 * タスクが休止状態から実行できる状態に移行する時に呼ばれる.この時点 494 * でスタック領域を使ってはならない. 495 * 496 * activate_contextを,インライン関数ではなくマクロ定義としているのは, 497 * この時点ではTCBが定義されていないためである. 572 498 */ 573 499 extern void start_r( void ); … … 577 503 { \ 578 504 \ 579 /* ã¹ã¿ãã¯ãã¤ã³ã¿åæå¤ã®è¨å®*/ \505 /* スタックポインタ初期値の設定 */ \ 580 506 ( p_tcb )->tskctxb.sp = ( void * )((( uint32_t ) ( p_tcb )->p_tinib->stk ) + \ 581 507 ( p_tcb )->p_tinib->stksz ); \ 582 /* èµ·åçªå°ã®è¨å®*/ \508 /* 起動番地の設定 */ \ 583 509 ( p_tcb )->tskctxb.pc = ( FP ) start_r; \ 584 510 } \ … … 587 513 588 514 /* 589 * calltex ã¯ä½¿ç¨ããªã515 * calltexは使用しない 590 516 */ 591 517 #define OMIT_CALLTEX … … 593 519 594 520 /* 595 * å²è¾¼ã¿ãã³ãã©ã®è¨å® 596 * 597 * RX630ã¯ROMã«å²è¾¼ã¿ãã¯ã¿ãé 598 ç½®ããããï¼æ¬é¢æ°ã¯ç©ºé¢æ°ã§å®è£ 599 ããï¼ 521 * 割込みハンドラの設定 522 * 523 * RX630はROMに割込みベクタを配置するため,本関数は空関数で実装する. 600 524 */ 601 525 Inline void … … 605 529 606 530 /* 607 * CPUä¾å¤ãã³ãã©ã®è¨å® 608 * 609 * RX630ã¯ROMã«ä¾å¤ãã¯ã¿ãé 610 ç½®ããããï¼æ¬é¢æ°ã¯ç©ºé¢æ°ã§å®è£ 611 ããï¼ 531 * CPU例外ハンドラの設定 532 * 533 * RX630はROMに例外ベクタを配置するため,本関数は空関数で実装する. 612 534 */ 613 535 Inline void … … 617 539 618 540 /* 619 * å²è¾¼ã¿/ä¾å¤ãã³ãã©ã®å 620 ¥å£å¦çã®çæãã¯ã 621 * 622 * ãã³ãã¬ã¼ããã¡ã¤ã«ã«ããçæãããã空ãã¯ãã¨ããï¼ 541 * 割込み/例外ハンドラの入口処理の生成マクロ 542 * 543 * テンプレートファイルにより生成するため空マクロとする. 623 544 */ 624 545 #define HDR_ENTRY(hdr, intexc_num , tobejmp) 625 546 626 547 /* 627 * å²è¾¼ã¿ãã³ãã©ã®å 628 ¥å£å¦çã®çæãã¯ã 548 * 割込みハンドラの入口処理の生成マクロ 629 549 */ 630 550 #define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry … … 637 557 638 558 /* 639 * CPUä¾å¤ãã³ãã©ã®å 640 ¥å£å¦çã®çæãã¯ã 559 * CPU例外ハンドラの入口処理の生成マクロ 641 560 */ 642 561 #define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry … … 649 568 650 569 /* 651 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ãã®åç 652 § 653 * 654 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ããï¼ã¿ã¹ã¯ã³ã³ããã¹ãã®æã«FALSEï¼ 655 * ããã§ãªãæã«trueãè¿ãï¼ 570 * CPU例外の発生した時のコンテキストの参照 571 * 572 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にFALSE, 573 * そうでない時にtrueを返す. 656 574 */ 657 575 Inline bool_t … … 659 577 { 660 578 /* 661 * ãã¹ãã«ã¦ã³ã¿ã1ãã大ãªãéã¿ã¹ã¯ã³ã³ããã¹ã579 * ネストカウンタが1より大なら非タスクコンテキスト 662 580 */ 663 581 return( intnest > 1U ); … … 667 585 668 586 /* 669 * CPUä¾å¤æ 670 å ± p_excinf ãã PSW ã®å¤ãåå¾ããããã®ãªãã»ããå¤ 671 * EXCNO + ACC + FPSW + R1ï½R15 + PC 587 * CPU例外情報 p_excinf から PSW の値を取得するためのオフセット値 588 * EXCNO + ACC + FPSW + R1~R15 + PC 672 589 */ 673 590 #define EXC_GET_PSW_OFFSET (4+8+4+60+4) … … 676 593 677 594 /* 678 * CPUä¾å¤ã®çºçããæã®IPLã®åç 679 § 595 * CPU例外の発生した時のIPLの参照 680 596 */ 681 597 Inline uint32_t … … 695 611 696 612 /* 697 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ãã¨å²è¾¼ã¿ã®ãã¹ã¯ç¶æ 698 ã®åç 699 § 700 * 701 * CPUä¾å¤ã®çºçããæã®ã·ã¹ãã ç¶æ 702 ãï¼ã«ã¼ãã«å®è¡ä¸ã§ãªãï¼ã¿ã¹ã¯ã³ 703 * ã³ããã¹ãã§ããï¼å 704 ¨å²è¾¼ã¿ããã¯ç¶æ 705 ã§ãªãï¼CPUããã¯ç¶æ 706 ã§ãªãï¼ï¼ã¢ 707 * ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 708 度ãã¹ã¯å 709 ¨è§£é¤ç¶æ 710 ã§ããæã«trueï¼ããã§ãªãæ 711 * ã«FALSEãè¿ãï¼CPUä¾å¤ãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦çä¸ã§çºçããå ´å 712 * ã«ãFALSEãè¿ãï¼ï¼ 613 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照 614 * 615 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ 616 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,(モ 617 * デル上の)割込み優先度マスク全解除状態である時にtrue,そうでない時 618 * にFALSEを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合 619 * にもFALSEを返す). 713 620 * 714 * ã«ã¼ãã«å®è¡ä¸ã§ãªãâ (TIPM_LOCK== -15) Iãã©ã°== 1621 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1 715 622 * (else) IPL < IPL_LOCK 716 * ã¿ã¹ã¯ã³ã³ããã¹ãã§ããâintnest == 0 717 * å 718 ¨å²è¾¼ã¿ããã¯ã§ãªãâ Iãã©ã° == 1 719 * å²è¾¼ã¿åªå 720 度ãã¹ã¯ãå 721 ¨è§£é¤âIPL == 0 623 * タスクコンテキストである→intnest == 0 624 * 全割込みロックでない→ Iフラグ == 1 625 * 割込み優先度マスクが全解除→IPL == 0 722 626 * 723 627 * … … 732 636 733 637 /* 734 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ãã¨å²è¾¼ã¿ï¼CPUããã¯ç¶æ 735 ã®åç 736 § 737 * 738 * CPUä¾å¤ã®çºçããæã®ã·ã¹ãã ç¶æ 739 ãï¼ã«ã¼ãã«å®è¡ä¸ã§ãªãï¼ã¿ã¹ã¯ã³ 740 * ã³ããã¹ãã§ããï¼å 741 ¨å²è¾¼ã¿ããã¯ç¶æ 742 ã§ãªãï¼CPUããã¯ç¶æ 743 ã§ãªãæã« 744 * trueï¼ããã§ãªãæã«falseãè¿ãï¼CPUä¾å¤ãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦ 745 * çä¸ã§çºçããå ´åã«ãfalseãè¿ãï¼ï¼ 638 * CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照 639 * 640 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ 641 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でない時に 642 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処 643 * 理中で発生した場合にもfalseを返す). 746 644 * 747 * ã«ã¼ãã«å®è¡ä¸ã§ãªãâ (TIPM_LOCK== -15) Iãã©ã°== 1645 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1 748 646 * (else) IPL < TIPM_LOCK 749 * ã¿ã¹ã¯ã³ã³ããã¹ãã§ããâintnest < 1 750 * å 751 ¨å²è¾¼ã¿ããã¯ã§ãªãâ Iãã©ã° == 1 752 * CPUããã¯ç¶æ 753 ã§ãªãâ(TIPM_LOCK== -15) Iãã©ã° == 1 647 * タスクコンテキストである→intnest < 1 648 * 全割込みロックでない→ Iフラグ == 1 649 * CPUロック状態でない→(TIPM_LOCK== -15) Iフラグ == 1 754 650 * (else) IPL < TIPM_LOCK 755 651 */ … … 769 665 770 666 /* 771 * ããã»ããµä¾åã®åæå667 * プロセッサ依存の初期化 772 668 */ 773 669 extern void prc_initialize( void ); 774 670 775 671 /* 776 * ããã»ããµä¾åã®çµäºæå¦ç672 * プロセッサ依存の終了時処理 777 673 */ 778 674 extern void prc_terminate( void ); … … 781 677 #ifndef OMIT_DEFAULT_INT_HANDLER 782 678 /* 783 * æªç»é²ã®å²è¾¼ã¿ãçºçããå ´åã«å¼ã³åºããã679 * 未登録の割込みが発生した場合に呼び出される 784 680 */ 785 681 void default_int_handler( void ); … … 788 684 #ifndef OMIT_DEFAULT_EXC_HANDLER 789 685 /* 790 * æªç»é²ã®ä¾å¤ãçºçããå ´åã«å¼ã³åºããã686 * 未登録の例外が発生した場合に呼び出される 791 687 */ 792 688 void default_exc_handler( void );
Note:
See TracChangeset
for help on using the changeset viewer.