source: rtos_arduino/trunk/asp_1.9.2/arch/arm_m_gcc/common/core_config.h@ 136

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

ライブラリとOS及びベーシックなサンプルの追加.

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