source: ssp_armv6_m_gcc/trunk/armv6_m_gcc/prc_config.h@ 421

Last change on this file since 421 was 421, checked in by nmir-saito, 4 years ago

Merge branch 'rubycfg' to trunk

  • Property svn:mime-type set to text/plain; charset=utf-8
File size: 12.4 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2008 by Embedded and Real-Time Systems Laboratory
6 * Graduate School of Information Science, Nagoya Univ., JAPAN
7 * Copyright (C) 2013,2015 by Naoki Saito
8 * Nagoya Municipal Industrial Research Institute, JAPAN
9 *
10 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
13 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
14 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
15 * スコード中に含まれていること.
16 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
17 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
18 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
19 * の無保証規定を掲載すること.
20 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
21 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
22 * と.
23 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
24 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
26 * 報告すること.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
29 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
30 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
31 * 免責すること.
32 *
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
35 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
36 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
37 * の責任を負わない.
38 *
39 * @(#) $Id: prc_config.h 1304 2008-08-27 07:28:36Z ertl-honda $
40 */
41
42/*
43 * プロセッサ依存モジュール(ARM-M用)
44 *
45 * このインクルードファイルは,target_config.h(または,そこからインク
46 * ルードされるファイル)のみからインクルードされる.他のファイルから
47 * 直接インクルードしてはならない.
48 */
49
50#ifndef TOPPERS_PRC_CONFIG_H
51#define TOPPERS_PRC_CONFIG_H
52
53#ifndef TOPPERS_MACRO_ONLY
54
55/*
56 * プロセッサの特殊命令のインライン関数定義
57 */
58#include "prc_insn.h"
59
60/*
61 * 非タスクコンテキスト用のスタック初期値
62 */
63#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char *)(istk) + (istksz)))
64
65#endif /* TOPPERS_MACRO_ONLY */
66
67#ifndef TOPPERS_MACRO_ONLY
68
69/*
70 * 割込みネスト数
71 */
72extern uint8_t intnest;
73
74/*
75 * コンテキストの参照
76 *
77 */
78Inline bool_t
79sense_context(void)
80{
81 bool_t tskctx;
82
83 if (intnest == 0u){
84 tskctx = false;
85 }
86 else {
87 tskctx = true;
88 }
89
90 return tskctx;
91}
92
93#endif /* TOPPERS_MACRO_ONLY */
94
95/*
96 * TOPPERS標準割込み処理モデルの実現
97 *
98 * ARMv6-MアーキテクチャにはBASEPRI,FAULTMASK が存在しない.
99 * 割込み優先度マスクレベルの変更をソフトウェアで行うことができないため,
100 * CPUロック状態についてはPRIMASKにより管理する.
101 * そして,NMI以外のカーネル管理外の割込みはサポートしない.
102 * 同様に,割込みロックもPRIMASKで実現する.
103 */
104
105/*
106 * 割込み優先度マスクの外部表現と内部表現の変換
107 *
108 * アセンブリ言語のソースファイルからインクルードする場合のために,
109 * CASTを使用
110 * 割込み優先度のビット幅(TBITW_IPRI)が 8 の場合は,内部優先度 255
111 * は,外部優先度 -1 に対応する.
112 */
113#define EXT_IPM(iipm) (CAST(PRI,((iipm >> (8 - TBITW_IPRI)) - (1 << TBITW_IPRI)))) /* 内部表現を外部表現に */
114#define INT_IPM(ipm) (((1 << TBITW_IPRI) - CAST(uint8_t, -(ipm))) << (8 - TBITW_IPRI)) /* 外部表現を内部表現に */
115
116/*
117 * CPUロック状態での割込み優先度マスク
118 */
119#define TIPM_LOCK TMIN_INTPRI
120
121
122#ifndef TOPPERS_MACRO_ONLY
123
124/*
125 * CPUロック状態への移行
126 *
127 * PRIMASKのPMビットを1にする.
128 */
129Inline void
130x_lock_cpu(void)
131{
132 Asm("cpsid i":::"memory");
133}
134
135#define t_lock_cpu() x_lock_cpu()
136#define i_lock_cpu() x_lock_cpu()
137
138/*
139 * CPUロック状態の解除
140 *
141 * PRIMASKのPMビットを0にする.
142 */
143Inline void
144x_unlock_cpu(void)
145{
146 Asm("cpsie i":::"memory");
147}
148
149#define t_unlock_cpu() x_unlock_cpu()
150#define i_unlock_cpu() x_unlock_cpu()
151
152/*
153 * CPUロック状態の参照
154 */
155Inline bool_t
156x_sense_lock(void)
157{
158 uint32_t val;
159
160 Asm("mrs %0, PRIMASK" : "=r"(val));
161
162 if (val == 1) {
163 return (true);
164 }
165 else {
166 return (false);
167 }
168}
169
170#define t_sense_lock() x_sense_lock()
171#define i_sense_lock() x_sense_lock()
172
173
174/*
175 * (モデル上の)割込み優先度マスクの設定
176 *
177 * 割込み優先度マスクをプログラムからは変更することができないため,
178 * ここではなにもしない.
179 */
180Inline void
181x_set_ipm(PRI intpri)
182{
183}
184
185#define t_set_ipm(intpri) x_set_ipm(intpri)
186#define i_set_ipm(intpri) x_set_ipm(intpri)
187
188/*
189 * (モデル上の)割込み優先度マスクの参照
190 *
191 * マスクの値をプログラムから設定,取得することはできないため,
192 * ここでは適当な値を返す.
193 */
194Inline PRI
195x_get_ipm(void)
196{
197 return(TMAX_INTPRI);
198}
199
200#define t_get_ipm() x_get_ipm()
201#define i_get_ipm() x_get_ipm()
202
203/*
204 * SVCハンドラ(prc_support.S)
205 */
206extern void svc_handler(void);
207
208/*
209 * スタートアップルーチン(start.S)
210 */
211extern void _start(void);
212
213/*
214 * ディスパッチャの動作開始(prc_support.S)
215 *
216 * start_dispatchは,カーネル起動時に呼び出すべきもので,すべての割込
217 * みを禁止した状態(割込みロック状態と同等の状態)で呼び出さなければ
218 * ならない.
219 */
220extern void start_dispatch(void) NoReturn;
221
222
223/*
224 * カーネルの終了処理の呼出し(prc_support.S)
225 *
226 * call_exit_kernelは,カーネルの終了時に呼び出すべきもので,非タスク
227 * コンテキストに切り換えて,カーネルの終了処理(exit_kernel)を呼び出
228 * す.
229 */
230extern void call_exit_kernel(void) NoReturn;
231
232/*
233 * アイドルループの実装
234 *
235 * 単にCPUロック状態とCPUロック解除状態を呼び出す実装とする.
236 * スリープモードに入れる場合は本処理をwfi命令を用いて書き換えれば良い.
237 */
238Inline void
239idle_loop(void)
240{
241 /* CPUアンロック => CPUロック */
242 i_unlock_cpu();
243 i_lock_cpu();
244}
245
246/*
247 * 割込み番号・割込みハンドラ番号
248 *
249 * 割込みハンドラ番号(inhno)と割込み番号(intno)は,割り込み発生時に
250 * EPSRに設定される例外番号とする.
251 */
252
253/*
254 * 割込み番号の範囲の判定
255 */
256#define VALID_INTNO(intno) ((TMIN_INTNO <= (intno)) && ((intno) <= TMAX_INTNO))
257#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
258#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
259
260/*
261 * 割込みハンドラの設定
262 *
263 * ベクトル番号inhnoの割込みハンドラの起動番地int_entryに設定する.割込み
264 * ハンドラテーブル
265 */
266Inline void
267x_define_inh(INHNO inhno, FP int_entry)
268{
269 /* 特に行う処理はない */
270}
271
272/*
273 * 割込みハンドラの出入口処理の生成マクロ
274 *
275 */
276#define INT_ENTRY(inhno, inthdr) inthdr
277#define INTHDR_ENTRY(inhno, inhno_num, inthdr) extern void inthdr(void);
278
279/*
280 * 割込み要求禁止フラグ
281 */
282
283/*
284 * 割込み属性が設定されているかを判別するための変数(kernel_cfg.c)
285 */
286extern const uint32_t bitpat_cfgint[];
287
288/*
289 * 割込み要求禁止フラグのセット
290 *
291 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
292 * フラグをクリアしようとした場合には,falseを返す.
293 */
294Inline bool_t
295x_disable_int(INTNO intno)
296{
297 uint32_t tmp;
298
299 /*
300 * 割込み属性が設定されていない場合
301 */
302 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
303 return(false);
304 }
305
306 if (intno == IRQNO_SYSTICK) {
307 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
308 tmp &= ~SYSTIC_TICINT;
309 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
310 }else {
311 tmp = intno - 16;
312 sil_wrw_mem((void *)NVIC_CLRENA0 + (tmp >> 5), (1 << (tmp & 0x1f)));
313 }
314
315 return(true);
316}
317
318#define t_disable_int(intno) x_disable_int(intno)
319#define i_disable_int(intno) x_disable_int(intno)
320
321/*
322 * 割込み要求禁止フラグの解除
323 *
324 * 割込み属性が設定されていない割込み要求ラインに対して割込み要求禁止
325 * フラグをクリアしようとした場合には,falseを返す.
326 */
327Inline bool_t
328x_enable_int(INTNO intno)
329{
330 uint32_t tmp;
331
332 /*
333 * 割込み属性が設定されていない場合
334 */
335 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
336 return(false);
337 }
338
339 if (intno == IRQNO_SYSTICK) {
340 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
341 tmp |= SYSTIC_TICINT;
342 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
343 }else {
344 tmp = intno - 16;
345 sil_wrw_mem((void *)((uint32_t *)NVIC_SETENA0 + (tmp >> 5)),
346 (1 << (tmp & 0x1f)));
347 }
348
349 return(true);
350}
351
352#define t_enable_int(intno) x_enable_int(intno)
353#define i_enable_int(intno) x_enable_int(intno)
354
355Inline void
356x_clear_int(INTNO intno)
357{
358 uint32_t tmp;
359
360 if (intno != IRQNO_SYSTICK) {
361 tmp = intno - 16;
362 sil_wrw_mem((void *)((uint32_t *)NVIC_CLRENA0 + (tmp >> 5)),
363 (1 << (tmp & 0x1f)));
364 }
365}
366
367/*
368 * 割込み要求ラインの属性の設定
369 */
370extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
371
372/*
373 * 割込みハンドラ入口で必要なIRC操作
374 */
375Inline void
376i_begin_int(INTNO intno)
377{
378 /* 特に行う処理はない */
379}
380
381/*
382 * 割込みハンドラの出口で必要なIRC操作
383 */
384Inline void
385i_end_int(INTNO intno)
386{
387 /* 特に行う処理はない */
388}
389
390/*
391 * CPU例外ハンドラ関係
392 */
393
394/*
395 * CPU例外ハンドラ番号
396 */
397#define VALID_EXCNO_DEFEXC(excno) (TMIN_EXCNO <= (excno) && (excno) <= TMAX_EXCNO)
398
399/*
400 * CPU例外ハンドラの許可
401 */
402extern void enable_exc(EXCNO excno);
403
404/*
405 * CPU例外ハンドラの禁止
406 */
407extern void disable_exc(EXCNO excno);
408
409/*
410 * CPU例外ハンドラの設定
411 */
412Inline void
413x_define_exc(EXCNO excno, FP exc_entry)
414{
415 /*
416 * 一部の例外は許可を行う必要がある
417 */
418 enable_exc(excno);
419}
420
421/*
422 * CPU例外ハンドラの入口処理の生成マクロ
423 */
424#define EXC_ENTRY(excno, exchdr) exchdr
425#define EXCHDR_ENTRY(excno, excno_num, exchdr) extern void exchdr(void *p_excinf);
426
427
428/*
429 * CPU例外エントリ(prc_support.S)
430 */
431extern void exc_entry(void);
432
433/*
434 * 割込みエントリ(prc_support.S)
435 */
436extern void int_entry(void);
437
438/*
439 * プロセッサ依存の初期化
440 */
441extern void prc_initialize(void);
442
443/*
444 * プロセッサ依存の終了時処理
445 */
446extern void prc_terminate(void) NoReturn;
447
448/*
449 * atexitの処理とデストラクタの実行
450 */
451Inline void
452call_atexit(void)
453{
454 extern void software_term_hook(void);
455 void (*volatile fp)(void) = software_term_hook;
456
457 /*
458 * software_term_hookへのポインタを,一旦volatile指定のあるfpに代
459 * 入してから使うのは,0との比較が最適化で削除されないようにするた
460 * めである.
461 */
462 if (fp != 0) {
463 (*fp)();
464 }
465}
466
467/*
468 * 登録されていない例外が発生すると呼び出される
469 */
470extern void default_exc_handler(void *p_excinf);
471
472/*
473 * 未登録の割込みが発生した場合に呼び出される
474 */
475extern void default_int_handler(void *p_excinf);
476
477#endif /* TOPPERS_MACRO_ONLY */
478#endif /* TOPPERS_PRC_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.