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

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

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