source: asp_ccsproject/trunk/asp/arch/arm_m_gcc/common/core_config.h@ 85

Last change on this file since 85 was 85, checked in by ecsg-okazaki, 10 years ago

2014/09/26 ECS E.Okazaki Folder configuration change

File size: 20.5 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 * 上記著作権者
10は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21 * 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * の無保証規定を掲載すること.
24 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 * 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27 * と.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35 * 報告すること.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41 * 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43 * å…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51 * の責任を負わない.
52 *
53 * @(#) $Id: core_config.h 2318 2012-02-23 12:22:35Z ertl-honda $
54 */
55
56/*
57 * プロセッサ依存モジュール(ARM-M用)
58 *
59 * このインクルードファイルは,target_config.h(または,そこからインク
60 * ルードされるファイル)のみからインクルードされる.他のファイルから
61 * 直接インクルードしてはならない.
62 */
63
64#ifndef TOPPERS_CORE_CONFIG_H
65#define TOPPERS_CORE_CONFIG_H
66
67#ifndef TOPPERS_MACRO_ONLY
68
69/*
70 * プロセッサの特殊命令のインライン関数定義
71 */
72#include <core_insn.h>
73
74/*
75 * ターゲット依存のオブジェクト属性
76 */
77#define TARGET_INHATR TA_NONKERNEL /* ターゲット定義の割込みハンドラ属性 */
78
79/*
80 * エラーチェック方法の指定
81 */
82#define CHECK_STKSZ_ALIGN 8 /* スタックサイズのアライン単位 */
83#define CHECK_FUNC_ALIGN 1 /* 関数のアライン単位 */
84#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
85#define CHECK_STACK_ALIGN 8 /* スタック領域のアライン単位 */
86#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
87#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
88#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
89#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
90
91/*
92 * 非タスクコンテキスト用のスタック初期値
93 */
94#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
95
96/*
97 * タスクコンテキストブロックの定義
98 */
99typedef struct task_context_block {
100 void *sp; /* スタックポインタ */
101 FP pc; /* プログラムカウンタ */
102} TSKCTXB;
103
104#endif /* TOPPERS_MACRO_ONLY */
105
106#ifndef TOPPERS_MACRO_ONLY
107/*
108 * コンテキストの参ç…
109§
110 *
111 */
112Inline bool_t
113sense_context(void)
114{
115 /*
116 * PSPが有効ならタスクコンテキスト,MSPが有効なら非タスクコンテキスト
117 * とする.
118 */
119 if ((get_control() & CONTROL_PSP) == CONTROL_PSP){
120 return false;
121 }
122 else {
123 return true;
124 }
125}
126
127#endif /* TOPPERS_MACRO_ONLY */
128
129/*
130 * TOPPERS標準割込み処理モデルの実現
131 *
132 * 割込み優å…
133ˆåº¦ãƒžã‚¹ã‚¯ã¨ã—ては,BASEPRIを用いる.å…
134¨å‰²è¾¼ã¿ã‚’禁止する
135 * 機能として,FAULTMASKやPRIMASKがあるが,カーネル管理外の割込みを
136 * サポートするため,これらはCPUロックのために用いない.
137 * そのため,BASEPRIを用いて擬似的にCPUロックフラグを実現する.
138 *
139 * まず,CPUロック状æ…
140‹ã‚’管理すための変数(lock_flag)を用意する.
141 *
142 * CPUロックフラグがクリアされている間は,BASEPRIをモデル上の割込み
143 * 優å…
144ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ã«è¨­å®šã™ã‚‹ï¼Žã“の間は,モデル上の割込み優å…
145ˆåº¦ãƒžã‚¹
146 * クは,BASEPRIを用いる.
147 *
148 * それに対してCPUロックフラグがセットされいる間は,BASEPRIを,カーネ
149 * ル管理外のものを除くすべての割込み要求をマスクする値(TIPM_LOCK)と,
150 * モデル上の割込み優å…
151ˆåº¦ãƒžã‚¹ã‚¯ã¨ã®é«˜ã„方に設定する.この間のモデル上
152 * の割込み優å…
153ˆåº¦ãƒžã‚¹ã‚¯ã¯ï¼Œãã®ãŸã‚ã®å¤‰æ•°(saved_iipm, 内
154部表現で保持)
155 * を用意して保持する.
156 */
157
158/*
159 * 割込み優å…
160ˆåº¦ãƒžã‚¹ã‚¯ã®å¤–部表現と内
161部表現の変換
162 *
163 * アセンブリ言語のソースファイルからインクルードする場合のために,
164 * CASTを使用
165 * 割込み優å…
166ˆåº¦ã®ãƒ“ット幅
167(TBITW_IPRI)が 8 の場合は,内
168部優å…
169ˆåº¦ 255
170 * は,外部優å…
171ˆåº¦ -1 に対応する.
172 */
173#define EXT_IPM(iipm) (CAST(PRI,((iipm >> (8 - TBITW_IPRI)) - (1 << TBITW_IPRI)))) /* 内
174部表現を外部表現に */
175#define INT_IPM(ipm) (((1 << TBITW_IPRI) - CAST(uint8_t, -(ipm))) << (8 - TBITW_IPRI)) /* 外部表現を内
176部表現に */
177
178/*
179 * CPUロック状æ…
180‹ã§ã®å‰²è¾¼ã¿å„ªå…
181ˆåº¦ãƒžã‚¹ã‚¯
182 */
183#define TIPM_LOCK TMIN_INTPRI
184
185/*
186 * CPUロック状æ…
187‹ã§ã®å‰²è¾¼ã¿å„ªå…
188ˆåº¦ãƒžã‚¹ã‚¯ã®å†…
189部表現
190 *
191 * TIPM_LOCKは,CPUロック状æ…
192‹ã§ã®BASEPRIの値.カーネル管理外のものを
193 * 除くすべての割込みをマスクする値に定義する.
194 */
195#define IIPM_LOCK INT_IPM(TIPM_LOCK)
196
197/*
198 * TIPM_ENAALL(割込み優å…
199ˆåº¦ãƒžã‚¹ã‚¯å…
200¨è§£é™¤ï¼‰ã®å†…
201部表現
202 *
203 * BASEPRIに '0' を設定することで,å…
204¨å‰²è¾¼ã¿ã‚’許可する.
205 */
206#define IIPM_ENAALL (0)
207
208
209#ifndef TOPPERS_MACRO_ONLY
210
211/*
212 * CPUロックフラグ実現のための変数
213 *
214 * これらの変数は,CPUロック状æ…
215‹ã®æ™‚のみ書き換えてもよいとする.
216 * インライン関数中で,アクセスの順序が変化しないよう,volatile を指定.
217 */
218extern volatile bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
219extern volatile uint32_t saved_iipm; /* 割込み優å…
220ˆåº¦ã‚’マスクする変数 */
221
222/*
223 * CPUロック状æ…
224‹ã¸ã®ç§»è¡Œ
225 *
226 * BASEPRI(ハードウェアの割込み優å…
227ˆåº¦ãƒžã‚¹ã‚¯ï¼‰ã‚’,saved_iipmに保存し,
228 * カーネル管理外のものを除くすべての割込みをマスクする値(TIPM_LOCK)
229 * に設定する.また,lock_flagをtrueにする.
230 *
231 * BASEPRIが,最初からTIPM_LOCKと同じかそれより高い場合には,それを
232 * saved_iipmに保存するのみで,TIPM_LOCKには設定しない.これは,モデル
233 * 上の割込み優å…
234ˆåº¦ãƒžã‚¹ã‚¯ãŒï¼ŒTIPM_LOCKと同じかそれより高いレベルに設定
235 * されている状æ…
236‹ã«ã‚たる.
237 *
238 * この関数は,CPUロック状æ…
239‹ï¼ˆlock_flagがtrueの状æ…
240‹ï¼‰ã§å‘¼ã°ã‚Œã‚‹ã“とは
241 * ないものと想定している.
242 */
243Inline void
244x_lock_cpu(void)
245{
246 uint32_t iipm;
247
248 /*
249 * get_basepri()の返り値を直接saved_iipmに保存せず,一時変数iipm
250 * を用いているのは,get_baespri()を呼んだ直後に割込みが発生し,
251 * 起動された割込み処理でsaved_iipmが変更される可能性があるためで
252 * ある.
253 */
254 iipm = get_basepri();
255 /*
256 * BASEPRIレジスタは値が小さいほど優å…
257ˆåº¦ãŒé«˜ã„が,IIPM_ENAALL が
258 * '0'であるため,単純に優å…
259ˆåº¦æ¯”較だけでは不十分である.
260 */
261 if ((IIPM_LOCK < iipm) || (IIPM_ENAALL == iipm)) {
262 set_basepri(IIPM_LOCK);
263 }
264 saved_iipm = iipm;
265 lock_flag = true;
266 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
267 ARM_MEMORY_CHANGED;
268}
269
270#define t_lock_cpu() x_lock_cpu()
271#define i_lock_cpu() x_lock_cpu()
272
273/*
274 * CPUロック状æ…
275‹ã®è§£é™¤
276 *
277 * lock_flagをfalseにし,IPM(ハードウェアの割込み優å…
278ˆåº¦ãƒžã‚¹ã‚¯ï¼‰ã‚’,
279 * saved_iipmに保存した値に戻す.
280 *
281 * この関数は,CPUロック状æ…
282‹ï¼ˆlock_flagがtrueの状æ…
283‹ï¼‰ã§ã®ã¿å‘¼ã°ã‚Œã‚‹ã‚‚
284 * のと想定している.
285 */
286Inline void
287x_unlock_cpu(void)
288{
289 /* クリティカルセクションの前後でメモリが書き換わる可能性がある */
290 ARM_MEMORY_CHANGED;
291 lock_flag = false;
292 set_basepri(saved_iipm);
293}
294
295#define t_unlock_cpu() x_unlock_cpu()
296#define i_unlock_cpu() x_unlock_cpu()
297
298/*
299 * CPUロック状æ…
300‹ã®å‚ç…
301§
302 */
303Inline bool_t
304x_sense_lock(void)
305{
306 return(lock_flag);
307}
308
309#define t_sense_lock() x_sense_lock()
310#define i_sense_lock() x_sense_lock()
311
312/*
313 * chg_ipmで有効な割込み優å…
314ˆåº¦ã®ç¯„囲の判定
315 *
316 * TMIN_INTPRIの値によらず,chg_ipmでは,-(1 << TBITW_IPRI)〜TIPM_ENAALL(=0)
317 * の範囲に設定できることとする(ターゲット定義の拡張).
318 * 割込み優å…
319ˆåº¦ã®ãƒ“ット幅
320(TBITW_IPRI)が 8 の場合は,-256 〜 0 が指定可能である.
321 *
322 */
323#define VALID_INTPRI_CHGIPM(intpri) \
324 ((-((1 << TBITW_IPRI) - 1) <= (intpri) && (intpri) <= TIPM_ENAALL))
325
326/*
327 * (モデル上の)割込み優å…
328ˆåº¦ãƒžã‚¹ã‚¯ã®è¨­å®š
329 *
330 * CPUロックフラグがクリアされている時は,ハードウェアの割込み優å…
331ˆåº¦ãƒž
332 * スクを設定する.CPUロックフラグがセットされている時は,saved_iipm
333 * を設定し,さらに,ハードウェアの割込み優å…
334ˆåº¦ãƒžã‚¹ã‚¯ã‚’,設定しようと
335 * した(モデル上の)割込み優å…
336ˆåº¦ãƒžã‚¹ã‚¯ã¨TIPM_LOCKの高い方に設定する.
337 */
338Inline void
339x_set_ipm(PRI intpri)
340{
341 uint8_t iipm = INT_IPM(intpri);
342
343 if (intpri == TIPM_ENAALL){
344 iipm = IIPM_ENAALL;
345 }
346
347 if (!lock_flag) {
348 set_basepri(iipm);
349 }
350 else {
351 saved_iipm = iipm;
352 /*
353 * BASEPRIレジスタは値が小さいほど優å…
354ˆåº¦ãŒé«˜ã„が,IIPM_ENAALL が
355 * '0'であるため,単純に優å…
356ˆåº¦æ¯”較だけでは不十分である.
357 */
358 if ((iipm < IIPM_LOCK ) && (IIPM_ENAALL != iipm)) {
359 set_basepri(iipm);
360 }
361 else {
362 set_basepri(IIPM_LOCK);
363 }
364 }
365}
366
367#define t_set_ipm(intpri) x_set_ipm(intpri)
368#define i_set_ipm(intpri) x_set_ipm(intpri)
369
370/*
371 * (モデル上の)割込み優å…
372ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
373§
374 *
375 * CPUロックフラグがクリアされている時はハードウェアの割込み優å…
376ˆåº¦ãƒž
377 * スクを,セットされている時はsaved_iipmを参ç…
378§ã™ã‚‹ï¼Ž
379 */
380Inline PRI
381x_get_ipm(void)
382{
383 uint8_t iipm;
384
385 if (!lock_flag) {
386 iipm = get_basepri();
387 }
388 else {
389 iipm = saved_iipm;
390 }
391
392 if (iipm == IIPM_ENAALL) {
393 return(TIPM_ENAALL);
394 }
395 else {
396 return(EXT_IPM(iipm));
397 }
398}
399
400#define t_get_ipm() x_get_ipm()
401#define i_get_ipm() x_get_ipm()
402
403/*
404 * SVCハンドラ(core_support.S)
405 */
406extern void svc_handler(void);
407
408/*
409 * スタートアップルーチン(start.S)
410 */
411extern void _start(void);
412
413/*
414 * 最高優å…
415ˆé †ä½ã‚¿ã‚¹ã‚¯ã¸ã®ãƒ‡ã‚£ã‚¹ãƒ‘ッチ(core_support.S)
416 *
417 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
418 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状æ…
419‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
420 * チ許可状æ…
421‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
422ˆåº¦ãƒžã‚¹ã‚¯å…
423¨è§£é™¤çŠ¶æ…
424‹ã§å‘¼ã³å‡ºã•ãª
425 * ければならない.
426 */
427extern void dispatch(void);
428
429/*
430 * ディスパッチャの動作開始(core_support.S)
431 *
432 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
433 * みを禁止した状æ…
434‹ï¼ˆå‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
435‹ã¨åŒç­‰ã®çŠ¶æ…
436‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘れば
437 * ならない.
438 */
439extern void start_dispatch(void) NoReturn;
440
441/*
442 * 現在のコンテキストを捨ててディスパッチ(core_support.S)
443 *
444 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
445 * スト・CPUロック状æ…
446‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
447‹ãƒ»ï¼ˆãƒ¢ãƒ‡ãƒ«ä¸Šã®ï¼‰å‰²è¾¼ã¿å„ªå…
448ˆ
449 * 度マスクå…
450¨è§£é™¤çŠ¶æ…
451‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.
452 */
453extern void exit_and_dispatch(void) NoReturn;
454
455/*
456 * カーネルの終了処理の呼出し(core_support.S)
457 *
458 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
459 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
460 * す.
461 */
462extern void call_exit_kernel(void) NoReturn;
463
464/*
465 * タスクコンテキストの初期化
466 *
467 * タスクが休止状æ…
468‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
469‹ã«ç§»è¡Œã™ã‚‹æ™‚に呼ばれる.この時点
470 * でスタック領域を使ってはならない.
471 *
472 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
473 * この時点ではTCBが定義されていないためである.
474 */
475extern void start_r(void);
476
477#define activate_context(p_tcb) \
478{ \
479 (p_tcb)->tskctxb.sp = (void *)((char *)((p_tcb)->p_tinib->stk) \
480 + (p_tcb)->p_tinib->stksz); \
481 (p_tcb)->tskctxb.pc = (FP) start_r; \
482}
483
484/*
485 * calltexは使用しない
486 */
487#define OMIT_CALLTEX
488
489/*
490 * 割込み番号・割込みハンドラ番号
491 *
492 * 割込みハンドラ番号(inhno)と割込み番号(intno)は,割り込み発生時に
493 * EPSRに設定される例外番号とする.
494 */
495
496/*
497 * 割込み番号の範囲の判定
498 */
499#define VALID_INTNO(intno) ((TMIN_INTNO <= (intno)) && ((intno) <= TMAX_INTNO))
500#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
501#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
502
503/*
504 * 割込みハンドラの設定
505 *
506 * ベクトル番号inhnoの割込みハンドラの起動番地int_entryに設定する.割込み
507 * ハンドラテーブル
508 */
509Inline void
510x_define_inh(INHNO inhno, FP int_entry)
511{
512
513}
514
515/*
516 * 割込みハンドラの出å…
517¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
518 *
519 */
520#define INT_ENTRY(inhno, inthdr) inthdr
521#define INTHDR_ENTRY(inhno, inhno_num, inthdr) extern void inthdr(void);
522
523/*
524 * 割込み要求禁止フラグ
525 */
526
527/*
528 * 割込み属性が設定されているかを判別するための変数(kernel_cfg.c)
529 */
530extern const uint32_t bitpat_cfgint[];
531
532/*
533 * 割込み要求禁止フラグのセット
534 *
535 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
536 * フラグをクリアしようとした場合には,falseを返す.
537 */
538Inline bool_t
539x_disable_int(INTNO intno)
540{
541 uint32_t tmp;
542
543 /*
544 * 割込み属性が設定されていない場合
545 */
546 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
547 return(false);
548 }
549
550 if (intno == IRQNO_SYSTICK) {
551 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
552 tmp &= ~SYSTIC_TICINT;
553 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
554 }else {
555 tmp = intno - 16;
556 sil_wrw_mem((void *)((uint32_t *)NVIC_CLRENA0 + (tmp >> 5)),
557 (1 << (tmp & 0x1f)));
558 }
559
560 return(true);
561}
562
563#define t_disable_int(intno) x_disable_int(intno)
564#define i_disable_int(intno) x_disable_int(intno)
565
566/*
567 * 割込み要求禁止フラグの解除
568 *
569 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
570 * フラグをクリアしようとした場合には,falseを返す.
571 */
572Inline bool_t
573x_enable_int(INTNO intno)
574{
575 uint32_t tmp;
576
577 /*
578 * 割込み属性が設定されていない場合
579 */
580 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
581 return(false);
582 }
583
584 if (intno == IRQNO_SYSTICK) {
585 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
586 tmp |= SYSTIC_TICINT;
587 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
588 }else {
589 tmp = intno - 16;
590 sil_wrw_mem((void *)((uint32_t *)NVIC_SETENA0 + (tmp >> 5)),
591 (1 << (tmp & 0x1f)));
592 }
593
594 return(true);
595}
596
597#define t_enable_int(intno) x_enable_int(intno)
598#define i_enable_int(intno) x_enable_int(intno)
599
600/*
601 * 割込み要求ラインの属性の設定
602 */
603extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
604
605/*
606 * 割込みハンドラå…
607¥å£ã§å¿…
608要なIRC操作
609 */
610Inline void
611i_begin_int(INTNO intno)
612{
613}
614
615/*
616 * 割込みハンドラの出口で必
617要なIRC操作
618 */
619Inline void
620i_end_int(INTNO intno)
621{
622}
623
624/*
625 * CPU例外ハンドラ関係
626 */
627
628/*
629 * CPU例外ハンドラ番号
630 */
631#define VALID_EXCNO_DEFEXC(excno) (TMIN_EXCNO <= (excno) && (excno) <= TMAX_EXCNO)
632
633/*
634 * CPU例外ハンドラの許可
635 */
636extern void enable_exc(EXCNO excno);
637
638/*
639 * CPU例外ハンドラの禁止
640 */
641extern void disable_exc(EXCNO excno);
642
643/*
644 * CPU例外ハンドラの設定
645 */
646Inline void
647x_define_exc(EXCNO excno, FP exc_entry)
648{
649 /*
650 * 一部の例外は許可を行う必
651要がある
652 */
653 enable_exc(excno);
654}
655
656/*
657 * CPU例外ハンドラのå…
658¥å£å‡¦ç†ã®ç”Ÿæˆãƒžã‚¯ãƒ­
659 */
660#define EXC_ENTRY(excno, exchdr) exchdr
661#define EXCHDR_ENTRY(excno, excno_num, exchdr) extern void exchdr(void *p_excinf);
662
663/*
664 * CPU例外の発生した時のコンテキストの参ç…
665§
666 *
667 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
668 * そうでない時にtrueを返す.
669 */
670Inline bool_t
671exc_sense_context(void *p_excinf)
672{
673 uint32_t exc_return;
674
675 exc_return = *((uint32_t *)p_excinf + P_EXCINF_OFFSET_EXC_RETURN);
676 if ((exc_return & EXC_RETURN_PSP) == EXC_RETURN_PSP){
677 return false;
678 }
679 else {
680 return true;
681 }
682}
683
684/*
685 * CPU例外の発生した時のIPM(ハードウェアの割込み優å…
686ˆåº¦ãƒžã‚¹ã‚¯ï¼Œå†…
687部表
688 * 現)の参ç…
689§
690 */
691Inline uint32_t
692exc_get_iipm(void *p_excinf)
693{
694 return(*((uint32_t *)p_excinf + P_EXCINF_OFFSET_BASEPRI));
695}
696
697/*
698 * CPU例外の発生した時のコンテキストと割込みのマスク状æ…
699‹ã®å‚ç…
700§
701 *
702 * CPU例外の発生した時のシステム状æ…
703‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³
704 * ンテキストであり,割込みロック状æ…
705‹ã§ãªãï¼ŒCPUロック状æ…
706‹ã§ãªãï¼Œï¼ˆãƒ¢
707 * デル上の)割込み優å…
708ˆåº¦ãƒžã‚¹ã‚¯å…
709¨è§£é™¤çŠ¶æ…
710‹ã§ã‚る時にtrue,そうでない時
711 * にfalseを返す(CPU例外がカーネル管理外の割込み処理中で発生した場合
712 * にもfalseを返す).
713 *
714 * PU例外の発生した時のBASEPRI(ハードウェアの割込み優å…
715ˆåº¦ãƒžã‚¹ã‚¯ï¼‰
716 * がすべての割込みを許可する状æ…
717‹ã§ã‚ることをチェックすることで,カー
718 * ネル実行中でないこと,割込みロック状æ…
719‹ã§ãªã„こと,CPUロック状æ…
720‹ã§ãª
721 * いこと,(モデル上の)割込み優å…
722ˆåº¦ãƒžã‚¹ã‚¯å…
723¨è§£é™¤çŠ¶æ…
724‹ã§ã‚ることの4つの
725 * 条件をチェックすることができる(CPU例外が発生した時のlock_flagを参
726 * ç…
727§ã™ã‚‹å¿…
728要はない).
729 */
730Inline bool_t
731exc_sense_intmask(void *p_excinf)
732{
733 return(!exc_sense_context(p_excinf)
734 && (exc_get_iipm(p_excinf) == IIPM_ENAALL));
735}
736
737/*
738 * CPU例外エントリ(core_support.S)
739 */
740extern void core_exc_entry(void);
741
742/*
743 * 割込みエントリ(core_support.S)
744 */
745extern void core_int_entry(void);
746
747/*
748 * プロセッサ依存の初期化
749 */
750extern void core_initialize(void);
751
752/*
753 * プロセッサ依存の終了時処理
754 */
755extern void core_terminate(void);
756
757/*
758 * 登録されていない例外が発生すると呼び出される
759 */
760extern void default_exc_handler(void *p_excinf);
761
762/*
763 * 未登録の割込みが発生した場合に呼び出される
764 */
765extern void default_int_handler(void *p_excinf);
766
767#endif /* TOPPERS_MACRO_ONLY */
768#endif /* TOPPERS_CORE_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.