source: rubycfg_asp/trunk/asp_dcre/arch/rx630_gcc/prc_config.h@ 315

Last change on this file since 315 was 315, checked in by coas-nagasima, 7 years ago

SVNプロパティを設定

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=UTF-8
File size: 21.0 KB
Line 
1/*
2 * TOPPERS/ASP Kernel
3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005,2006 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2008-2010 by Witz Corporation, JAPAN
11 * Copyright (C) 2013 by Mitsuhiro Matsuura
12 *
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 * 免責すること.
35 *
36 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
37 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
38 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
39 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40 * の責任を負わない.
41 *
42 * @(#) $Id: prc_config.h 315 2017-07-23 05:29:40Z coas-nagasima $
43 */
44
45/*
46 * プロセッサ依存モジュール(RX630用)
47 *
48 * このインクルードファイルは,target_config.h(または,そこからインク
49 * ルードされるファイル)のみからインクルードされる.他のファイルから
50 * 直接インクルードしてはならない.
51 */
52
53#ifndef TOPPERS_PRC_CONFIG_H
54#define TOPPERS_PRC_CONFIG_H
55
56/*
57 * プロセッサの特殊命令のインライン関数定義
58 */
59#include "prc_insn.h"
60#include "sil.h"
61
62#ifndef TOPPERS_MACRO_ONLY
63
64/*
65 * 非タスクコンテキスト用のスタック初期値
66 */
67
68#define TOPPERS_ISTKPT( istk, istksz ) (( STK_T * )(( char * )( istk ) + ( istksz )))
69
70/*
71 * タスクコンテキストブロックの定義
72 */
73typedef struct task_context_block {
74 void *sp; /* スタックポインタ */
75 FP pc; /* プログラムカウンタ */
76} TSKCTXB;
77
78
79/*
80 * 割込み発生回数を保存する変数
81 */
82extern uint16_t intnest;
83
84#endif /* TOPPERS_MACRO_ONLY */
85
86/*
87 * CPUロック状態での割込み優先度マスク
88 *
89 * TIPM_LOCKは,CPUロック状態での割込み優先度マスク,すなわち,カーネ
90 * ル管理外のものを除くすべての割込み要求をマスクする値に定義する.
91 *
92 * TMIN_INTPRI変更することで管理外割込みの有無を決定する.
93 * 例えばTMIN_INTPRIを-14に設定すると,レベル15の割込みがカーネル管理外と
94 * なる.TMIN_INTPRIを-15に設定すると,NMI以外にカーネル管理外の割込みを
95 * 設けないことになる(この場合には-15に設定することを推奨する).
96 */
97#ifndef TIPM_LOCK
98#define TIPM_LOCK TMIN_INTPRI
99#endif /* TIPM_LOCK */
100
101#ifndef TOPPERS_MACRO_ONLY
102
103/*
104 * TOPPERS標準割込み処理モデルの実現
105 */
106/*
107 * コンテキストの参照
108 *
109 * RXでは,割込みの戻り先がタスクかどうかを判断するために intnest
110 * を使用している.これを用いてコンテキストを判断する.
111 */
112Inline bool_t
113sense_context( void )
114{
115 /* ネストカウンタ0より大なら非タスクコンテキスト */
116 return ( intnest > 0U );
117}
118
119
120/*
121 * CPUロックフラグ実現のための変数
122 *
123 * これらの変数は,CPUロック状態の時のみ書き換えてよいものとする.
124 */
125#if TIPM_LOCK != -15
126extern bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
127extern uint32_t saved_ipl; /* 割込み優先度レベルを保存する変数 */
128#endif /* TIPM_LOCK != -15 */
129
130#endif /* TOPPERS_MACRO_ONLY */
131
132
133/*
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
148 */
149#define IPL_LOCK ( IPM_TO_IPL( TIPM_LOCK ) )
150
151/*
152 * TIPM_ENAALL(割込み優先度マスク全解除)のIPL
153 */
154#define IPL_ENAALL ( IPM_TO_IPL( TIPM_ENAALL ) )
155
156
157#ifndef TOPPERS_MACRO_ONLY
158
159/*
160 * 割込み要因毎のレベル & 属性定義テーブル
161 * (テンプレートファイルによる出力)
162 */
163typedef struct cfg_int_info {
164 PRI intpri;
165 ATR intatr;
166} CFG_INT_INFO;
167
168extern const CFG_INT_INFO cfg_int_table[];
169
170
171/*
172 * 割込み番号の範囲の判定
173 *
174 * 割込み番号が有効な値か厳密にチェックするため,
175 * コンフィギュレータ出力テーブルを参照する.
176 */
177#define VALID_INTNO( intno ) \
178 ( cfg_int_table[( intno )].intpri > 0 )
179#define VALID_INTNO_DISINT( intno ) VALID_INTNO( intno )
180#define VALID_INTNO_CFGINT( intno ) VALID_INTNO( intno )
181
182/* cre_intで有効な割込み番号の指定 */
183#define VALID_INTNO_CREINT VALID_INTNO_CFGINT((intno))
184
185/* cre_isrで有効な割込み番号の指定 */
186#define VALID_INTNO_CREISR(intno) VALID_INTNO_CFGINT((intno))
187
188
189/*
190 * 割込み制御レジスタ関連の定義
191 */
192#define IRQ_POSEDGE ( 0x08U )
193#define IRQ_NEGEDGE ( 0x04U )
194#define IRQ_BOTHEDGE ( 0x0CU )
195#define IRQ_LOWLEVEL ( 0x00U )
196
197
198/*
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 * ないものと想定している.
212 */
213Inline void
214x_lock_cpu( void )
215{
216#if TIPM_LOCK == -15
217 disint();
218#else /* TIPM_LOCK == -15 */
219 uint32_t ipl;
220
221 /*
222 * current_ipl()の返り値を直接saved_iplに保存せず,一時変数ipl
223 * を用いているのは,current_ipl()を呼んだ直後に割込みが発生し,
224 * 起動された割込み処理でsaved_iplが変更される可能性があるためで
225 * ある.
226 */
227 ipl = current_ipl();
228 if( IPL_LOCK > ipl ){
229 set_ipl( IPL_LOCK );
230 }
231
232 saved_ipl = ipl;
233 lock_flag = true;
234#endif /* TIPM_LOCK == -15 */
235}
236
237#define t_lock_cpu() x_lock_cpu()
238#define i_lock_cpu() x_lock_cpu()
239
240
241/*
242 * CPUロック状態の解除
243 *
244 * lock_flagをFALSEにし,IPM(ハードウェアの割込み優先度マスク)を,
245 * saved_iipmに保存した値に戻す.
246 *
247 * この関数は,CPUロック状態(lock_flagがtrueの状態)でのみ呼ばれるも
248 * のと想定している.
249 */
250Inline void
251x_unlock_cpu( void )
252{
253#if TIPM_LOCK == -15
254 enaint();
255#else /* TIPM_LOCK == -15 */
256 lock_flag = false;
257 set_ipl( saved_ipl );
258#endif /* TIPM_LOCK == -15 */
259}
260
261#define t_unlock_cpu() x_unlock_cpu()
262#define i_unlock_cpu() x_unlock_cpu()
263
264
265/*
266 * CPUロック状態の参照
267 */
268Inline bool_t
269x_sense_lock( void )
270{
271#if TIPM_LOCK == -15
272 return (( bool_t )(( current_psw() & PSW_I_MASK) == 0 ));
273#else /* TIPM_LOCK == -15 */
274 return lock_flag;
275#endif /* TIPM_LOCK == -15 */
276}
277
278#define t_sense_lock() x_sense_lock()
279#define i_sense_lock() x_sense_lock()
280
281
282/*
283 * (モデル上の)割込み優先度マスクの設定
284 *
285 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優先度マ
286 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
287 * を設定し,さらに,ハードウェアの割込み優先度マスクを,設定しようと
288 * した(モデル上の)割込み優先度マスクとTIPM_LOCKの高い方に設定する.
289 */
290Inline void
291x_set_ipm( PRI intpri )
292{
293 uint32_t ipl = IPM_TO_IPL( intpri );
294#if TIPM_LOCK == -15
295 set_ipl(ipl);
296#else /* TIPM_LOCK == -15 */
297 if( !lock_flag ){
298 set_ipl(ipl);
299 }
300 else {
301 saved_ipl = ipl;
302 set_ipl(ipl > IPL_LOCK ? ipl : IPL_LOCK);
303 }
304#endif /* TIPM_LOCK == -15 */
305}
306
307#define t_set_ipm( intpri ) x_set_ipm( intpri )
308#define i_set_ipm( intpri ) x_set_ipm( intpri )
309
310
311/*
312 * (モデル上の)割込み優先度マスクの参照
313 *
314 * CPUロックフラグがクリアされている時はハードウェアの割込み優先度マ
315 * スクを,セットされている時はsaved_iipmを参照する.
316 */
317Inline PRI
318x_get_ipm( void )
319{
320 uint32_t ipl;
321#if TIPM_LOCK == -15
322 ipl = current_ipl();
323#else /* TIPM_LOCK == -15 */
324 if (!lock_flag) {
325 ipl = current_ipl();
326 }
327 else {
328 ipl = saved_ipl;
329 }
330#endif /* TIPM_LOCK == -15 */
331 return IPL_TO_IPM( ipl );
332}
333
334#define t_get_ipm() x_get_ipm()
335#define i_get_ipm() x_get_ipm()
336
337
338/*
339 * 割込み要求禁止フラグのセット
340 *
341 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
342 * フラグをセットしようとした場合には,FALSEを返す.
343 */
344Inline bool_t
345x_disable_int( INTNO intno )
346{
347 /*
348 * レベル定義が0である場合はCFG_INTされていない
349 */
350 if( cfg_int_table[intno].intpri == 0 ){
351 return ( false );
352 }
353
354 *ier_reg_addr[intno].addr &= ( ~ier_reg_addr[intno].offset );
355
356 return ( true );
357}
358
359#define t_disable_int( intno ) x_disable_int( intno )
360#define i_disable_int( intno ) x_disable_int( intno )
361
362
363/*
364 * 割込み要求禁止フラグのクリア
365 *
366 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
367 * フラグをクリアしようとした場合には,FALSEを返す.
368 */
369Inline bool_t
370x_enable_int( INTNO intno )
371{
372 /*
373 * レベル定義が0である場合はCFG_INTされていない
374 */
375 if( cfg_int_table[intno].intpri == 0 ){
376 return ( false );
377 }
378
379 *ier_reg_addr[intno].addr |= ier_reg_addr[intno].offset;
380
381 return ( true );
382}
383
384#define t_enable_int( intno ) x_enable_int( intno )
385#define i_enable_int( intno ) x_enable_int( intno )
386
387
388/*
389 * 割込み要求のクリア
390 */
391Inline void
392x_clear_int( INTNO intno )
393{
394 *IR_REG(intno) = 0U;
395}
396
397#define t_clear_int( intno ) x_clear_int( intno )
398#define i_clear_int( intno ) x_clear_int( intno )
399
400
401/*
402 * 割込み要求のチェック
403 */
404Inline bool_t
405x_probe_int( INTNO intno )
406{
407 /*
408 * 割込み要求レジスタは0 or 1でしかないため,
409 * そのままの値を返す.
410 */
411 return ( *IR_REG(intno) );
412}
413
414#define t_probe_int( intno ) x_probe_int( intno )
415#define i_probe_int( intno ) x_probe_int( intno )
416
417
418/*
419 * 割込み要求ラインの属性の設定
420 */
421extern void x_config_int( INTNO intno, ATR intatr, PRI intpri );
422
423
424/*
425 * 割込みハンドラの入口で必要なIRC操作
426 *
427 */
428Inline void
429i_begin_int( INTNO intno )
430{
431 //volatile uint8_t reg;
432
433 /*
434 * レベル検出の割込みに対しては割込みステータス
435 * フラグをクリアする.
436 */
437 if( ( cfg_int_table[intno].intatr & TA_LOWLEVEL ) > 0 ){
438 if( *IR_REG(intno) > 0U ){
439 /*
440 * 外部割込みの場合, IRQ端子がHighに戻っている
441 * ことを確認する旨が記載されているが, 省略する.
442 */
443 // *ir_reg_addr[intno] = 0U;
444
445 /*
446 * ハードウェアマニュアルに0になったことを
447 * 確認する旨が記載あるため, レジスタ値を読み出す.
448 */
449 // reg = *ir_reg_addr[intno];
450 }
451 }
452}
453
454
455/*
456 * 割込みハンドラの出口で必要なIRC操作
457 *
458 */
459Inline void
460i_end_int( INTNO intno )
461{
462 /* 特に行うべき処理はない */
463}
464
465
466/*
467 * 最高優先順位タスクへのディスパッチ(prc_support.a30)
468 *
469 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
470 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ
471 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな
472 * ければならない.
473 */
474extern void dispatch( void );
475
476/*
477 * ディスパッチャの動作開始(prc_support.a30)
478 *
479 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
480 * みを禁止した状態(全割込みロック状態と同等の状態)で呼び出さなければ
481 * ならない.
482 */
483extern void start_dispatch( void ) NoReturn;
484
485/*
486 * 現在のコンテキストを捨ててディスパッチ(prc_support.a30)
487 *
488 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
489 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先
490 * 度マスク全解除状態で呼び出さなければならない.
491 */
492#define _kernel_exit_and_dispatch(); \
493 _exit_and_dispatch(); \
494 ercd = E_SYS;
495
496extern void _exit_and_dispatch( void ) NoReturn;
497
498/*
499 * カーネルの終了処理の呼出し(prc_support.a30)
500 *
501 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
502 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
503 * す.
504 */
505extern void call_exit_kernel( void ) NoReturn;
506
507/*
508 * タスクコンテキストの初期化
509 *
510 * タスクが休止状態から実行できる状態に移行する時に呼ばれる.この時点
511 * でスタック領域を使ってはならない.
512 *
513 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
514 * この時点ではTCBが定義されていないためである.
515 */
516extern void start_r( void );
517
518#define activate_context( p_tcb ) \
519{ \
520 { \
521 \
522 /* スタックポインタ初期値の設定 */ \
523 ( p_tcb )->tskctxb.sp = ( void * )((( uint32_t ) ( p_tcb )->p_tinib->stk ) + \
524 ( p_tcb )->p_tinib->stksz ); \
525 /* 起動番地の設定 */ \
526 ( p_tcb )->tskctxb.pc = ( FP ) start_r; \
527 } \
528}
529
530
531/*
532 * calltexは使用しない
533 */
534#define OMIT_CALLTEX
535
536
537/*
538 * 割込みハンドラの設定
539 *
540 * RX630はROMに割込みベクタを配置するため,本関数は空関数で実装する.
541 */
542Inline void
543x_define_inh( INHNO inhno, FP inthdr )
544{
545}
546
547
548/*
549 * CPU例外ハンドラの設定
550 *
551 * RX630はROMに例外ベクタを配置するため,本関数は空関数で実装する.
552 */
553Inline void
554x_define_exc( EXCNO excno, FP exchdr )
555{
556}
557
558
559/*
560 * 割込み/例外ハンドラの入口処理の生成マクロ
561 *
562 * テンプレートファイルにより生成するため空マクロとする.
563 */
564#define HDR_ENTRY(hdr, intexc_num , tobejmp)
565
566/*
567 * 割込みハンドラの入口処理の生成マクロ
568 */
569#define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry
570#define INT_ENTRY(inhno, inthdr) _INT_ENTRY(inhno , inthdr)
571
572#define _INTHDR_ENTRY(inhno, inhno_num ,inthdr) \
573 extern void _kernel_##inthdr##_##inhno##_entry(void);
574#define INTHDR_ENTRY(inhno, inhno_num ,inthdr) _INTHDR_ENTRY(inhno, inhno_num ,inthdr)
575
576
577/*
578 * CPU例外ハンドラの入口処理の生成マクロ
579 */
580#define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry
581#define EXC_ENTRY(excno , exchdr) _EXC_ENTRY(excno , exchdr)
582
583#define _EXCHDR_ENTRY(excno , excno_num , exchdr) \
584 extern void _kernel_##exchdr##_##excno##_entry(void);
585#define EXCHDR_ENTRY(excno , excno_num , exchdr) _EXCHDR_ENTRY(excno , excno_num , exchdr)
586
587
588/*
589 * CPU例外の発生した時のコンテキストの参照
590 *
591 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にFALSE,
592 * そうでない時にtrueを返す.
593 */
594Inline bool_t
595exc_sense_context( void *p_excinf )
596{
597 /*
598 * ネストカウンタが1より大なら非タスクコンテキスト
599 */
600 return( intnest > 1U );
601}
602
603#endif /* TOPPERS_MACRO_ONLY */
604
605/*
606 * CPU例外情報 p_excinf から PSW の値を取得するためのオフセット値
607 * EXCNO + ACC + FPSW + R1~R15 + PC
608 */
609#define EXC_GET_PSW_OFFSET (4+8+4+60+4)
610
611#ifndef TOPPERS_MACRO_ONLY
612
613/*
614 * CPU例外の発生した時のIPLの参照
615 */
616Inline uint32_t
617exc_get_ipl(void *p_excinf)
618{
619 return((*((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
620 & PSW_IPL_MASK);
621}
622
623Inline bool_t
624exc_sense_i(void *p_excinf)
625{
626 return((*(((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
627 & PSW_I_MASK) != 0u);
628}
629
630
631/*
632 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
633 *
634 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
635 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,(モ
636 * デル上の)割込み優先度マスク全解除状態である時にtrue,そうでない時
637 * にFALSEを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
638 * にもFALSEを返す).
639 *
640 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
641 * (else) IPL < IPL_LOCK
642 * タスクコンテキストである→intnest == 0
643 * 全割込みロックでない→ Iフラグ == 1
644 * 割込み優先度マスクが全解除→IPL == 0
645 *
646 *
647 */
648Inline bool_t
649exc_sense_intmask(void *p_excinf)
650{
651 return((!exc_sense_context(p_excinf))
652 && exc_sense_i(p_excinf)
653 && (exc_get_ipl(p_excinf) == IPL_ENAALL));
654}
655
656/*
657 * CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照
658 *
659 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
660 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でない時に
661 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
662 * 理中で発生した場合にもfalseを返す).
663 *
664 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
665 * (else) IPL < TIPM_LOCK
666 * タスクコンテキストである→intnest < 1
667 * 全割込みロックでない→ Iフラグ == 1
668 * CPUロック状態でない→(TIPM_LOCK== -15) Iフラグ == 1
669 * (else) IPL < TIPM_LOCK
670 */
671Inline bool_t
672exc_sense_unlock(void *p_excinf)
673{
674#if TIPM_LOCK == -15
675 return((!exc_sense_context(p_excinf))
676 && exc_sense_i(p_excinf));
677#else
678 return((!exc_sense_context(p_excinf))
679 && exc_sense_i(p_excinf)
680 && exc_get_ipl(p_excinf) < IPL_LOCK);
681#endif
682}
683
684
685/*
686 * プロセッサ依存の初期化
687 */
688extern void prc_initialize( void );
689
690/*
691 * プロセッサ依存の終了時処理
692 */
693extern void prc_terminate( void );
694
695
696#ifndef OMIT_DEFAULT_INT_HANDLER
697/*
698 * 未登録の割込みが発生した場合に呼び出される
699 */
700void default_int_handler( void );
701#endif /* OMIT_DEFAULT_INT_HANDLER */
702
703#ifndef OMIT_DEFAULT_EXC_HANDLER
704/*
705 * 未登録の例外が発生した場合に呼び出される
706 */
707void default_exc_handler( void );
708#endif /* OMIT_DEFAULT_EXC_HANDLER */
709
710
711#endif /* TOPPERS_MACRO_ONLY */
712
713#endif /* TOPPERS_PRC_CONFIG_H */
714
Note: See TracBrowser for help on using the repository browser.