source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/arch/arm_gcc/common/core_kernel_impl.h@ 374

Last change on this file since 374 was 374, checked in by coas-nagasima, 5 years ago

mbed関連を更新
シリアルドライバをmbedのHALを使うよう変更
ファイルディスクリプタの処理を更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-chdr;charset=UTF-8
File size: 15.4 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) 2006-2016 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * $Id$
41 */
42
43/*
44 * kernel_impl.hのコア依存部(ARM用)
45 *
46 * このヘッダファイルは,target_kernel_impl.h(または,そこからインク
47 * ルードされるファイル)のみからインクルードされる.他のファイルから
48 * 直接インクルードしてはならない.
49 */
50
51#ifndef TOPPERS_CORE_KERNEL_IMPL_H
52#define TOPPERS_CORE_KERNEL_IMPL_H
53
54#include "arm.h"
55
56/*
57 * ターゲット依存のタスク属性(エラーチェック用)
58 */
59#ifdef USE_ARM_FPU
60#define TARGET_TSKATR (TA_FPU)
61#endif /* USE_ARM_FPU */
62
63/*
64 * エラーチェック方法の指定
65 */
66#define CHECK_STKSZ_ALIGN 8 /* スタックサイズのアライン単位 */
67#define CHECK_INTPTR_ALIGN 4 /* intptr_t型の変数のアライン単位 */
68#define CHECK_INTPTR_NONNULL /* intptr_t型の変数の非NULLチェック */
69#ifndef __thumb__
70#define CHECK_FUNC_ALIGN 4 /* 関数のアライン単位 */
71#endif /* __thumb__ */
72#define CHECK_FUNC_NONNULL /* 関数の非NULLチェック */
73#define CHECK_STACK_ALIGN 8 /* スタック領域のアライン単位 */
74#define CHECK_STACK_NONNULL /* スタック領域の非NULLチェック */
75#define CHECK_MPF_ALIGN 4 /* 固定長メモリプール領域のアライン単位 */
76#define CHECK_MPF_NONNULL /* 固定長メモリプール領域の非NULLチェック */
77#define CHECK_MB_ALIGN 4 /* 管理領域のアライン単位 */
78
79#ifndef TOPPERS_MACRO_ONLY
80
81/*
82 * レディキューサーチのためのビットマップサーチ関数
83 *
84 * CLZ命令は最上位ビットからサーチするため,最上位ビットを最高優先度に
85 * 対応させる.
86 */
87#if __TARGET_ARCH_ARM >= 6
88
89#define OMIT_BITMAP_SEARCH
90#define PRIMAP_BIT(pri) (0x8000U >> (pri))
91
92Inline uint_t
93bitmap_search(uint16_t bitmap)
94{
95 return((uint_t)(count_leading_zero((uint32_t) bitmap) - 16));
96}
97
98#endif /* __TARGET_ARCH_ARM >= 6 */
99
100/*
101 * コンテキストの参照
102 *
103 * ARM依存部では,タスクコンテキストと非タスクコンテキストの両方をスー
104 * パバイザモードで動作させるため,プロセッサモードで判断することがで
105 * きない.そのため,割込みハンドラ/CPU例外ハンドラのネスト段数(これ
106 * を,例外ネストカウントと呼ぶ)で管理し,例外ネストカウントが0の時に
107 * タスクコンテキスト,0より大きい場合に非タスクコンテキストであると判
108 * 断する.
109 */
110extern uint32_t excpt_nest_count; /* 例外ネストカウント */
111
112Inline bool_t
113sense_context(void)
114{
115 return(excpt_nest_count > 0U);
116}
117
118#endif /* TOPPERS_MACRO_ONLY */
119
120/*
121 * TOPPERS標準割込み処理モデルの実現
122 *
123 * ARMコア依存部では,割込みの扱いに関して,次の2つの方法をサポートす
124 * る.
125 *
126 * (1) カーネルを単体で使用する場合やSafeGのノンセキュアモードで使用す
127 * る場合:IRQをカーネル管理の割込み,FIQをカーネル管理外の割込みとす
128 * る.デフォルトでは,この方法が使用される.
129 *
130 * (2) SafeGのセキュアモードで使用する場合:FIQをカーネル管理の割込み
131 * とし,カーネルの動作中はIRQを常にマスクする.この方法を使用する場合
132 * には,TOPPERS_SAFEG_SECUREをマクロ定義する.
133 *
134 * TOPPERS標準割込み処理モデルの中で,割込み優先度マスクと割込み要求禁
135 * 止フラグに関しては,割込みコントローラによって実現方法が異なるため,
136 * ARMコア依存部では扱わない.
137 */
138
139/*
140 * FIQとIRQの両方を禁止するCPSRのビットパターン
141 */
142#ifndef TOPPERS_MACRO_ONLY
143#define CPSR_FIQ_IRQ_BIT (CPSR_FIQ_BIT|CPSR_IRQ_BIT)
144#else /* TOPPERS_MACRO_ONLY */
145#define CPSR_FIQ_IRQ_BIT (CPSR_FIQ_BIT AOR CPSR_IRQ_BIT)
146#endif /* TOPPERS_MACRO_ONLY */
147
148/*
149 * CPUロック・割込みロックでない状態でのCPSRのビットパターン
150 */
151#ifndef TOPPERS_SAFEG_SECURE
152#define CPSR_UNLOCK UINT_C(0x00)
153#else /* TOPPERS_SAFEG_SECURE */
154#define CPSR_UNLOCK CPSR_IRQ_BIT
155#endif /* TOPPERS_SAFEG_SECURE */
156
157/*
158 * CPUロック状態でのCPSRのビットパターン
159 */
160#ifndef TOPPERS_SAFEG_SECURE
161#define CPSR_CPULOCK CPSR_IRQ_BIT
162#else /* TOPPERS_SAFEG_SECURE */
163#define CPSR_CPULOCK CPSR_FIQ_IRQ_BIT
164#endif /* TOPPERS_SAFEG_SECURE */
165
166/*
167 * 割込みロック状態でのCPSRのビットパターン
168 */
169#define CPSR_INTLOCK CPSR_FIQ_IRQ_BIT
170
171#ifndef TOPPERS_MACRO_ONLY
172
173/*
174 * CPUロック状態への遷移
175 */
176Inline void
177lock_cpu(void)
178{
179#if __TARGET_ARCH_ARM < 6
180 set_cpsr(current_cpsr() | CPSR_CPULOCK);
181#else /* __TARGET_ARCH_ARM < 6 */
182#ifndef TOPPERS_SAFEG_SECURE
183 disable_irq();
184#else /* TOPPERS_SAFEG_SECURE */
185 disable_fiq()
186#endif /* TOPPERS_SAFEG_SECURE */
187#endif /* __TARGET_ARCH_ARM < 6 */
188
189 /*
190 * メモリ参照が,この関数を超えて最適化されることを抑止
191 */
192 ARM_MEMORY_CHANGED;
193}
194
195/*
196 * CPUロック状態への移行(ディスパッチできる状態)
197 */
198#define lock_cpu_dsp() lock_cpu()
199
200/*
201 * CPUロック状態の解除
202 */
203Inline void
204unlock_cpu(void)
205{
206 /*
207 * メモリ参照が,この関数を超えて最適化されることを抑止
208 */
209 ARM_MEMORY_CHANGED;
210
211#if __TARGET_ARCH_ARM < 6
212 set_cpsr((current_cpsr() & ~CPSR_INT_MASK) | CPSR_UNLOCK);
213#else /* __TARGET_ARCH_ARM < 6 */
214#ifndef TOPPERS_SAFEG_SECURE
215 enable_irq();
216#else /* TOPPERS_SAFEG_SECURE */
217 enable_fiq()
218#endif /* TOPPERS_SAFEG_SECURE */
219#endif /* __TARGET_ARCH_ARM < 6 */
220}
221
222/*
223 * CPUロック状態の解除(ディスパッチできる状態)
224 */
225#define unlock_cpu_dsp() unlock_cpu()
226
227/*
228 * CPUロック状態の参照
229 */
230Inline bool_t
231sense_lock(void)
232{
233#ifndef TOPPERS_SAFEG_SECURE
234 return((current_cpsr() & CPSR_IRQ_BIT) != 0U);
235#else /* TOPPERS_SAFEG_SECURE */
236 return((current_cpsr() & CPSR_FIQ_BIT) != 0U);
237#endif /* TOPPERS_SAFEG_SECURE */
238}
239
240/*
241 * 割込みを受け付けるための遅延処理
242 */
243Inline void
244delay_for_interrupt(void)
245{
246}
247
248/*
249 * 非タスクコンテキスト用のスタック初期値
250 */
251#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
252
253/*
254 * タスクコンテキストブロックの定義
255 */
256typedef struct task_context_block {
257 void *sp; /* スタックポインタ */
258 FP pc; /* 実行再開番地 */
259} TSKCTXB;
260
261/*
262 * タスクディスパッチャ
263 */
264
265/*
266 * 最高優先順位タスクへのディスパッチ(core_support.S)
267 *
268 * dispatchは,タスクコンテキストから呼び出されたサービスコール処理か
269 * ら呼び出すべきもので,タスクコンテキスト・CPUロック状態・ディスパッ
270 * チ許可状態・(モデル上の)割込み優先度マスク全解除状態で呼び出さな
271 * ければならない.
272 */
273extern void dispatch(void);
274
275/*
276 * 非タスクコンテキストからのディスパッチ要求
277 */
278#define request_dispatch()
279
280/*
281 * ディスパッチャの動作開始(core_support.S)
282 *
283 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
284 * みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
285 * ならない.
286 */
287extern void start_dispatch(void) NoReturn;
288
289/*
290 * 現在のコンテキストを捨ててディスパッチ(core_support.S)
291 *
292 * exit_and_dispatchは,ext_tskから呼び出すべきもので,タスクコンテキ
293 * スト・CPUロック状態・ディスパッチ許可状態・(モデル上の)割込み優先
294 * 度マスク全解除状態で呼び出さなければならない.
295 */
296extern void exit_and_dispatch(void) NoReturn;
297
298/*
299 * カーネルの終了処理の呼出し(core_support.S)
300 *
301 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
302 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
303 * す.
304 */
305extern void call_exit_kernel(void) NoReturn;
306
307/*
308 * タスクコンテキストの初期化
309 *
310 * タスクが休止状態から実行できる状態に遷移する時に呼ばれる.この時点
311 * でスタック領域を使ってはならない.
312 *
313 * activate_contextを,インライン関数ではなくマクロ定義としているのは,
314 * この時点ではTCBが定義されていないためである.
315 */
316extern void start_r(void);
317
318#define activate_context(p_tcb) \
319{ \
320 (p_tcb)->tskctxb.sp = (void *)((char *)((p_tcb)->p_tinib->stk) \
321 + (p_tcb)->p_tinib->stksz); \
322 (p_tcb)->tskctxb.pc = (FP) start_r; \
323}
324
325/*
326 * 標準の割込み管理機能の初期化処理を用いない
327 */
328#define OMIT_INITIALIZE_INTERRUPT
329
330/*
331 * 割込みハンドラテーブル(kernel_cfg.c)
332 */
333extern FP inh_table[TNUM_INHNO];
334
335/*
336 * 割込み要求ライン設定テーブル(kernel_cfg.c)
337 *
338 * 割込み要求ラインに対して割込み属性が設定されていれば1,設定されてい
339 * なければ0を保持するテーブル.
340 */
341#ifdef USE_INTCFG_TABLE
342extern const uint8_t intcfg_table[TNUM_INTNO];
343#endif /* USE_INTCFG_TABLE */
344
345/*
346 * 標準の例外管理機能の初期化処理を用いない
347 */
348#define OMIT_INITIALIZE_EXCEPTION
349
350/*
351 * CPU例外ハンドラテーブル(kernel_cfg.c)
352 */
353extern const FP exc_table[TNUM_EXCNO];
354
355/*
356 * CPU例外ハンドラの初期化
357 */
358Inline void
359initialize_exception(void)
360{
361}
362
363/*
364 * CPU例外の発生した時のコンテキストの参照
365 *
366 * CPU例外の発生した時のコンテキストが,タスクコンテキストの時にfalse,
367 * そうでない時にtrueを返す.
368 */
369Inline bool_t
370exc_sense_context(void *p_excinf)
371{
372 return(((T_EXCINF *)(p_excinf))->nest_count != 0U);
373}
374
375/*
376 * CPU例外の発生した時の割込み優先度マスクの参照
377 */
378Inline PRI
379exc_get_intpri(void *p_excinf)
380{
381 return((PRI)(((T_EXCINF *)(p_excinf))->intpri));
382}
383
384/*
385 * CPUロック状態または割込みロック状態かの参照
386 */
387Inline bool_t
388exc_sense_lock(void *p_excinf)
389{
390#ifndef TOPPERS_SAFEG_SECURE
391 return(((((T_EXCINF *)(p_excinf))->cpsr) & CPSR_INT_MASK) != 0U);
392#define CPSR_UNLOCK UINT_C(0x00)
393#else /* TOPPERS_SAFEG_SECURE */
394 return(((((T_EXCINF *)(p_excinf))->cpsr) & CPSR_FIQ_BIT) != 0U);
395#endif /* TOPPERS_SAFEG_SECURE */
396}
397
398/*
399 * CPU例外の発生した時のコンテキストと割込みのマスク状態の参照
400 *
401 * CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコ
402 * ンテキストであり,全割込みロック状態でなく,CPUロック状態でなく,割
403 * 込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返す
404 * (CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返
405 * す).
406 *
407 */
408Inline bool_t
409exc_sense_intmask(void *p_excinf)
410{
411 return(!exc_sense_context(p_excinf)
412 && exc_get_intpri(p_excinf) == TIPM_ENAALL
413 && !exc_sense_lock(p_excinf));
414}
415
416#endif /* TOPPERS_MACRO_ONLY */
417
418/*
419 * MMU関連の操作(VMSA)
420 */
421#ifdef USE_ARM_MMU
422
423/*
424 * 変換テーブルベースレジスタ(TTBR)の設定値
425 */
426#if __TARGET_ARCH_ARM < 6
427#define TTBR_CONFIG 0U
428#elif __TARGET_ARCH_ARM < 7
429#define TTBR_CONFIG (CP15_TTBR_RGN_CACHEABLE|CP15_TTBR_RGN_SHAREABLE \
430 |CP15_TTBR_RGN_WBACK)
431#else /* __TARGET_ARCH_ARM < 7 */
432#define TTBR_CONFIG (CP15_TTBR_RGN_SHAREABLE|CP15_TTBR_RGN_WBWA \
433 |CP15_TTBR_IRGN_WBWA)
434#endif
435
436#ifndef TOPPERS_MACRO_ONLY
437
438/*
439 * MMUの設定情報のデータ型
440 */
441typedef struct arm_mmu_config {
442 uint32_t vaddr; /* 仮想アドレス */
443 uint32_t paddr; /* 物理アドレス */
444 uint32_t size; /* サイズ */
445 uint32_t attr; /* セクション属性 */
446} ARM_MMU_CONFIG;
447
448/*
449 * MMUの設定情報の数(メモリエリアの数)(target_kernel_impl.c)
450 */
451extern const uint_t arm_tnum_memory_area;
452
453/*
454 * MMUの設定情報(メモリエリアの情報)(target_kernel_impl.c)
455 */
456extern ARM_MMU_CONFIG arm_memory_area[];
457
458/*
459 * MMUの初期化
460 */
461extern void arm_mmu_initialize(void);
462
463#endif /* TOPPERS_MACRO_ONLY */
464#endif /* USE_ARM_MMU */
465
466#ifndef TOPPERS_MACRO_ONLY
467
468/*
469 * コア依存の初期化
470 */
471extern void core_initialize(void);
472
473/*
474 * コア依存の終了処理
475 */
476extern void core_terminate(void);
477
478/*
479 * CPU例外の発生状況のログ出力
480 */
481#ifndef OMIT_XLOG_SYS
482extern void xlog_sys(void *p_excinf);
483extern void xlog_fsr(uint32_t fsr, uint32_t far);
484#endif /* OMIT_XLOG_SYS */
485
486/*
487 * 未定義の割込みが入った場合の処理
488 */
489extern void default_int_handler(void);
490
491/*
492 * 未定義の例外が入った場合の処理
493 */
494extern void default_exc_handler(void *p_excinf, EXCNO excno);
495
496#endif /* TOPPERS_MACRO_ONLY */
497#endif /* TOPPERS_CORE_KERNEL_IMPL_H */
Note: See TracBrowser for help on using the repository browser.