source: asp3_wo_tecs/trunk/arch/arm_m_gcc/common/core_kernel_impl.h@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

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