- Timestamp:
- May 22, 2019, 10:03:37 PM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
azure_iot_hub/trunk/asp3_dcre/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
r388 r389 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 ){ … … 412 358 413 359 /* 414 * å²è¾¼ã¿è¦æ±ç¦æ¢ãã©ã°ã®ã¯ãªã¢415 * 416 * å²è¾¼ã¿å±æ§ãè¨å®ããã¦ããªãå²è¾¼ã¿è¦æ±ã©ã¤ã³ã«å¯¾ãã¦å²è¾¼ã¿è¦æ±ç¦æ¢417 * ãã©ã°ãã¯ãªã¢ãããã¨ããå ´åã«ã¯ï¼FALSEãè¿ãï¼360 * 割込み要求禁止フラグのクリア 361 * 362 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止 363 * フラグをクリアしようとした場合には,FALSEを返す. 418 364 */ 419 365 Inline bool_t … … 421 367 { 422 368 /* 423 * ã¬ãã«å®ç¾©ã0ã§ããå ´åã¯CFG_INTããã¦ããªã369 * レベル定義が0である場合はCFG_INTされていない 424 370 */ 425 371 if( cfg_int_table[intno].intpri == 0 ){ … … 435 381 436 382 /* 437 * å²è¾¼ã¿è¦æ±ãã¯ãªã¢ã§ããç¶æ 438 ãï¼ 383 * 割込み要求がクリアできる状態か? 439 384 */ 440 385 Inline bool_t … … 445 390 446 391 /* 447 * å²è¾¼ã¿è¦æ±ã®ã¯ãªã¢392 * 割込み要求のクリア 448 393 */ 449 394 Inline void … … 455 400 456 401 /* 457 * å²è¾¼ã¿ãè¦æ±ã§ããç¶æ 458 ãï¼ 402 * 割込みが要求できる状態か? 459 403 */ 460 404 Inline bool_t … … 465 409 466 410 /* 467 * å²è¾¼ã¿ã®è¦æ±468 * 注æï¼ãããã§ãµãã¼ãããã¦ããªãæä½411 * 割込みの要求 412 * 注意:チップでサポートされていない操作 469 413 */ 470 414 Inline void … … 475 419 476 420 /* 477 * å²è¾¼ã¿è¦æ±ã®ãã§ãã¯421 * 割込み要求のチェック 478 422 */ 479 423 Inline bool_t … … 481 425 { 482 426 /* 483 * å²è¾¼ã¿è¦æ±ã¬ã¸ã¹ã¿ã¯0 or 1ã§ãããªããã,484 * ãã®ã¾ã¾ã®å¤ãè¿ã.427 * 割込み要求レジスタは0 or 1でしかないため, 428 * そのままの値を返す. 485 429 */ 486 430 return sil_reb_mem(IR_REG(intno)); … … 488 432 489 433 /* 490 * å²è¾¼ã¿è¦æ±ã©ã¤ã³ã®å±æ§ã®è¨å®434 * 割込み要求ラインの属性の設定 491 435 */ 492 436 extern void config_int( INTNO intno, ATR intatr, PRI intpri ); 493 437 494 438 /* 495 * å²è¾¼ã¿ãåãä»ããããã®é 496 延å¦ç 439 * 割込みを受け付けるための遅延処理 497 440 */ 498 441 Inline void … … 502 445 503 446 /* 504 * æé«åªå 505 é ä½ã¿ã¹ã¯ã¸ã®ãã£ã¹ãããï¼prc_support.a30ï¼ 506 * 507 * dispatchã¯ï¼ã¿ã¹ã¯ã³ã³ããã¹ãããå¼ã³åºããããµã¼ãã¹ã³ã¼ã«å¦çã 508 * ãå¼ã³åºãã¹ããã®ã§ï¼ã¿ã¹ã¯ã³ã³ããã¹ãã»CPUããã¯ç¶æ 509 ã»ãã£ã¹ãã 510 * ã許å¯ç¶æ 511 ã»ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 512 度ãã¹ã¯å 513 ¨è§£é¤ç¶æ 514 ã§å¼ã³åºã㪠515 * ããã°ãªããªãï¼ 447 * 最高優先順位タスクへのディスパッチ(prc_support.a30) 448 * 449 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か 450 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ 451 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな 452 * ければならない. 516 453 */ 517 454 extern void dispatch( void ); 518 455 519 456 /* 520 * éã¿ã¹ã¯ã³ã³ããã¹ãããã®ãã£ã¹ãããè¦æ±457 * 非タスクコンテキストからのディスパッチ要求 521 458 */ 522 459 #define request_dispatch() 523 460 524 461 /* 525 * ãã£ã¹ãããã£ã®åä½éå§ï¼prc_support.a30ï¼ 526 * 527 * start_dispatchã¯ï¼ã«ã¼ãã«èµ·åæã«å¼ã³åºãã¹ããã®ã§ï¼ãã¹ã¦ã®å²è¾¼ 528 * ã¿ãç¦æ¢ããç¶æ 529 ï¼å 530 ¨å²è¾¼ã¿ããã¯ç¶æ 531 ã¨åçã®ç¶æ 532 ï¼ã§å¼ã³åºããªããã° 533 * ãªããªãï¼ 462 * ディスパッチャの動作開始(prc_support.a30) 463 * 464 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込 465 * みを禁止した状態(全割込みロック状態と同等の状態)で呼び出さなければ 466 * ならない. 534 467 */ 535 468 extern void start_dispatch( void ) NoReturn; 536 469 537 470 /* 538 * ç¾å¨ã®ã³ã³ããã¹ããæ¨ã¦ã¦ãã£ã¹ãããï¼prc_support.a30ï¼ 539 * 540 * exit_and_dispatchã¯ï¼ext_tskããå¼ã³åºãã¹ããã®ã§ï¼ã¿ã¹ã¯ã³ã³ãã 541 * ã¹ãã»CPUããã¯ç¶æ 542 ã»ãã£ã¹ããã許å¯ç¶æ 543 ã»ï¼ã¢ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 544 545 * 度ãã¹ã¯å 546 ¨è§£é¤ç¶æ 547 ã§å¼ã³åºããªããã°ãªããªãï¼ 471 * 現在のコンテキストを捨ててディスパッチ(prc_support.a30) 472 * 473 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ 474 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先 475 * 度マスク全解除状態で呼び出さなければならない. 548 476 */ 549 477 #define _kernel_exit_and_dispatch(); \ … … 554 482 555 483 /* 556 * ã«ã¼ãã«ã®çµäºå¦çã®å¼åºãï¼prc_support.a30ï¼557 * 558 * call_exit_kernel ã¯ï¼ã«ã¼ãã«ã®çµäºæã«å¼ã³åºãã¹ããã®ã§ï¼éã¿ã¹ã¯559 * ã³ã³ããã¹ãã«åãæãã¦ï¼ã«ã¼ãã«ã®çµäºå¦çï¼exit_kernelï¼ãå¼ã³åº560 * ãï¼484 * カーネルの終了処理の呼出し(prc_support.a30) 485 * 486 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク 487 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出 488 * す. 561 489 */ 562 490 extern void call_exit_kernel( void ) NoReturn; 563 491 564 492 /* 565 * ã¿ã¹ã¯ã³ã³ããã¹ãã®åæå 566 * 567 * ã¿ã¹ã¯ãä¼æ¢ç¶æ 568 ããå®è¡ã§ããç¶æ 569 ã«ç§»è¡ããæã«å¼ã°ããï¼ãã®æç¹ 570 * ã§ã¹ã¿ãã¯é åã使ã£ã¦ã¯ãªããªãï¼ 571 * 572 * activate_contextãï¼ã¤ã³ã©ã¤ã³é¢æ°ã§ã¯ãªããã¯ãå®ç¾©ã¨ãã¦ããã®ã¯ï¼ 573 * ãã®æç¹ã§ã¯TCBãå®ç¾©ããã¦ããªãããã§ããï¼ 493 * タスクコンテキストの初期化 494 * 495 * タスクが休止状態から実行できる状態に移行する時に呼ばれる.この時点 496 * でスタック領域を使ってはならない. 497 * 498 * activate_contextを,インライン関数ではなくマクロ定義としているのは, 499 * この時点ではTCBが定義されていないためである. 574 500 */ 575 501 extern void start_r( void ); … … 579 505 { \ 580 506 \ 581 /* ã¹ã¿ãã¯ãã¤ã³ã¿åæå¤ã®è¨å®*/ \507 /* スタックポインタ初期値の設定 */ \ 582 508 ( p_tcb )->tskctxb.sp = ( void * )((( uint32_t ) ( p_tcb )->p_tinib->stk ) + \ 583 509 ( p_tcb )->p_tinib->stksz ); \ 584 /* èµ·åçªå°ã®è¨å®*/ \510 /* 起動番地の設定 */ \ 585 511 ( p_tcb )->tskctxb.pc = ( FP ) start_r; \ 586 512 } \ … … 589 515 590 516 /* 591 * calltex ã¯ä½¿ç¨ããªã517 * calltexは使用しない 592 518 */ 593 519 #define OMIT_CALLTEX … … 595 521 596 522 /* 597 * å²è¾¼ã¿ãã³ãã©ã®è¨å® 598 * 599 * RX630ã¯ROMã«å²è¾¼ã¿ãã¯ã¿ãé 600 ç½®ããããï¼æ¬é¢æ°ã¯ç©ºé¢æ°ã§å®è£ 601 ããï¼ 523 * 割込みハンドラの設定 524 * 525 * RX630はROMに割込みベクタを配置するため,本関数は空関数で実装する. 602 526 */ 603 527 Inline void … … 607 531 608 532 /* 609 * CPUä¾å¤ãã³ãã©ã®è¨å® 610 * 611 * RX630ã¯ROMã«ä¾å¤ãã¯ã¿ãé 612 ç½®ããããï¼æ¬é¢æ°ã¯ç©ºé¢æ°ã§å®è£ 613 ããï¼ 533 * CPU例外ハンドラの設定 534 * 535 * RX630はROMに例外ベクタを配置するため,本関数は空関数で実装する. 614 536 */ 615 537 Inline void … … 619 541 620 542 /* 621 * å²è¾¼ã¿/ä¾å¤ãã³ãã©ã®å 622 ¥å£å¦çã®çæãã¯ã 623 * 624 * ãã³ãã¬ã¼ããã¡ã¤ã«ã«ããçæãããã空ãã¯ãã¨ããï¼ 543 * 割込み/例外ハンドラの入口処理の生成マクロ 544 * 545 * テンプレートファイルにより生成するため空マクロとする. 625 546 */ 626 547 #define HDR_ENTRY(hdr, intexc_num , tobejmp) 627 548 628 549 /* 629 * å²è¾¼ã¿ãã³ãã©ã®å 630 ¥å£å¦çã®çæãã¯ã 550 * 割込みハンドラの入口処理の生成マクロ 631 551 */ 632 552 #define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry … … 639 559 640 560 /* 641 * CPUä¾å¤ãã³ãã©ã®å 642 ¥å£å¦çã®çæãã¯ã 561 * CPU例外ハンドラの入口処理の生成マクロ 643 562 */ 644 563 #define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry … … 651 570 652 571 /* 653 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ãã®åç 654 § 655 * 656 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ããï¼ã¿ã¹ã¯ã³ã³ããã¹ãã®æã«FALSEï¼ 657 * ããã§ãªãæã«trueãè¿ãï¼ 572 * CPU例外の発生した時のコンテキストの参照 573 * 574 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にFALSE, 575 * そうでない時にtrueを返す. 658 576 */ 659 577 Inline bool_t … … 661 579 { 662 580 /* 663 * ãã¹ãã«ã¦ã³ã¿ã1ãã大ãªãéã¿ã¹ã¯ã³ã³ããã¹ã581 * ネストカウンタが1より大なら非タスクコンテキスト 664 582 */ 665 583 return( intnest > 1U ); … … 669 587 670 588 /* 671 * CPUä¾å¤æ 672 å ± p_excinf ãã PSW ã®å¤ãåå¾ããããã®ãªãã»ããå¤ 673 * EXCNO + ACC + FPSW + R1ï½R15 + PC 589 * CPU例外情報 p_excinf から PSW の値を取得するためのオフセット値 590 * EXCNO + ACC + FPSW + R1~R15 + PC 674 591 */ 675 592 #define EXC_GET_PSW_OFFSET (4+8+4+60+4) … … 678 595 679 596 /* 680 * CPUä¾å¤ã®çºçããæã®IPLã®åç 681 § 597 * CPU例外の発生した時のIPLの参照 682 598 */ 683 599 Inline uint32_t … … 697 613 698 614 /* 699 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ãã¨å²è¾¼ã¿ã®ãã¹ã¯ç¶æ 700 ã®åç 701 § 702 * 703 * CPUä¾å¤ã®çºçããæã®ã·ã¹ãã ç¶æ 704 ãï¼ã«ã¼ãã«å®è¡ä¸ã§ãªãï¼ã¿ã¹ã¯ã³ 705 * ã³ããã¹ãã§ããï¼å 706 ¨å²è¾¼ã¿ããã¯ç¶æ 707 ã§ãªãï¼CPUããã¯ç¶æ 708 ã§ãªãï¼ï¼ã¢ 709 * ãã«ä¸ã®ï¼å²è¾¼ã¿åªå 710 度ãã¹ã¯å 711 ¨è§£é¤ç¶æ 712 ã§ããæã«trueï¼ããã§ãªãæ 713 * ã«FALSEãè¿ãï¼CPUä¾å¤ãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦çä¸ã§çºçããå ´å 714 * ã«ãFALSEãè¿ãï¼ï¼ 615 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照 616 * 617 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ 618 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,(モ 619 * デル上の)割込み優先度マスク全解除状態である時にtrue,そうでない時 620 * にFALSEを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合 621 * にもFALSEを返す). 715 622 * 716 * ã«ã¼ãã«å®è¡ä¸ã§ãªãâ (TIPM_LOCK== -15) Iãã©ã°== 1623 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1 717 624 * (else) IPL < IPL_LOCK 718 * ã¿ã¹ã¯ã³ã³ããã¹ãã§ããâintnest == 0 719 * å 720 ¨å²è¾¼ã¿ããã¯ã§ãªãâ Iãã©ã° == 1 721 * å²è¾¼ã¿åªå 722 度ãã¹ã¯ãå 723 ¨è§£é¤âIPL == 0 625 * タスクコンテキストである→intnest == 0 626 * 全割込みロックでない→ Iフラグ == 1 627 * 割込み優先度マスクが全解除→IPL == 0 724 628 * 725 629 * … … 734 638 735 639 /* 736 * CPUä¾å¤ã®çºçããæã®ã³ã³ããã¹ãã¨å²è¾¼ã¿ï¼CPUããã¯ç¶æ 737 ã®åç 738 § 739 * 740 * CPUä¾å¤ã®çºçããæã®ã·ã¹ãã ç¶æ 741 ãï¼ã«ã¼ãã«å®è¡ä¸ã§ãªãï¼ã¿ã¹ã¯ã³ 742 * ã³ããã¹ãã§ããï¼å 743 ¨å²è¾¼ã¿ããã¯ç¶æ 744 ã§ãªãï¼CPUããã¯ç¶æ 745 ã§ãªãæã« 746 * trueï¼ããã§ãªãæã«falseãè¿ãï¼CPUä¾å¤ãã«ã¼ãã«ç®¡çå¤ã®å²è¾¼ã¿å¦ 747 * çä¸ã§çºçããå ´åã«ãfalseãè¿ãï¼ï¼ 640 * CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照 641 * 642 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ 643 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でない時に 644 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処 645 * 理中で発生した場合にもfalseを返す). 748 646 * 749 * ã«ã¼ãã«å®è¡ä¸ã§ãªãâ (TIPM_LOCK== -15) Iãã©ã°== 1647 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1 750 648 * (else) IPL < TIPM_LOCK 751 * ã¿ã¹ã¯ã³ã³ããã¹ãã§ããâintnest < 1 752 * å 753 ¨å²è¾¼ã¿ããã¯ã§ãªãâ Iãã©ã° == 1 754 * CPUããã¯ç¶æ 755 ã§ãªãâ(TIPM_LOCK== -15) Iãã©ã° == 1 649 * タスクコンテキストである→intnest < 1 650 * 全割込みロックでない→ Iフラグ == 1 651 * CPUロック状態でない→(TIPM_LOCK== -15) Iフラグ == 1 756 652 * (else) IPL < TIPM_LOCK 757 653 */ … … 771 667 772 668 /* 773 * ããã»ããµä¾åã®åæå669 * プロセッサ依存の初期化 774 670 */ 775 671 extern void prc_initialize( void ); 776 672 777 673 /* 778 * ããã»ããµä¾åã®çµäºæå¦ç674 * プロセッサ依存の終了時処理 779 675 */ 780 676 extern void prc_terminate( void ); … … 783 679 #ifndef OMIT_DEFAULT_INT_HANDLER 784 680 /* 785 * æªç»é²ã®å²è¾¼ã¿ãçºçããå ´åã«å¼ã³åºããã681 * 未登録の割込みが発生した場合に呼び出される 786 682 */ 787 683 void default_int_handler( void ); … … 790 686 #ifndef OMIT_DEFAULT_EXC_HANDLER 791 687 /* 792 * æªç»é²ã®ä¾å¤ãçºçããå ´åã«å¼ã³åºããã688 * 未登録の例外が発生した場合に呼び出される 793 689 */ 794 690 void default_exc_handler( void );
Note:
See TracChangeset
for help on using the changeset viewer.