source: asp3_wo_tecs/trunk/arch/arm_m_gcc/common/core_kernel_impl.c@ 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: 8.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.c 301 2015-01-07 04:57:01Z ertl-ishikawa $
56 */
57
58/*
59 * コア依存モジュール(ARM-M用)
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65
66/*
67 * CPUロックフラグ実現のための変数
68 */
69volatile bool_t lock_flag; /* CPUロックフラグの値を保持する変数 */
70volatile uint32_t saved_iipm; /* 割込み優å…
71ˆåº¦ãƒžã‚¹ã‚¯ã‚’保存する変数 */
72
73/*
74 * ベクタテーブル(kernel_cfg.c)
75 */
76extern const FP vector_table[];
77
78/*
79 * システム例外・割込みの(例外番号 4〜15)
80 * 割込み優å…
81ˆåº¦è¨­å®šãƒ¬ã‚¸ã‚¹ã‚¿ã¸ã®ã‚¢ã‚¯ã‚»ã‚¹ã®ãŸã‚ã®é…
82åˆ—
83 */
84static const unsigned int nvic_sys_pri_reg[] = {
85 0,
86 NVIC_SYS_PRI1,
87 NVIC_SYS_PRI2,
88 NVIC_SYS_PRI3
89};
90
91/*
92 * 例外と割込みの割込み優å…
93ˆåº¦ã‚’セット
94 *
95 * excnoはARM-Mで定められている Exception Number を指定.
96 */
97void
98set_exc_int_priority(uint32_t excno, uint32_t iipm){
99 uint32_t tmp, reg;
100
101 /*
102 * 割込み優å…
103ˆåº¦è¨­å®šãƒ¬ã‚¸ã‚¹ã‚¿ã®æ±ºå®š
104 */
105 if ((EXCNO_MPU <= excno) && (excno <= IRQNO_SYSTICK)) {
106 /*
107 * Exception Number 4(Memory Management)から
108 * Exception Number 15(SysTick)までの割込み優å…
109ˆåº¦ã¯ã‚·ã‚¹ãƒ†ãƒ å„ªå…
110ˆåº¦
111 * レジスタにより設定.
112 */
113 reg = nvic_sys_pri_reg[excno >> 2];
114 }
115 else if ((TMIN_INTNO < excno) && (excno <= TMAX_INTNO)){
116 /*
117 * IRQ割込みなら
118 */
119 reg = NVIC_PRI0 + (((excno - (TMIN_INTNO + 1)) >> 2) * 4);
120 }
121 else {
122 return ;
123 }
124
125 tmp = sil_rew_mem((void *)reg);
126 tmp &= ~(0xFF << (8 * (excno & 0x03)));
127 tmp |= iipm << (8 * (excno & 0x03));
128 sil_wrw_mem((void *)reg, tmp);
129}
130
131/*
132 * 例外の許可
133 *
134 * Memory Management, Bus Fault, Usage Fault は禁止・許可が可能
135 */
136void
137enable_exc(EXCNO excno)
138{
139 uint32_t tmp;
140
141 switch (excno) {
142 case EXCNO_MPU:
143 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
144 tmp |= NVIC_SYS_HND_CTRL_MEM;
145 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
146 break;
147 case EXCNO_BUS:
148 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
149 tmp |= NVIC_SYS_HND_CTRL_BUS;
150 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
151 break;
152 case EXCNO_USAGE:
153 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
154 tmp |= NVIC_SYS_HND_CTRL_USAGE;
155 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
156 break;
157 }
158}
159
160/*
161 * 例外の禁止
162 */
163void
164disable_exc(EXCNO excno)
165{
166 uint32_t tmp;
167
168 switch (excno) {
169 case EXCNO_MPU:
170 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
171 tmp &= ~NVIC_SYS_HND_CTRL_MEM;
172 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
173 break;
174 case EXCNO_BUS:
175 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
176 tmp &= ~NVIC_SYS_HND_CTRL_BUS;
177 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
178 break;
179 case EXCNO_USAGE:
180 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
181 tmp &= ~NVIC_SYS_HND_CTRL_USAGE;
182 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
183 break;
184 }
185}
186
187
188/*
189 * コア依存の初期化
190 */
191void
192core_initialize(void)
193{
194 /*
195 * CPUロックフラグ実現のための変数の初期化
196 */
197 lock_flag = true;
198 saved_iipm = IIPM_ENAALL;
199
200 /*
201 * ベクタテーブルを設定
202 */
203 sil_wrw_mem((void*)NVIC_VECTTBL, (uint32_t)vector_table);
204
205 /*
206 * 各例外の優å…
207ˆåº¦ã‚’設定
208 * CPUロック状æ…
209‹ã§ã‚‚発生するように,BASEPRIレジスタでマスクでき
210 * ない'0'とする.
211 */
212 set_exc_int_priority(EXCNO_HARD, 0);
213 set_exc_int_priority(EXCNO_MPU, 0);
214 set_exc_int_priority(EXCNO_BUS, 0);
215 set_exc_int_priority(EXCNO_USAGE, 0);
216 set_exc_int_priority(EXCNO_SVCALL, 0);
217 set_exc_int_priority(EXCNO_DEBUG, 0);
218 set_exc_int_priority(EXCNO_PENDSV, INT_IPM(-1));
219
220 /*
221 * SVCハンドラを有効に
222 */
223 enable_int(EXCNO_SVCALL);
224
225 /*
226 * Configuration Control RegisterのSTKALIGNビットを0にする
227 * スタックは8byteアラインでなく、4byteアライン
228 */
229 sil_andw((void *)CCR_BASE, ~CCR_STKALIGN);
230}
231
232/*
233 * コア依存の終了処理
234 */
235void
236core_terminate(void)
237{
238 extern void software_term_hook(void);
239 void (*volatile fp)(void) = software_term_hook;
240
241 /*
242 * software_term_hookへのポインタを,一旦volatile指定のあるfpに代
243 * å…
244¥ã—てから使うのは,0との比較が最適化で削除されないようにするた
245 * めである.
246 */
247 if (fp != 0) {
248 (*fp)();
249 }
250}
251
252/*
253 * 割込み要求ライン属性の設定
254 */
255void
256config_int(INTNO intno, ATR intatr, PRI intpri)
257{
258 assert(VALID_INTNO_CFGINT(intno));
259 assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);
260
261 /*
262 * 一旦割込みを禁止する
263 */
264 (void)disable_int(intno);
265
266 /*
267 * 割込み優å…
268ˆåº¦ã‚’セット
269 */
270 set_exc_int_priority(intno, INT_IPM(intpri));
271
272 /*
273 * 割込み要求マスク解除(必
274要な場合)
275 */
276 if ((intatr & TA_ENAINT) != 0U) {
277 (void)enable_int(intno);
278 }
279}
280
281
282#ifndef OMIT_DEFAULT_EXC_HANDLER
283/*
284 * Trapa以外の例外で登録されていない例外が発生すると呼び出される
285 */
286void
287default_exc_handler(void *p_excinf)
288{
289 uint32_t basepri = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_BASEPRI);
290 uint32_t pc = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_PC);
291 uint32_t xpsr = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_XPSR);
292 uint32_t excno = get_ipsr() & IPSR_ISR_NUMBER;
293
294 syslog(LOG_EMERG, "\nUnregistered Exception occurs.");
295 syslog(LOG_EMERG, "Excno = %08x PC = %08x XPSR = %08x basepri = %08X, p_excinf = %08X",
296 excno, pc, xpsr, basepri, p_excinf);
297
298 target_exit();
299}
300#endif /* OMIT_DEFAULT_EXC_HANDLER */
301
302#ifndef OMIT_DEFAULT_INT_HANDLER
303/*
304 * 未登録の割込みが発生した場合に呼び出される
305 */
306void
307default_int_handler(void *p_excinf)
308{
309 uint32_t basepri = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_BASEPRI);
310 uint32_t pc = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_PC);
311 uint32_t xpsr = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_XPSR);
312 uint32_t excno = get_ipsr() & IPSR_ISR_NUMBER;
313
314 syslog(LOG_EMERG, "\nUnregistered Interrupt occurs.");
315 syslog(LOG_EMERG, "Excno = %08x PC = %08x XPSR = %08x basepri = %08X, p_excinf = %08X",
316 excno, pc, xpsr, basepri, p_excinf);
317
318 target_exit();
319}
320#endif /* OMIT_DEFAULT_INT_HANDLER */
321
Note: See TracBrowser for help on using the repository browser.