source: asp_ewarm/asp-1.7.0/arch/arm_m_iccarm/prc_config.c@ 61

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

ASP for EWARM のコミット.

File size: 7.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) 2008 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
10 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
11 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
12 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
13 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
14 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
15 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
16 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
17ƒƒ“ƒgi—˜—p
18 * ŽÒƒ}ƒjƒ…
19ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
20 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
21 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
22 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
23 * ‚ƁD
24 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
25ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
26ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
27 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
28 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
29 * •ñ‚·‚邱‚ƁD
30 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
31 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
32 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
33 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
34 * –Ɛӂ·‚邱‚ƁD
35 *
36 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
37 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
38 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
39 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
40 * ‚̐ӔC‚𕉂í‚È‚¢D
41 *
42 */
43
44/*
45 * ƒvƒƒZƒbƒTˆË‘¶ƒ‚ƒWƒ…
46[ƒ‹iARM-M—pj
47 */
48
49#include "kernel_impl.h"
50#include "check.h"
51#include "task.h"
52
53/*
54 * CPUƒƒbƒNƒtƒ‰ƒOŽÀŒ»‚Ì‚½‚߂̕ϐ”
55 */
56volatile bool_t lock_flag; /* CPUƒƒbƒNƒtƒ‰ƒO‚Ì’l‚ð•ÛŽ‚·‚é•Ï” */
57volatile uint32_t saved_iipm; /* Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ð•Û‘¶‚·‚é•Ï” */
58
59/*
60 * ƒxƒNƒ^ƒe[ƒuƒ‹(kernel_cfg.c)
61 */
62extern const FP vector_table[];
63
64/*
65 * ƒVƒXƒeƒ€—áŠOEŠ„ž‚݂́i—áŠO”ԍ† 4`15j
66 * Š„ž‚Ý—Dæ“xÝ’背ƒWƒXƒ^‚ւ̃AƒNƒZƒX‚Ì‚½‚ß‚Ì”z—ñ
67 */
68static const unsigned int nvic_sys_pri_reg[] = {
69 0,
70 NVIC_SYS_PRI1,
71 NVIC_SYS_PRI2,
72 NVIC_SYS_PRI3
73};
74
75/*
76 * —áŠO‚ÆŠ„ž‚Ý‚ÌŠ„ž‚Ý—Dæ“x‚ðƒZƒbƒg
77 *
78 * excno‚ÍARM-M‚Å’è‚ß‚ç‚ê‚Ä‚¢‚é Exception Number ‚ðŽw’èD
79 */
80void
81set_exc_int_priority(uint32_t excno, uint32_t iipm){
82 uint32_t tmp, reg;
83
84 /*
85 * Š„ž‚Ý—Dæ“xÝ’背ƒWƒXƒ^‚ÌŒˆ’è
86 */
87 if ((EXCNO_MPU <= excno) && (excno <= IRQNO_SYSTICK)) {
88 /*
89 * Exception Number 4(Memory Management)‚©‚ç
90 * Exception Number 15(SysTick)‚Ü‚Å‚ÌŠ„ž‚Ý—Dæ“x‚̓VƒXƒeƒ€—Dæ“x
91 * ƒŒƒWƒXƒ^‚É‚æ‚èÝ’èD
92 */
93 reg = nvic_sys_pri_reg[excno >> 2];
94 }
95 else if ((TMIN_INTNO < excno) && (excno <= TMAX_INTNO)){
96 /*
97 * IRQŠ„ž‚Ý‚È‚ç
98 */
99 reg = NVIC_PRI0 + (((excno - (TMIN_INTNO + 1)) >> 2) * 4);
100 }
101 else {
102 return ;
103 }
104
105 tmp = sil_rew_mem((void *)reg);
106 tmp &= ~(0xFF << (8 * (excno & 0x03)));
107 tmp |= iipm << (8 * (excno & 0x03));
108 sil_wrw_mem((void *)reg, tmp);
109}
110
111/*
112 * —áŠO‚Ì‹–‰Â
113 *
114 * Memory Management, Bus Fault, Usage Fault ‚Í‹ÖŽ~E‹–‰Â‚ª”ƒ‚¨‚¤
115 */
116void
117enable_exc(EXCNO excno)
118{
119 uint32_t tmp;
120
121 switch (excno) {
122 case EXCNO_MPU:
123 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
124 tmp |= NVIC_SYS_HND_CTRL_MEM;
125 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
126 break;
127 case EXCNO_BUS:
128 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
129 tmp |= NVIC_SYS_HND_CTRL_BUS;
130 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
131 break;
132 case EXCNO_USAGE:
133 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
134 tmp |= NVIC_SYS_HND_CTRL_USAGE;
135 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
136 break;
137 }
138}
139
140/*
141 * —áŠO‚Ì‹ÖŽ~
142 */
143void
144disable_exc(EXCNO excno)
145{
146 uint32_t tmp;
147
148 switch (excno) {
149 case EXCNO_MPU:
150 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
151 tmp &= ~NVIC_SYS_HND_CTRL_MEM;
152 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
153 break;
154 case EXCNO_BUS:
155 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
156 tmp &= ~NVIC_SYS_HND_CTRL_BUS;
157 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
158 break;
159 case EXCNO_USAGE:
160 tmp = sil_rew_mem((void *)NVIC_SYS_HND_CTRL);
161 tmp &= ~NVIC_SYS_HND_CTRL_USAGE;
162 sil_wrw_mem((void *)NVIC_SYS_HND_CTRL, tmp);
163 break;
164 }
165}
166
167
168/*
169 * ƒvƒƒZƒbƒTˆË‘¶‚̏‰Šú‰»
170 */
171void
172core_initialize(void)
173{
174 /*
175 * CPUƒƒbƒNƒtƒ‰ƒOŽÀŒ»‚Ì‚½‚߂̕ϐ”‚̏‰Šú‰»
176 */
177 lock_flag = true;
178 saved_iipm = IIPM_ENAALL;
179
180 /*
181 * ƒxƒNƒ^ƒe[ƒuƒ‹‚ðÝ’è
182 */
183 sil_wrw_mem((void*)NVIC_VECTTBL, (uint32_t)vector_table);
184
185 /*
186 * SVCƒnƒ“ƒhƒ‰‚Ì—Dæ“x‚ðÝ’è
187 */
188 set_exc_int_priority(EXCNO_HARD, 0);
189 set_exc_int_priority(EXCNO_MPU, 0);
190 set_exc_int_priority(EXCNO_BUS, 0);
191 set_exc_int_priority(EXCNO_USAGE, 0);
192 set_exc_int_priority(EXCNO_SVCALL, 0);
193 set_exc_int_priority(EXCNO_DEBUG, 0);
194 set_exc_int_priority(EXCNO_PENDSV, 0);
195
196 /*
197 * SVCƒnƒ“ƒhƒ‰‚ð—LŒø‚É
198 */
199 x_enable_int(EXCNO_SVCALL);
200}
201
202/*
203 * ƒvƒƒZƒbƒTˆË‘¶‚̏I—¹ˆ—
204 */
205void
206core_terminate(void)
207{
208 extern __weak void software_term_hook(void);
209 void (*volatile fp)(void) = software_term_hook;
210
211 /*
212 * software_term_hook‚ւ̃|ƒCƒ“ƒ^‚ðCˆê’UvolatileŽw’è‚Ì‚ ‚éfp‚É‘ã
213 * “ü‚µ‚Ä‚©‚çŽg‚¤‚̂́C0‚Æ‚Ì”äŠr‚ªÅ“K‰»‚ō폜‚³‚ê‚È‚¢‚悤‚É‚·‚邽
214 * ‚ß‚Å‚ ‚éD
215 */
216 if (fp != 0) {
217 (*fp)();
218 }
219}
220
221/*
222 * Š„ž‚Ý—v‹ƒ‰ƒCƒ“‘®«‚̐ݒè
223 */
224void
225x_config_int(INTNO intno, ATR intatr, PRI intpri)
226{
227 assert(VALID_INTNO_CFGINT(intno));
228 assert(TMIN_INTPRI <= intpri && intpri <= TMAX_INTPRI);
229
230 /*
231 * ˆê’UŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é
232 */
233 (void)x_disable_int(intno);
234
235 /*
236 * Š„ž‚Ý—Dæ“x‚ðƒZƒbƒg
237 */
238 set_exc_int_priority(intno, INT_IPM(intpri));
239
240 /*
241 * Š„ž‚Ý—v‹ƒ}ƒXƒN‰ðœ(•K—v‚ȏꍇ)
242 * “¯Žž‚ÉŠ„ž‚Ý—Dæ“x‚àƒZƒbƒg‚³‚ê‚é
243 */
244 if ((intatr & TA_ENAINT) != 0U) {
245 (void) x_enable_int(intno);
246 }
247}
248
249
250#ifndef OMIT_DEFAULT_EXC_HANDLER
251/*
252 * TrapaˆÈŠO‚Ì—áŠO‚Å“o˜^‚³‚ê‚Ä‚¢‚È‚¢—áŠO‚ª”­¶‚·‚é‚ƌĂяo‚³‚ê‚é
253 */
254void
255default_exc_handler(void *p_excinf)
256{
257 uint32_t basepri = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_BASEPRI);
258 uint32_t pc = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_PC);
259 uint32_t xpsr = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_XPSR);
260 uint32_t excno = get_ipsr() & IPSR_ISR_NUMBER;
261
262 syslog(LOG_EMERG, "\nUnregistered Exception occurs.");
263 syslog(LOG_EMERG, "Excno = %08x PC = %08x XPSR = %08x basepri = %08X, p_excinf = %08X",
264 excno, pc, xpsr, basepri, p_excinf);
265
266 target_exit();
267}
268#endif /* OMIT_DEFAULT_EXC_HANDLER */
269
270#ifndef OMIT_DEFAULT_INT_HANDLER
271/*
272 * –¢“o˜^‚ÌŠ„ž‚Ý‚ª”­¶‚µ‚½ê‡‚ɌĂяo‚³‚ê‚é
273 */
274void
275default_int_handler(void *p_excinf)
276{
277 uint32_t basepri = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_BASEPRI);
278 uint32_t pc = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_PC);
279 uint32_t xpsr = *(((uint32_t*)p_excinf) + P_EXCINF_OFFSET_XPSR);
280 uint32_t excno = get_ipsr() & IPSR_ISR_NUMBER;
281
282 syslog(LOG_EMERG, "\nUnregistered Interrupt occurs.");
283 syslog(LOG_EMERG, "Excno = %08x PC = %08x XPSR = %08x basepri = %08X, p_excinf = %08X",
284 excno, pc, xpsr, basepri, p_excinf);
285
286 target_exit();
287}
288#endif /* OMIT_DEFAULT_INT_HANDLER */
Note: See TracBrowser for help on using the repository browser.