source: azure_iot_hub/trunk/asp3_dcre/arch/rx630_gcc/prc_kernel_impl.h@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr
File size: 20.3 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 * 上記著作権者
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è²¬ã™ã‚‹ã“と.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
51お
52 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
53 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
54 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
55 * の責任を負わない.
56 *
57 * @(#) $Id: prc_kernel_impl.h 388 2019-05-22 11:25:18Z coas-nagasima $
58 */
59
60/*
61 * プロセッサ依存モジュール(RX630用)
62 *
63 * このインクルードファイルは,target_kernel_impl.h(または,そこからインク
64 * ルードされるファイル)のみからインクルードされる.他のファイルから
65 * 直接インクルードしてはならない.
66 */
67
68#ifndef TOPPERS_PRC_CONFIG_H
69#define TOPPERS_PRC_CONFIG_H
70
71/*
72 * プロセッサの特殊命令のインライン関数定義
73 */
74#include "prc_insn.h"
75#include "sil.h"
76
77#ifndef TOPPERS_MACRO_ONLY
78
79/*
80 * 非タスクコンテキスト用のスタック初期値
81 */
82
83#define TOPPERS_ISTKPT( istk, istksz ) (( STK_T * )(( char * )( istk ) + ( istksz )))
84
85/*
86 * タスクコンテキストブロックの定義
87 */
88typedef struct task_context_block {
89 void *sp; /* スタックポインタ */
90 FP pc; /* プログラムカウンタ */
91} TSKCTXB;
92
93
94/*
95 * 割込み発生回数を保存する変数
96 */
97extern uint16_t intnest;
98
99#endif /* TOPPERS_MACRO_ONLY */
100
101/*
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に設定することを推奨する).
115 */
116#ifndef TIPM_LOCK
117#define TIPM_LOCK TMIN_INTPRI
118#endif /* TIPM_LOCK */
119
120#ifndef TOPPERS_MACRO_ONLY
121
122/*
123 * TOPPERS標準割込み処理モデルの実現
124 */
125/*
126 * コンテキストの参ç…
127§
128 *
129 * RXでは,割込みの戻りå…
130ˆãŒã‚¿ã‚¹ã‚¯ã‹ã©ã†ã‹ã‚’判断するために intnest
131 * を使用している.これを用いてコンテキストを判断する.
132 */
133Inline bool_t
134sense_context( void )
135{
136 /* ネストカウンタ0より大なら非タスクコンテキスト */
137 return ( intnest > 0U );
138}
139
140
141/*
142 * CPUロックフラグ実現のための変数
143 *
144 * これらの変数は,CPUロック状æ…
145‹ã®æ™‚のみ書き換えてよいものとする.
146 */
147#if TIPM_LOCK != -15
148extern bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
149extern uint32_t saved_ipl; /* 割込み優å…
150ˆåº¦ãƒ¬ãƒ™ãƒ«ã‚’保存する変数 */
151#endif /* TIPM_LOCK != -15 */
152
153#endif /* TOPPERS_MACRO_ONLY */
154
155
156/*
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
179 */
180#define IPL_LOCK ( IPM_TO_IPL( TIPM_LOCK ) )
181
182/*
183 * TIPM_ENAALL(割込み優å…
184ˆåº¦ãƒžã‚¹ã‚¯å…
185¨è§£é™¤ï¼‰ã®IPL
186 */
187#define IPL_ENAALL ( IPM_TO_IPL( TIPM_ENAALL ) )
188
189
190#ifndef TOPPERS_MACRO_ONLY
191
192/*
193 * 割込み要因毎のレベル & 属性定義テーブル
194 * (テンプレートファイルによる出力)
195 */
196typedef struct cfg_int_info {
197 PRI intpri;
198 ATR intatr;
199} CFG_INT_INFO;
200
201extern const CFG_INT_INFO cfg_int_table[];
202
203
204/*
205 * 割込み番号の範囲の判定
206 *
207 * 割込み番号が有効な値か厳密にチェックするため,
208 * コンフィギュレータ出力テーブルを参ç…
209§ã™ã‚‹.
210 */
211#define VALID_INTNO( intno ) \
212 ( cfg_int_table[( intno )].intpri > 0 )
213#define VALID_INTNO_DISINT( intno ) VALID_INTNO( intno )
214#define VALID_INTNO_CFGINT( intno ) VALID_INTNO( intno )
215
216/* cre_intで有効な割込み番号の指定 */
217#define VALID_INTNO_CREINT VALID_INTNO_CFGINT((intno))
218
219/* cre_isrで有効な割込み番号の指定 */
220#define VALID_INTNO_CREISR(intno) VALID_INTNO_CFGINT((intno))
221
222
223/*
224 * 割込み制御レジスタ関連の定義
225 */
226#define IRQ_POSEDGE ( 0x08U )
227#define IRQ_NEGEDGE ( 0x04U )
228#define IRQ_BOTHEDGE ( 0x0CU )
229#define IRQ_LOWLEVEL ( 0x00U )
230
231
232/*
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 * ないものと想定している.
252 */
253Inline void
254lock_cpu( void )
255{
256#if TIPM_LOCK == -15
257 disint();
258#else /* TIPM_LOCK == -15 */
259 uint32_t ipl;
260
261 /*
262 * current_ipl()の返り値を直接saved_iplに保存せず,一時変数ipl
263 * を用いているのは,current_ipl()を呼んだ直後に割込みが発生し,
264 * 起動された割込み処理でsaved_iplが変更される可能性があるためで
265 * ある.
266 */
267 ipl = current_ipl();
268 if( IPL_LOCK > ipl ){
269 set_ipl( IPL_LOCK );
270 }
271
272 saved_ipl = ipl;
273 lock_flag = true;
274#endif /* TIPM_LOCK == -15 */
275}
276
277#define lock_cpu_dsp() lock_cpu()
278
279/*
280 * CPUロック状æ…
281‹ã®è§£é™¤
282 *
283 * lock_flagをFALSEにし,IPM(ハードウェアの割込み優å…
284ˆåº¦ãƒžã‚¹ã‚¯ï¼‰ã‚’,
285 * saved_iipmに保存した値に戻す.
286 *
287 * この関数は,CPUロック状æ…
288‹ï¼ˆlock_flagがtrueの状æ…
289‹ï¼‰ã§ã®ã¿å‘¼ã°ã‚Œã‚‹ã‚‚
290 * のと想定している.
291 */
292Inline void
293unlock_cpu( void )
294{
295#if TIPM_LOCK == -15
296 enaint();
297#else /* TIPM_LOCK == -15 */
298 lock_flag = false;
299 set_ipl( saved_ipl );
300#endif /* TIPM_LOCK == -15 */
301}
302
303#define unlock_cpu_dsp() unlock_cpu()
304
305/*
306 * CPUロック状æ…
307‹ã®å‚ç…
308§
309 */
310Inline bool_t
311sense_lock( void )
312{
313#if TIPM_LOCK == -15
314 return (( bool_t )(( current_psw() & PSW_I_MASK) == 0 ));
315#else /* TIPM_LOCK == -15 */
316 return lock_flag;
317#endif /* TIPM_LOCK == -15 */
318}
319
320
321/*
322 * 割込み属性の設定のチェック
323 */
324Inline bool_t
325check_intno_cfg(INTNO intno)
326{
327 return(cfg_int_table[intno].intpri != 0U);
328}
329
330/*
331 * (モデル上の)割込み優å…
332ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
333 *
334 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優å…
335ˆåº¦ãƒž
336 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
337 * を設定し,さらに,ハードウェアの割込み優å…
338ˆåº¦ãƒžã‚¹ã‚¯ã‚’,設定しようと
339 * した(モデル上の)割込み優å…
340ˆåº¦ãƒžã‚¹ã‚¯ã¨TIPM_LOCKの高い方に設定する.
341 */
342Inline void
343t_set_ipm( PRI intpri )
344{
345 uint32_t ipl = IPM_TO_IPL( intpri );
346#if TIPM_LOCK == -15
347 set_ipl(ipl);
348#else /* TIPM_LOCK == -15 */
349 if( !lock_flag ){
350 set_ipl(ipl);
351 }
352 else {
353 saved_ipl = ipl;
354 set_ipl(ipl > IPL_LOCK ? ipl : IPL_LOCK);
355 }
356#endif /* TIPM_LOCK == -15 */
357}
358
359
360
361/*
362 * (モデル上の)割込み優å…
363ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
364§
365 *
366 * CPUロックフラグがクリアされている時はハードウェアの割込み優å…
367ˆåº¦ãƒž
368 * スクを,セットされている時はsaved_iipmを参ç…
369§ã™ã‚‹ï¼Ž
370 */
371Inline PRI
372t_get_ipm( void )
373{
374 uint32_t ipl;
375#if TIPM_LOCK == -15
376 ipl = current_ipl();
377#else /* TIPM_LOCK == -15 */
378 if (!lock_flag) {
379 ipl = current_ipl();
380 }
381 else {
382 ipl = saved_ipl;
383 }
384#endif /* TIPM_LOCK == -15 */
385 return IPL_TO_IPM( ipl );
386}
387
388
389
390/*
391 * 割込み要求禁止フラグのセット
392 *
393 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
394 * フラグをセットしようとした場合には,FALSEを返す.
395 */
396Inline bool_t
397disable_int( INTNO intno )
398{
399 /*
400 * レベル定義が0である場合はCFG_INTされていない
401 */
402 if( cfg_int_table[intno].intpri == 0 ){
403 return ( false );
404 }
405
406 sil_wrb_mem(ier_reg_addr[intno].addr,
407 sil_reb_mem(ier_reg_addr[intno].addr) & ~ier_reg_addr[intno].offset);
408
409 return ( true );
410}
411
412
413/*
414 * 割込み要求禁止フラグのクリア
415 *
416 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
417 * フラグをクリアしようとした場合には,FALSEを返す.
418 */
419Inline bool_t
420enable_int( INTNO intno )
421{
422 /*
423 * レベル定義が0である場合はCFG_INTされていない
424 */
425 if( cfg_int_table[intno].intpri == 0 ){
426 return ( false );
427 }
428
429 sil_wrb_mem(ier_reg_addr[intno].addr,
430 sil_reb_mem(ier_reg_addr[intno].addr) | ier_reg_addr[intno].offset);
431
432 return ( true );
433}
434
435
436/*
437 * 割込み要求がクリアできる状æ…
438‹ã‹ï¼Ÿ
439 */
440Inline bool_t
441check_intno_clear(INTNO intno)
442{
443 return(true);
444}
445
446/*
447 * 割込み要求のクリア
448 */
449Inline void
450clear_int( INTNO intno )
451{
452 sil_wrb_mem(IR_REG(intno), 0U);
453}
454
455
456/*
457 * 割込みが要求できる状æ…
458‹ã‹ï¼Ÿ
459 */
460Inline bool_t
461check_intno_raise(INTNO intno)
462{
463 return(true);
464}
465
466/*
467 * 割込みの要求
468 * 注意:チップでサポートされていない操作
469 */
470Inline void
471raise_int( INTNO intno )
472{
473 *IR_REG(intno) = 1U;
474}
475
476/*
477 * 割込み要求のチェック
478 */
479Inline bool_t
480probe_int( INTNO intno )
481{
482 /*
483 * 割込み要求レジスタは0 or 1でしかないため,
484 * そのままの値を返す.
485 */
486 return sil_reb_mem(IR_REG(intno));
487}
488
489/*
490 * 割込み要求ラインの属性の設定
491 */
492extern void config_int( INTNO intno, ATR intatr, PRI intpri );
493
494/*
495 * 割込みを受け付けるための遅
496延処理
497 */
498Inline void
499delay_for_interrupt(void)
500{
501}
502
503/*
504 * 最高優å…
505ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(prc_support.a30)
506 *
507 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
508 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状æ…
509‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
510 * チ許可状æ…
511‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
512ˆåº¦ãƒžã‚¹ã‚¯å…
513¨è§£é™¤çŠ¶æ…
514‹ã§å‘¼ã³å‡ºã•ãª
515 * ければならない.
516 */
517extern void dispatch( void );
518
519/*
520 * 非タスクコンテキストからのディスパッチ要求
521 */
522#define request_dispatch()
523
524/*
525 * ディスパッチャの動作開始(prc_support.a30)
526 *
527 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
528 * みを禁止した状æ…
529‹ï¼ˆå…
530¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
531‹ã¨åŒç­‰ã®çŠ¶æ…
532‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘れば
533 * ならない.
534 */
535extern void start_dispatch( void ) NoReturn;
536
537/*
538 * 現在のコンテキストを捨ててディスパッチ(prc_support.a30)
539 *
540 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
541 * スト・CPUロック状æ…
542‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
543‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
544ˆ
545 * 度マスクå…
546¨è§£é™¤çŠ¶æ…
547‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
548 */
549#define _kernel_exit_and_dispatch(); \
550 _exit_and_dispatch(); \
551 ercd = E_SYS;
552
553extern void _exit_and_dispatch( void ) NoReturn;
554
555/*
556 * カーネルの終了処理の呼出し(prc_support.a30)
557 *
558 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
559 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
560 * す.
561 */
562extern void call_exit_kernel( void ) NoReturn;
563
564/*
565 * タスクコンテキストの初期化
566 *
567 * タスクが休止状æ…
568‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
569‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.この時点
570 * でスタック領域を使ってはならない.
571 *
572 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
573 * この時点ではTCBが定義されていないためである.
574 */
575extern void start_r( void );
576
577#define activate_context( p_tcb ) \
578{ \
579 { \
580 \
581 /* スタックポインタ初期値の設定 */ \
582 ( p_tcb )->tskctxb.sp = ( void * )((( uint32_t ) ( p_tcb )->p_tinib->stk ) + \
583 ( p_tcb )->p_tinib->stksz ); \
584 /* 起動番地の設定 */ \
585 ( p_tcb )->tskctxb.pc = ( FP ) start_r; \
586 } \
587}
588
589
590/*
591 * calltexは使用しない
592 */
593#define OMIT_CALLTEX
594
595
596/*
597 * 割込みハンドラの設定
598 *
599 * RX630はROMに割込みベクタをé…
600ç½®ã™ã‚‹ãŸã‚ï¼Œæœ¬é–¢æ•°ã¯ç©ºé–¢æ•°ã§å®Ÿè£…
601する.
602 */
603Inline void
604define_inh( INHNO inhno, FP inthdr )
605{
606}
607
608/*
609 * CPU例外ハンドラの設定
610 *
611 * RX630はROMに例外ベクタをé…
612ç½®ã™ã‚‹ãŸã‚ï¼Œæœ¬é–¢æ•°ã¯ç©ºé–¢æ•°ã§å®Ÿè£…
613する.
614 */
615Inline void
616define_exc( EXCNO excno, FP exchdr )
617{
618}
619
620/*
621 * 割込み/例外ハンドラのå…
622¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
623 *
624 * テンプレートファイルにより生成するため空マクロとする.
625 */
626#define HDR_ENTRY(hdr, intexc_num , tobejmp)
627
628/*
629 * 割込みハンドラのå…
630¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
631 */
632#define _INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno##_entry
633#define INT_ENTRY(inhno, inthdr) _INT_ENTRY(inhno , inthdr)
634
635#define _INTHDR_ENTRY(inhno, inhno_num ,inthdr) \
636 extern void _kernel_##inthdr##_##inhno##_entry(void);
637#define INTHDR_ENTRY(inhno, inhno_num ,inthdr) _INTHDR_ENTRY(inhno, inhno_num ,inthdr)
638
639
640/*
641 * CPU例外ハンドラのå…
642¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
643 */
644#define _EXC_ENTRY(excno , exchdr) _kernel_##exchdr##_##excno##_entry
645#define EXC_ENTRY(excno , exchdr) _EXC_ENTRY(excno , exchdr)
646
647#define _EXCHDR_ENTRY(excno , excno_num , exchdr) \
648 extern void _kernel_##exchdr##_##excno##_entry(void);
649#define EXCHDR_ENTRY(excno , excno_num , exchdr) _EXCHDR_ENTRY(excno , excno_num , exchdr)
650
651
652/*
653 * CPU例外の発生した時のコンテキストの参ç…
654§
655 *
656 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にFALSE,
657 * そうでない時にtrueを返す.
658 */
659Inline bool_t
660exc_sense_context( void *p_excinf )
661{
662 /*
663 * ネストカウンタが1より大なら非タスクコンテキスト
664 */
665 return( intnest > 1U );
666}
667
668#endif /* TOPPERS_MACRO_ONLY */
669
670/*
671 * CPU例外情
672報 p_excinf から PSW の値を取得するためのオフセット値
673 * EXCNO + ACC + FPSW + R1~R15 + PC
674 */
675#define EXC_GET_PSW_OFFSET (4+8+4+60+4)
676
677#ifndef TOPPERS_MACRO_ONLY
678
679/*
680 * CPU例外の発生した時のIPLの参ç…
681§
682 */
683Inline uint32_t
684exc_get_ipl(void *p_excinf)
685{
686 return((*((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
687 & PSW_IPL_MASK);
688}
689
690Inline bool_t
691exc_sense_i(void *p_excinf)
692{
693 return((*(((uint32_t *)((uintptr_t)p_excinf+EXC_GET_PSW_OFFSET)))
694 & PSW_I_MASK) != 0u);
695}
696
697
698/*
699 * CPU例外の発生した時のコンテキストと割込みのマスク状æ…
700‹ã®å‚ç…
701§
702 *
703 * CPU例外の発生した時のシステム状æ…
704‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
705 * ンテキストであり,å…
706¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
707‹ã§ãªãï¼ŒCPUロック状æ…
708‹ã§ãªãï¼Œï¼ˆãƒ¢
709 * デル上の)割込み優å…
710ˆåº¦ãƒžã‚¹ã‚¯å…
711¨è§£é™¤çŠ¶æ…
712‹ã§ã‚る時にtrue,そうでない時
713 * にFALSEを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
714 * にもFALSEを返す).
715 *
716 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
717 * (else) IPL < IPL_LOCK
718 * タスクコンテキストである→intnest == 0
719 * å…
720¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã§ãªã„→ Iフラグ == 1
721 * 割込み優å…
722ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
723¨è§£é™¤â†’IPL == 0
724 *
725 *
726 */
727Inline bool_t
728exc_sense_intmask(void *p_excinf)
729{
730 return((!exc_sense_context(p_excinf))
731 && exc_sense_i(p_excinf)
732 && (exc_get_ipl(p_excinf) == IPL_ENAALL));
733}
734
735/*
736 * CPU例外の発生した時のコンテキストと割込み/CPUロック状æ…
737‹ã®å‚ç…
738§
739 *
740 * CPU例外の発生した時のシステム状æ…
741‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
742 * ンテキストであり,å…
743¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
744‹ã§ãªãï¼ŒCPUロック状æ…
745‹ã§ãªã„時に
746 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
747 * 理中で発生した場合にもfalseを返す).
748 *
749 * カーネル実行中でない→ (TIPM_LOCK== -15) Iフラグ == 1
750 * (else) IPL < TIPM_LOCK
751 * タスクコンテキストである→intnest < 1
752 * å…
753¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ã§ãªã„→ Iフラグ == 1
754 * CPUロック状æ…
755‹ã§ãªã„→(TIPM_LOCK== -15) Iフラグ == 1
756 * (else) IPL < TIPM_LOCK
757 */
758Inline bool_t
759exc_sense_unlock(void *p_excinf)
760{
761#if TIPM_LOCK == -15
762 return((!exc_sense_context(p_excinf))
763 && exc_sense_i(p_excinf));
764#else
765 return((!exc_sense_context(p_excinf))
766 && exc_sense_i(p_excinf)
767 && exc_get_ipl(p_excinf) < IPL_LOCK);
768#endif
769}
770
771
772/*
773 * プロセッサ依存の初期化
774 */
775extern void prc_initialize( void );
776
777/*
778 * プロセッサ依存の終了時処理
779 */
780extern void prc_terminate( void );
781
782
783#ifndef OMIT_DEFAULT_INT_HANDLER
784/*
785 * 未登録の割込みが発生した場合に呼び出される
786 */
787void default_int_handler( void );
788#endif /* OMIT_DEFAULT_INT_HANDLER */
789
790#ifndef OMIT_DEFAULT_EXC_HANDLER
791/*
792 * 未登録の例外が発生した場合に呼び出される
793 */
794void default_exc_handler( void );
795#endif /* OMIT_DEFAULT_EXC_HANDLER */
796
797
798#endif /* TOPPERS_MACRO_ONLY */
799
800#endif /* TOPPERS_PRC_CONFIG_H */
801
Note: See TracBrowser for help on using the repository browser.