source: asp_nios2/trunk/arch/nios2_gcc/prc_config.h@ 1

Last change on this file since 1 was 1, checked in by ertl-ichiba, 14 years ago

ASP 1.4.0対応のNios2依存部を追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 13.1 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) 2008 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * @(#) $Id: prc_config.h 1 2010-06-14 02:33:52Z ertl-ichiba $
39 */
40
41/*
42 * プロセッサ依存モジュール(Nios2用)
43 *
44 * このインクルードファイルは,target_config.h(または,そこからインク
45 * ルードされるファイル)のみからインクルードされる.他のファイルから
46 * 直接インクルードしてはならない.
47 */
48
49#ifndef TOPPERS_PRC_CONFIG_H
50#define TOPPERS_PRC_CONFIG_H
51
52#include "nios2.h"
53
54/*
55 * 例外の個数
56 */
57#define TNUM_EXCH 32U
58
59/*
60 * 割込みハンドラ番号に関する定義
61 */
62#define TMIN_INHNO 0U
63#define TMAX_INHNO 31U
64#define TNUM_INH 32U
65
66/*
67 * 割込み番号に関する定義
68 */
69#define TMIN_INTNO 0U
70#define TMAX_INTNO 31U
71#define TNUM_INT 32U
72
73/*
74 * 割込み優先度の個数
75 */
76#define TNUM_INT_PRI 8U
77
78/*
79 * 割込み番号の範囲の判定
80 */
81#define VALID_INTNO(intno) (TMIN_INTNO <= (intno) && (intno) <= TMAX_INTNO)
82#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
83#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
84#define VALID_INTNO_ATTISR(intno) VALID_INTNO(intno)
85
86#ifndef TOPPERS_MACRO_ONLY
87
88/*
89 * 非タスクコンテキスト用のスタック開始アドレス設定マクロ
90 */
91#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char_t *)(istk) + (istksz)))
92
93/*
94 * プロセッサの特殊命令のインライン関数定義
95 */
96#include "prc_insn.h"
97
98/*
99 * TOPPERS標準割込み処理モデルの実現
100 *
101 * カーネル管理外の割込みは設けない.
102 */
103
104/*
105 * 例外(割込み/CPU例外)のネスト回数のカウント
106 * コンテキスト参照のために使用
107 */
108extern uint32_t except_nest_count; /* 例外(割込み/CPU例外)のネスト回数のカウント */
109
110/*
111 * コンテキストの参照
112 *
113 * 例外(割込み/CPU例外)のネスト回数をカウントする変数(except_nest_count)を
114 * 用意し,例外の入り口でインクリメントすることで,コンテキストを判定する.
115 */
116Inline bool_t
117sense_context(void)
118{
119 return(except_nest_count > 0U);
120}
121
122/*
123 * CPUロック状態への移行
124 */
125Inline void
126x_lock_cpu(void)
127{
128 set_status(current_status() & ~STATUS_PIE);
129 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
130 Asm("":::"memory");
131}
132
133#define t_lock_cpu() x_lock_cpu()
134#define i_lock_cpu() x_lock_cpu()
135
136/*
137 * CPUロック状態の解除
138 */
139Inline void
140x_unlock_cpu(void)
141{
142 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
143 Asm("":::"memory");
144 set_status(current_status() | STATUS_PIE);
145}
146
147#define t_unlock_cpu() x_unlock_cpu()
148#define i_unlock_cpu() x_unlock_cpu()
149
150/*
151 * CPUロック状態の参照
152 */
153Inline bool_t
154x_sense_lock(void)
155{
156 return((current_status() & STATUS_PIE) == 0U);
157}
158
159#define t_sense_lock() x_sense_lock()
160#define i_sense_lock() x_sense_lock()
161
162/*
163 * 割込みハンドラの登録用テーブル
164 * 実態はコンフィギュレータで生成する
165 */
166extern const FP inh_tbl[TNUM_INH];
167
168/*
169 * 割込みハンドラの設定
170 */
171Inline void
172x_define_inh(INHNO inhno, FP int_entry)
173{
174}
175
176/*
177 * 割込みハンドラの出入口処理の生成マクロ
178 */
179#define INT_ENTRY(inhno, inthdr) inthdr
180#define INTHDR_ENTRY(inhno, inhno_num, inthdr) extern void inthdr(void);
181
182/*
183 * 各割込みの割込み要求禁止フラグの状態
184 */
185extern uint32_t idf;
186
187/*
188 * 割込み優先度マスク操作ライブラリ
189 *
190 * XPS Interrupt Controller は割込み優先度の概念がないため,
191 * ソフトウェアで擬似的に実現する.
192 */
193
194/*
195 * 現在の割込み優先度マスクの値(内部表現)
196 */
197extern uint8_t iipm;
198
199/*
200 * 割込み優先度マスク毎にセットする,割込み要求禁止フラグの値
201 * のテーブル(kernel_cfg.c)
202 */
203extern const uint32_t iipm_mask_tbl[TNUM_INT_PRI];
204
205/*
206 * IPMをimp_mask_tblのインデックスに変換するマクロ
207 */
208#define INDEX_IPM(ipm) (-(ipm))
209
210/*
211 * 割込み優先度マスクの外部表現と内部表現の変換
212 *
213 */
214#define EXT_IPM(iipm) (-((PRI)(iipm))) /* 内部表現を外部表現に */
215#define INT_IPM(ipm) ((uint8_t)(-(ipm))) /* 外部表現を内部表現に */
216
217/*
218 * (モデル上の)割込み優先度マスクの設定
219 *
220 * 指定された優先度に設定された割込み要求禁止フラグのテーブルの値と(モデ
221 * ル上の)各割込みの割込み要求禁止フラグの状態を保持した変数の値との
222 * ORをIRCの割込み要求禁止フラグにセットし,設定した優先度を内部変数
223 * ipmに保存する.
224 */
225Inline void
226x_set_ipm(PRI intpri)
227{
228 uint32_t ipm_mask = iipm_mask_tbl[INT_IPM(intpri)];
229 iipm = INT_IPM(intpri);
230
231 /*
232 * XPS INTC の割込みコントローラはイネーブルレジスタと
233 * クリアーレジスタがあるため,一旦全ての割込みを禁止してから,
234 * 特定の割込みのみ許可する必要がある
235 */
236 /* 全割込み禁止 */
237 set_ienable(0U);
238
239 /* マスク指定されていない割込みのみ許可 */
240 set_ienable(~(ipm_mask|idf));
241
242 iipm = INT_IPM(intpri);
243}
244
245#define t_set_ipm(intpri) x_set_ipm(intpri)
246#define i_set_ipm(intpri) x_set_ipm(intpri)
247
248/*
249 * (モデル上の)割込み優先度マスクの参照
250 *
251 * ipmの値を返す
252 */
253Inline PRI
254x_get_ipm(void)
255{
256 return(EXT_IPM(iipm));
257}
258
259#define t_get_ipm() x_get_ipm()
260#define i_get_ipm() x_get_ipm()
261
262/*
263 * 割込み属性が設定されているかを判別するための変数
264 */
265extern uint32_t bitpat_cfgint;
266
267/*
268 * (モデル上の)割込み要求禁止フラグのセット
269 *
270 * 指定された,割込み番号の割込み要求禁止フラグのセットして,割込みを
271 * 禁止する.また,(モデル上の)割込み要求禁止フラグを管理するidfの対
272 * 応するビットををセットする.
273 * 割込み要求をマスクする機能をサポートしていない場合には,falseを返す
274 */
275Inline bool_t
276x_disable_int(INTNO intno)
277{
278 if ((bitpat_cfgint & INTNO_BITPAT(intno)) == 0U) {
279 return(false);
280 }
281
282 idf |= INTNO_BITPAT(intno);
283 set_ienable(~(iipm_mask_tbl[iipm]|idf));
284
285 return(true);
286}
287
288#define t_disable_int(intno) x_disable_int(intno)
289#define i_disable_int(intno) t_disable_int(intno)
290
291/*
292 * (モデル上の)割り要求禁止フラグの解除
293 *
294 * 指定された,割込み番号の割込み要求禁止フラグのクリアして,割込みを
295 * 許可する.また,(モデル上の)割込み要求禁止フラグを管理するidfの対
296 * 応するビットををクリアする.
297 * 割込み要求をマスクする機能をサポートしていない場合には,falseを返す
298 */
299Inline bool_t
300x_enable_int(INTNO intno)
301{
302 if ((bitpat_cfgint & INTNO_BITPAT(intno)) == 0U) {
303 return(false);
304 }
305
306 idf &= ~INTNO_BITPAT(intno);
307 set_ienable(~(iipm_mask_tbl[iipm]|idf));
308
309 return(true);
310}
311
312#define t_enable_int(intno) x_enable_int(intno)
313#define i_enable_int(intno) x_enable_int(intno)
314
315/*
316 * 割込み要求のクリア
317 */
318Inline void
319x_clear_int(INTNO intno)
320{
321
322}
323
324#define t_clear_int(intno) x_clear_int(intno)
325#define i_clear_int(intno) x_clear_int(intno)
326
327
328/*
329 * 割込み要求のチェック
330 */
331Inline bool_t
332x_probe_int(INTNO intno)
333{
334 return((current_ipending() & INTNO_BITPAT(intno)) != 0);
335}
336
337#define t_probe_int(intno) x_probe_int(intno)
338#define i_probe_int(intno) x_probe_int(intno)
339
340/*
341 * 割込み要求ラインの属性の設定
342 */
343extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
344
345/*
346 * 割込みハンドラの入り口で必要なIRC操作
347 */
348Inline void
349i_begin_int(INTNO intno)
350{
351
352}
353
354/*
355 * 割込みハンドラの出口で必要なIRC操作
356 */
357Inline void
358i_end_int(INTNO intno)
359{
360
361}
362
363/*
364 * 未定義の割込みが入った場合の処理
365 */
366extern void default_int_handler(void *p_exinf);
367
368
369/*
370 * CPU例外機能
371 */
372
373/*
374 * CPU例外フレームのオフセット
375 */
376#define CPUEXC_FLM_EXCNO 0x00U
377#define CPUEXC_FLM_ESTATUS 0x01U
378#define CPUEXC_FLM_NEST 0x02U
379#define CPUEXC_FLM_PC 0x03U
380#define CPUEXC_FLM_IPM 0x04U
381
382/*
383 * CPU例外ハンドラの登録用テーブル
384 */
385extern const FP exch_tbl[TNUM_EXCH];
386
387/*
388 * ターゲット非依存部に含まれる標準の例外管理機能の初期化処理を用いない
389 */
390#define OMIT_INITIALIZE_EXCEPTION
391
392/*
393 * CPU例外ハンドラの初期化
394 */
395Inline void
396initialize_exception(void)
397{
398}
399
400/*
401 * CPU例外の発生した時のシステム状態の参照
402 */
403
404/*
405 * CPU例外の発生した時のコンテキストの参照
406 *
407 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
408 * そうでない時にtrueを返す.
409 */
410Inline bool_t
411exc_sense_context(void *p_excinf)
412{
413 return((*(((uint32_t *)p_excinf) + CPUEXC_FLM_NEST) != 0U));
414}
415
416/*
417 * CPU例外の発生した時の(モデル上の)割込み優先度マスクの参照
418 */
419Inline uint8_t
420exc_get_ipm(void *p_excinf)
421{
422 return((uint8_t)(*(((uint32_t *)p_excinf) + CPUEXC_FLM_IPM)));
423}
424
425/*
426 * CPU例外の発生時した時のCPUロック状態の参照
427 *
428 * CPUロック状態の場合はtrue,CPUロック解除状態の場合にはfalseを返す
429 */
430Inline bool_t
431exc_sense_lock(void *p_excinf){
432 return((*(((uint32_t *)p_excinf) + CPUEXC_FLM_ESTATUS) & STATUS_PIE) != STATUS_PIE);
433}
434
435/*
436 * 割込みロック状態か
437 */
438Inline bool_t
439exc_sense_int_lock(void *p_excinf){
440 return false;
441}
442
443/*
444 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
445 *
446 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
447 * ンテキストであり,割込みロック状態でなく,CPUロック状態でなく,(モ
448 * デル上の)割込み優先度マスク全解除状態である時にtrue,そうでない時
449 * にfalseを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
450 * にもfalseを返す).
451 *
452 */
453Inline bool_t
454exc_sense_intmask(void *p_excinf)
455{
456 return(!exc_sense_context(p_excinf)
457 && (exc_get_ipm(p_excinf) == 0U)
458 && !exc_sense_lock(p_excinf)
459 && !exc_sense_int_lock(p_excinf));
460}
461
462/*
463 * CPU例外の発生した時のコンテキストと割込み/CPUロック状態の参照
464 *
465 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
466 * ンテキストであり,割込みロック状態でなく,CPUロック状態でない時に
467 * true,そうでない時にfalseを返す(CPU例外がカーネル管理外の割込み処
468 * 理中で発生した場合にもfalseを返す).
469 *
470 */
471Inline bool_t
472exc_sense_unlock(void *p_excinf)
473{
474 return(!exc_sense_context(p_excinf)
475 && !exc_sense_lock(p_excinf)
476 && !exc_sense_int_lock(p_excinf));
477}
478
479/*
480 * プロセッサ依存の初期化
481 */
482extern void prc_initialize(void);
483
484/*
485 * プロセッサ依存の終了時処理
486 */
487extern void prc_terminate(void);
488
489/*
490 * 未定義の例外が入った場合の処理
491 */
492extern void default_exc_handler(void *p_excinf);
493
494/*
495 * タスクディスパッチャ
496 */
497
498/*
499 * 最高優先順位タスクへのディスパッチ(core_support.S)
500 *
501 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
502 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ
503 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな
504 * ければならない.
505 */
506extern void dispatch(void);
507
508/*
509 * ディスパッチャの動作開始(core_support.S)
510 *
511 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
512 * みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
513 * ならない.
514 */
515extern void start_dispatch(void) NoReturn;
516
517/*
518 * 現在のコンテキストを捨ててディスパッチ(core_support.S)
519 *
520 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
521 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先
522 * 度マスク全解除状態で呼び出さなければならない.
523 */
524extern void exit_and_dispatch(void) NoReturn;
525
526/*
527 * カーネルの終了処理の呼出し(core_support.S)
528 *
529 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
530 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
531 * す.
532 */
533extern void call_exit_kernel(void) NoReturn;
534
535/*
536 * タスクコンテキストブロックの定義
537 */
538typedef struct task_context_block {
539 void *sp; /* スタックポインタ */
540 FP pc; /* プログラムカウンタ */
541} CTXB;
542
543/*
544 * タスクコンテキストの初期化
545 *
546 * タスクが休止状態から実行できる状態に移行する時に呼ばれる.この時点
547 * でスタック領域を使ってはならない.
548 *
549 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
550 * この時点ではTCBが定義されていないためである.
551 */
552extern void start_r(void);
553
554#define activate_context(p_tcb) \
555{ \
556 (p_tcb)->tskctxb.sp = (void *)((char_t *)((p_tcb)->p_tinib->stk) \
557 + (p_tcb)->p_tinib->stksz); \
558 (p_tcb)->tskctxb.pc = (FP)start_r; \
559}
560
561#endif /* TOPPERS_MACRO_ONLY */
562#endif /* TOPPERS_PRC_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.