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

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

nucleo_f401re依存部の追加

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