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

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

ASP for EWARM のコミット.

File size: 17.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 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 * ‚±‚̃Cƒ“ƒNƒ‹[ƒhƒtƒ@ƒCƒ‹‚́Ctarget_config.hi‚Ü‚½‚́C‚»‚±‚©‚çƒCƒ“ƒN
49 * ƒ‹[ƒh‚³‚ê‚éƒtƒ@ƒCƒ‹j‚Ì‚Ý‚©‚çƒCƒ“ƒNƒ‹[ƒh‚³‚ê‚éD‘¼‚̃tƒ@ƒCƒ‹‚©‚ç
50 * ’¼ÚƒCƒ“ƒNƒ‹[ƒh‚µ‚Ä‚Í‚È‚ç‚È‚¢D
51 */
52
53#ifndef TOPPERS_PRC_CONFIG_H
54#define TOPPERS_PRC_CONFIG_H
55
56#ifndef TOPPERS_MACRO_ONLY
57
58/*
59 * ƒvƒƒZƒbƒT‚Ì“ÁŽê–½—߂̃Cƒ“ƒ‰ƒCƒ“ŠÖ”’è‹`
60 */
61#include "prc_insn.h"
62
63
64#define TOPPERS_EMPTY_LABEL(x,y) x y[1]
65
66
67/*
68 * ƒ^[ƒQƒbƒgˆË‘¶‚̃IƒuƒWƒFƒNƒg‘®«
69 */
70#define TARGET_INHATR TA_NONKERNEL /* ƒ^[ƒQƒbƒg’è‹`‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‘®« */
71
72/*
73 * ƒGƒ‰[ƒ`ƒFƒbƒN•û–@‚ÌŽw’è
74 */
75#define CHECK_STKSZ_ALIGN 8 /* ƒXƒ^ƒbƒNƒTƒCƒY‚̃Aƒ‰ƒCƒ“’PˆÊ */
76#define CHECK_FUNC_ALIGN 1 /* ŠÖ”‚̃Aƒ‰ƒCƒ“’PˆÊ */
77#define CHECK_FUNC_NONNULL /* ŠÖ”‚Ì”ñNULLƒ`ƒFƒbƒN */
78#define CHECK_STACK_ALIGN 8 /* ƒXƒ^ƒbƒN—̈æ‚̃Aƒ‰ƒCƒ“’PˆÊ */
79#define CHECK_STACK_NONNULL /* ƒXƒ^ƒbƒN—̈æ‚Ì”ñNULLƒ`ƒFƒbƒN */
80#define CHECK_MPF_ALIGN 4 /* ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹—̈æ‚̃Aƒ‰ƒCƒ“’PˆÊ */
81#define CHECK_MPF_NONNULL /* ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹—̈æ‚Ì”ñNULLƒ`ƒFƒbƒN */
82#define CHECK_MB_ALIGN 4 /* ŠÇ——̈æ‚̃Aƒ‰ƒCƒ“’PˆÊ */
83
84/*
85 * ”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—p‚̃Xƒ^ƒbƒN‰Šú’l
86 */
87#define TOPPERS_ISTKPT(istk, istksz) ((STK_T *)((char_t *)(istk) + (istksz)))
88
89/*
90 * ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgƒuƒƒbƒN‚Ì’è‹`
91 */
92typedef struct task_context_block {
93 void *sp; /* ƒXƒ^ƒbƒNƒ|ƒCƒ“ƒ^ */
94 FP pc; /* ƒvƒƒOƒ‰ƒ€ƒJƒEƒ“ƒ^ */
95} TSKCTXB;
96
97#endif /* TOPPERS_MACRO_ONLY */
98
99#ifndef TOPPERS_MACRO_ONLY
100/*
101 * ƒRƒ“ƒeƒLƒXƒg‚ÌŽQÆ
102 *
103 */
104#pragma inline
105bool_t
106sense_context(void)
107{
108 /*
109 * PSP‚ª—LŒø‚È‚çƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgCMSP‚ª—LŒø‚È‚ç”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg
110 * ‚Æ‚·‚éD
111 */
112 if ((get_control() & CONTROL_PSP) == CONTROL_PSP){
113 return false;
114 }
115 else {
116 return true;
117 }
118}
119
120#endif /* TOPPERS_MACRO_ONLY */
121
122/*
123 * TOPPERS•W€Š„ž‚ݏˆ—ƒ‚ƒfƒ‹‚ÌŽÀŒ»
124 *
125 * Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚Æ‚µ‚ẮCBASEPRI‚ð—p‚¢‚éD‘SŠ„ž‚Ý‚ð‹ÖŽ~‚·‚é
126 * ‹@”\‚Æ‚µ‚āCFAULTMASK‚âPRIMASK‚ª‚ ‚邪CƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚Ý‚ð
127 * ƒTƒ|[ƒg‚·‚邽‚߁C‚±‚ê‚ç‚ÍCPUƒƒbƒN‚Ì‚½‚ß‚É—p‚¢‚È‚¢D
128 * ‚»‚Ì‚½‚߁CBASEPRI‚ð—p‚¢‚Ä‹[Ž—“I‚ÉCPUƒƒbƒNƒtƒ‰ƒO‚ðŽÀŒ»‚·‚éD
129 *
130 * ‚Ü‚¸CCPUƒƒbƒNó‘Ô‚ðŠÇ—‚·‚½‚߂̕ϐ”(lock_flag)‚ð—pˆÓ‚·‚éD
131 *
132 * CPUƒƒbƒNƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚éŠÔ‚́CBASEPRI‚ðƒ‚ƒfƒ‹ã‚ÌŠ„ž‚Ý
133 * —Dæ“xƒ}ƒXƒN‚Ì’l‚ɐݒ肷‚éD‚±‚̊Ԃ́Cƒ‚ƒfƒ‹ã‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒX
134 * ƒN‚́CBASEPRI‚ð—p‚¢‚éD
135 *
136 * ‚»‚ê‚ɑ΂µ‚ÄCPUƒƒbƒNƒtƒ‰ƒO‚ªƒZƒbƒg‚³‚ê‚¢‚éŠÔ‚́CBASEPRI‚ðCƒJ[ƒl
137 * ƒ‹ŠÇ—ŠO‚Ì‚à‚Ì‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý—v‹‚ðƒ}ƒXƒN‚·‚é’l(TIPM_LOCK)‚ƁC
138 * ƒ‚ƒfƒ‹ã‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ƃ̍‚‚¢•û‚ɐݒ肷‚éD‚±‚̊Ԃ̃‚ƒfƒ‹ã
139 * ‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚́C‚»‚Ì‚½‚߂̕ϐ”(saved_iipm, “à•”•\Œ»‚Å•ÛŽ)
140 * ‚ð—pˆÓ‚µ‚Ä•ÛŽ‚·‚éD
141 */
142
143/*
144 * Š„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÌŠO•”•\Œ»‚Æ“à•”•\Œ»‚Ì•ÏŠ·
145 *
146 * ƒAƒZƒ“ƒuƒŠŒ¾Œê‚̃\[ƒXƒtƒ@ƒCƒ‹‚©‚çƒCƒ“ƒNƒ‹[ƒh‚·‚éê‡‚Ì‚½‚߂ɁC
147 * CAST‚ðŽg—p
148 * Š„ž‚Ý—Dæ“x‚̃rƒbƒg•(TBITW_IPRI)‚ª 8 ‚̏ꍇ‚́C“à•”—Dæ“x 255
149 * ‚́CŠO•”—Dæ“x -1 ‚ɑΉž‚·‚éD
150 */
151#define EXT_IPM(iipm) (CAST(PRI,((iipm >> (8 - TBITW_IPRI)) - (1 << TBITW_IPRI)))) /* “à•”•\Œ»‚ðŠO•”•\Œ»‚É */
152#define INT_IPM(ipm) (((1 << TBITW_IPRI) - CAST(uint8_t, -(ipm))) << (8 - TBITW_IPRI)) /* ŠO•”•\Œ»‚ð“à•”•\Œ»‚É */
153
154/*
155 * CPUƒƒbƒNó‘Ô‚Å‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN
156 */
157#define TIPM_LOCK TMIN_INTPRI
158
159/*
160 * CPUƒƒbƒNó‘Ô‚Å‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚Ì“à•”•\Œ»
161 *
162 * TIPM_LOCK‚́CCPUƒƒbƒNó‘Ô‚Å‚ÌBASEPRI‚Ì’lDƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì‚à‚Ì‚ð
163 * œ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒXƒN‚·‚é’l‚É’è‹`‚·‚éD
164 */
165#define IIPM_LOCK INT_IPM(TIPM_LOCK)
166
167/*
168 * TIPM_ENAALLiŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœj‚Ì“à•”•\Œ»
169 *
170 * BASEPRI‚É '0' ‚ðÝ’è‚·‚邱‚ƂŁC‘SŠ„ž‚Ý‚ð‹–‰Â‚·‚éD
171 */
172#define IIPM_ENAALL (0)
173
174#define _kernel_vector_table __vector_table
175
176#ifndef TOPPERS_MACRO_ONLY
177
178/*
179 * CPUƒƒbƒNƒtƒ‰ƒOŽÀŒ»‚Ì‚½‚߂̕ϐ”
180 *
181 * ‚±‚ê‚ç‚̕ϐ”‚́CCPUƒƒbƒNó‘Ô‚ÌŽž‚̂ݏ‘‚«Š·‚¦‚Ä‚à‚æ‚¢‚Æ‚·‚éD
182 * ƒCƒ“ƒ‰ƒCƒ“ŠÖ”’†‚ŁCƒAƒNƒZƒX‚̏‡˜‚ª•Ï‰»‚µ‚È‚¢‚悤Cvolatile ‚ðŽw’èD
183 */
184extern volatile bool_t lock_flag; /* CPUƒƒbƒNƒtƒ‰ƒO‚Ì’l‚ð•ÛŽ‚·‚é•Ï” */
185extern volatile uint32_t saved_iipm; /* Š„ž‚Ý—Dæ“x‚ðƒ}ƒXƒN‚·‚é•Ï” */
186
187/*
188 * CPUƒƒbƒNó‘Ԃւ̈ڍs
189 *
190 * BASEPRIiƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒNj‚ðCsaved_iipm‚É•Û‘¶‚µC
191 * ƒJ[ƒlƒ‹ŠÇ—ŠO‚Ì‚à‚Ì‚ðœ‚­‚·‚ׂĂ̊„ž‚Ý‚ðƒ}ƒXƒN‚·‚é’liTIPM_LOCKj
192 * ‚ɐݒ肷‚éD‚Ü‚½Clock_flag‚ðtrue‚É‚·‚éD
193 *
194 * BASEPRI‚ªCÅ‰‚©‚çTIPM_LOCK‚Æ“¯‚¶‚©‚»‚ê‚æ‚荂‚¢ê‡‚ɂ́C‚»‚ê‚ð
195 * saved_iipm‚É•Û‘¶‚·‚é‚݂̂ŁCTIPM_LOCK‚ɂ͐ݒ肵‚È‚¢D‚±‚ê‚́Cƒ‚ƒfƒ‹
196 * ã‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ªCTIPM_LOCK‚Æ“¯‚¶‚©‚»‚ê‚æ‚荂‚¢ƒŒƒxƒ‹‚ɐݒè
197 * ‚³‚ê‚Ä‚¢‚éó‘Ô‚É‚ ‚½‚éD
198 *
199 * ‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԁilock_flag‚ªtrue‚̏ó‘ԁj‚ŌĂ΂ê‚邱‚Æ‚Í
200 * ‚È‚¢‚à‚Ì‚Æ‘z’肵‚Ä‚¢‚éD
201 */
202#pragma inline
203void
204x_lock_cpu(void)
205{
206 uint32_t iipm;
207
208 /*
209 * current_iipm()‚Ì•Ô‚è’l‚𒼐Úsaved_iipm‚É•Û‘¶‚¹‚¸CˆêŽž•Ï”iipm
210 * ‚ð—p‚¢‚Ä‚¢‚é‚̂́Ccurrent_iipm()‚ðŒÄ‚ñ‚¾’¼Œã‚ÉŠ„ž‚Ý‚ª”­¶‚µC
211 * ‹N“®‚³‚ꂽŠ„ž‚ݏˆ—‚Åsaved_iipm‚ª•ÏX‚³‚ê‚é‰Â”\«‚ª‚ ‚邽‚ß‚Å
212 * ‚ ‚éD
213 */
214 iipm = get_basepri();
215 if ((IIPM_LOCK < iipm) || (IIPM_ENAALL == iipm)) {
216 set_basepri(IIPM_LOCK);
217 }
218 saved_iipm = iipm;
219 lock_flag = true;
220 /* ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚Ì‘OŒã‚сƒ‚ƒŠ‚ª‘‚«Š·‚í‚é‰Â”\«‚ª‚ ‚é */
221 Asm("":::"memory");
222}
223
224#define t_lock_cpu() x_lock_cpu()
225#define i_lock_cpu() x_lock_cpu()
226
227/*
228 * CPUƒƒbƒNó‘Ԃ̉ðœ
229 *
230 * lock_flag‚ðfalse‚É‚µCIPMiƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒNj‚ðC
231 * saved_iipm‚É•Û‘¶‚µ‚½’l‚É–ß‚·D
232 *
233 * ‚±‚̊֐”‚́CCPUƒƒbƒNó‘ԁilock_flag‚ªtrue‚̏ó‘ԁj‚ł̂݌Ă΂ê‚é‚à
234 * ‚Ì‚Æ‘z’肵‚Ä‚¢‚éD
235 */
236#pragma inline
237void
238x_unlock_cpu(void)
239{
240 /* ƒNƒŠƒeƒBƒJƒ‹ƒZƒNƒVƒ‡ƒ“‚Ì‘OŒã‚сƒ‚ƒŠ‚ª‘‚«Š·‚í‚é‰Â”\«‚ª‚ ‚é */
241 Asm("":::"memory");
242 lock_flag = false;
243 set_basepri(saved_iipm);
244}
245
246#define t_unlock_cpu() x_unlock_cpu()
247#define i_unlock_cpu() x_unlock_cpu()
248
249/*
250 * CPUƒƒbƒNó‘Ô‚ÌŽQÆ
251 */
252#pragma inline
253bool_t
254x_sense_lock(void)
255{
256 return(lock_flag);
257}
258
259#define t_sense_lock() x_sense_lock()
260#define i_sense_lock() x_sense_lock()
261
262/*
263 * chg_ipm‚Å—LŒø‚ÈŠ„ž‚Ý—Dæ“x‚͈̔͂̔»’è
264 *
265 * TMIN_INTPRI‚Ì’l‚É‚æ‚炸Cchg_ipm‚ł́C-(1 << TBITW_IPRI)`TIPM_ENAALLi0j
266 * ‚͈̔͂ɐݒè‚Å‚«‚邱‚Æ‚Æ‚·‚éiƒ^[ƒQƒbƒg’è‹`‚ÌŠg’£jD
267 * Š„ž‚Ý—Dæ“x‚̃rƒbƒg•(TBITW_IPRI)‚ª 8 ‚̏ꍇ‚́C-256 ` 0 ‚ªŽw’è‰Â”\‚Å‚ ‚éD
268 *
269 */
270#define VALID_INTPRI_CHGIPM(intpri) \
271 ((-((1 << TBITW_IPRI) - 1) <= (intpri) && (intpri) <= TIPM_ENAALL))
272
273/*
274 * iƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚̐ݒè
275 *
276 * CPUƒƒbƒNƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚鎞‚́Cƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}
277 * ƒXƒN‚ðÝ’è‚·‚éDCPUƒƒbƒNƒtƒ‰ƒO‚ªƒZƒbƒg‚³‚ê‚Ä‚¢‚鎞‚́Csaved_iipm
278 * ‚ðÝ’肵C‚³‚ç‚ɁCƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ðCÝ’肵‚悤‚Æ
279 * ‚µ‚½iƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÆTIPM_LOCK‚̍‚‚¢•û‚ɐݒ肷‚éD
280 */
281#pragma inline
282void
283x_set_ipm(PRI intpri)
284{
285 uint8_t iipm = INT_IPM(intpri);
286
287 if (intpri == TIPM_ENAALL){
288 iipm = IIPM_ENAALL;
289 }
290
291 if (!lock_flag) {
292 set_basepri(iipm);
293 }
294 else {
295 saved_iipm = iipm;
296 set_basepri(iipm < IIPM_LOCK ? iipm : IIPM_LOCK);
297 }
298}
299
300#define t_set_ipm(intpri) x_set_ipm(intpri)
301#define i_set_ipm(intpri) x_set_ipm(intpri)
302
303/*
304 * iƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‚ÌŽQÆ
305 *
306 * CPUƒƒbƒNƒtƒ‰ƒO‚ªƒNƒŠƒA‚³‚ê‚Ä‚¢‚鎞‚̓n[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}
307 * ƒXƒN‚ðCƒZƒbƒg‚³‚ê‚Ä‚¢‚鎞‚Ísaved_iipm‚ðŽQÆ‚·‚éD
308 */
309#pragma inline
310PRI
311x_get_ipm(void)
312{
313 uint8_t iipm;
314
315 if (!lock_flag) {
316 iipm = get_basepri();
317 }
318 else {
319 iipm = saved_iipm;
320 }
321
322 if (iipm == IIPM_ENAALL) {
323 return(TIPM_ENAALL);
324 }
325 else {
326 return(EXT_IPM(iipm));
327 }
328}
329
330#define t_get_ipm() x_get_ipm()
331#define i_get_ipm() x_get_ipm()
332
333/*
334 * SVCƒnƒ“ƒhƒ‰iprc_support.Sj
335 */
336extern void svc_handler(void);
337
338/*
339 * ƒXƒ^[ƒgƒAƒbƒvƒ‹[ƒ`ƒ“istart.Sj
340 */
341extern void _start(void);
342
343/*
344 * Å‚—Dæ‡ˆÊƒ^ƒXƒN‚ւ̃fƒBƒXƒpƒbƒ`iprc_support.Sj
345 *
346 * dispatch‚́Cƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚©‚çŒÄ‚яo‚³‚ꂽƒT[ƒrƒXƒR[ƒ‹ˆ—‚©
347 * ‚çŒÄ‚яo‚·‚ׂ«‚à‚̂ŁCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒgECPUƒƒbƒNó‘ԁEƒfƒBƒXƒpƒb
348 * ƒ`‹–‰Âó‘ԁEiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘ԂŌĂяo‚³‚È
349 * ‚¯‚ê‚΂Ȃç‚È‚¢D
350 */
351extern void dispatch(void);
352
353/*
354 * ƒfƒBƒXƒpƒbƒ`ƒƒ‚Ì“®ìŠJŽniprc_support.Sj
355 *
356 * start_dispatch‚́CƒJ[ƒlƒ‹‹N“®Žž‚ɌĂяo‚·‚ׂ«‚à‚̂ŁC‚·‚ׂĂ̊„ž
357 * ‚Ý‚ð‹ÖŽ~‚µ‚½ó‘ԁiŠ„ž‚݃ƒbƒNó‘Ô‚Æ“¯“™‚̏ó‘ԁj‚ŌĂяo‚³‚È‚¯‚ê‚Î
358 * ‚È‚ç‚È‚¢D
359 */
360extern NoReturn void start_dispatch(void);
361
362/*
363 * Œ»Ý‚̃Rƒ“ƒeƒLƒXƒg‚ðŽÌ‚ĂăfƒBƒXƒpƒbƒ`iprc_support.Sj
364 *
365 * exit_and_dispatch‚́Cext_tsk‚©‚çŒÄ‚яo‚·‚ׂ«‚à‚̂ŁCƒ^ƒXƒNƒRƒ“ƒeƒL
366 * ƒXƒgECPUƒƒbƒNó‘ԁEƒfƒBƒXƒpƒbƒ`‹–‰Âó‘ԁEiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ
367 * “xƒ}ƒXƒN‘S‰ðœó‘ԂŌĂяo‚³‚È‚¯‚ê‚΂Ȃç‚È‚¢D
368 */
369extern NoReturn void exit_and_dispatch(void);
370
371/*
372 * ƒJ[ƒlƒ‹‚̏I—¹ˆ—‚̌ďo‚µiprc_support.Sj
373 *
374 * call_exit_kernel‚́CƒJ[ƒlƒ‹‚̏I—¹Žž‚ɌĂяo‚·‚ׂ«‚à‚̂ŁC”ñƒ^ƒXƒN
375 * ƒRƒ“ƒeƒLƒXƒg‚ɐ؂芷‚¦‚āCƒJ[ƒlƒ‹‚̏I—¹ˆ—iexit_kernelj‚ðŒÄ‚яo
376 * ‚·D
377 */
378extern NoReturn void call_exit_kernel(void);
379
380/*
381 * ƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚̏‰Šú‰»
382 *
383 * ƒ^ƒXƒN‚ª‹xŽ~ó‘Ô‚©‚çŽÀs‚Å‚«‚éó‘ԂɈڍs‚·‚鎞‚ɌĂ΂ê‚éD‚±‚ÌŽž“_
384 * ‚ŃXƒ^ƒbƒN—̈æ‚ðŽg‚Á‚Ä‚Í‚È‚ç‚È‚¢D
385 *
386 * activate_context‚ðCƒCƒ“ƒ‰ƒCƒ“ŠÖ”‚Å‚Í‚È‚­ƒ}ƒNƒ’è‹`‚Æ‚µ‚Ä‚¢‚é‚̂́C
387 * ‚±‚ÌŽž“_‚Å‚ÍTCB‚ª’è‹`‚³‚ê‚Ä‚¢‚È‚¢‚½‚ß‚Å‚ ‚éD
388 */
389extern void start_r(void);
390
391#define activate_context(p_tcb) \
392{ \
393 (p_tcb)->tskctxb.sp = (void *)((char_t *)((p_tcb)->p_tinib->stk) \
394 + (p_tcb)->p_tinib->stksz); \
395 (p_tcb)->tskctxb.pc = (FP) start_r; \
396}
397
398/*
399 * calltex‚ÍŽg—p‚µ‚È‚¢
400 */
401#define OMIT_CALLTEX
402
403/*
404 * Š„ž‚ݔԍ†EŠ„ž‚݃nƒ“ƒhƒ‰”ԍ†
405 *
406 * Š„ž‚݃nƒ“ƒhƒ‰”ԍ†(inhno)‚ÆŠ„ž‚ݔԍ†(intno)‚́CŠ„‚荞‚Ý”­¶Žž‚É
407 * EPSR‚ɐݒ肳‚ê‚é—áŠO”ԍ†‚Æ‚·‚éD
408 */
409
410/*
411 * Š„ž‚ݔԍ†‚͈̔͂̔»’è
412 */
413#define VALID_INTNO(intno) ((TMIN_INTNO <= (intno)) && ((intno) <= TMAX_INTNO))
414#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
415#define VALID_INTNO_CFGINT(intno) VALID_INTNO(intno)
416
417/*
418 * Š„ž‚݃nƒ“ƒhƒ‰‚̐ݒè
419 *
420 * ƒxƒNƒgƒ‹”ԍ†inhno‚ÌŠ„ž‚݃nƒ“ƒhƒ‰‚Ì‹N“®”Ô’nint_entry‚ɐݒ肷‚éDŠ„ž‚Ý
421 * ƒnƒ“ƒhƒ‰ƒe[ƒuƒ‹
422 */
423#pragma inline
424void
425x_define_inh(INHNO inhno, FP int_entry)
426{
427
428}
429
430/*
431 * Š„ž‚݃nƒ“ƒhƒ‰‚̏o“üŒûˆ—‚̐¶¬ƒ}ƒNƒ
432 *
433 */
434#define INT_ENTRY(inhno, inthdr) inthdr
435#define INTHDR_ENTRY(inhno, inhno_num, inthdr) extern void inthdr(void);
436
437/*
438 * Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO
439 */
440
441/*
442 * Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚é‚©‚ð”»•Ê‚·‚邽‚߂̕ϐ”ikernel_cfg.cj
443 */
444extern const uint32_t bitpat_cfgint[];
445
446/*
447 * Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚̃Zƒbƒg
448 *
449 * Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚ÄŠ„ž‚Ý—v‹‹ÖŽ~
450 * ƒtƒ‰ƒO‚ðƒNƒŠƒA‚µ‚悤‚Æ‚µ‚½ê‡‚ɂ́Cfalse‚ð•Ô‚·D
451 */
452#pragma inline
453bool_t
454x_disable_int(INTNO intno)
455{
456 uint32_t tmp;
457
458 /*
459 * Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢ê‡
460 */
461 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
462 return(false);
463 }
464
465 if (intno == IRQNO_SYSTICK) {
466 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
467 tmp &= ~SYSTIC_TICINT;
468 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
469 }else {
470 tmp = intno - 16;
471 sil_wrw_mem((void *)((uint32_t *)NVIC_CLRENA0 + (tmp >> 5)),
472 (1 << (tmp & 0x1f)));
473 }
474
475 return(true);
476}
477
478#define t_disable_int(intno) x_disable_int(intno)
479#define i_disable_int(intno) x_disable_int(intno)
480
481/*
482 * Š„ž‚Ý—v‹‹ÖŽ~ƒtƒ‰ƒO‚̉ðœ
483 *
484 * Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚ɑ΂µ‚ÄŠ„ž‚Ý—v‹‹ÖŽ~
485 * ƒtƒ‰ƒO‚ðƒNƒŠƒA‚µ‚悤‚Æ‚µ‚½ê‡‚ɂ́Cfalse‚ð•Ô‚·D
486 */
487#pragma inline
488bool_t
489x_enable_int(INTNO intno)
490{
491 uint32_t tmp;
492
493 /*
494 * Š„ž‚Ý‘®«‚ªÝ’肳‚ê‚Ä‚¢‚È‚¢ê‡
495 */
496 if ((bitpat_cfgint[intno >> 5] & (1 << (intno & 0x1f))) == 0x00) {
497 return(false);
498 }
499
500 if (intno == IRQNO_SYSTICK) {
501 tmp = sil_rew_mem((void *)SYSTIC_CONTROL_STATUS);
502 tmp |= SYSTIC_TICINT;
503 sil_wrw_mem((void *)SYSTIC_CONTROL_STATUS, tmp);
504 }else {
505 tmp = intno - 16;
506 sil_wrw_mem((void *)((uint32_t *)NVIC_SETENA0 + (tmp >> 5)),
507 (1 << (tmp & 0x1f)));
508 }
509
510 return(true);
511}
512
513#define t_enable_int(intno) x_enable_int(intno)
514#define i_enable_int(intno) x_enable_int(intno)
515
516/*
517 * Š„ž‚Ý—v‹ƒ‰ƒCƒ“‚Ì‘®«‚̐ݒè
518 */
519extern void x_config_int(INTNO intno, ATR intatr, PRI intpri);
520
521/*
522 * Š„ž‚݃nƒ“ƒhƒ‰“üŒû‚Å•K—v‚ÈIRC‘€ì
523 */
524#pragma inline
525void
526i_begin_int(INTNO intno)
527{
528}
529
530/*
531 * Š„ž‚݃nƒ“ƒhƒ‰‚̏oŒû‚Å•K—v‚ÈIRC‘€ì
532 */
533#pragma inline
534void
535i_end_int(INTNO intno)
536{
537}
538
539/*
540 * CPU—áŠOƒnƒ“ƒhƒ‰ŠÖŒW
541 */
542
543/*
544 * CPU—áŠOƒnƒ“ƒhƒ‰”ԍ†
545 */
546#define VALID_EXCNO_DEFEXC(excno) (TMIN_EXCNO <= (excno) && (excno) <= TMAX_EXCNO)
547
548/*
549 * CPU—áŠOƒnƒ“ƒhƒ‰‚Ì‹–‰Â
550 */
551extern void enable_exc(EXCNO excno);
552
553/*
554 * CPU—áŠOƒnƒ“ƒhƒ‰‚Ì‹ÖŽ~
555 */
556extern void disable_exc(EXCNO excno);
557
558/*
559 * CPU—áŠOƒnƒ“ƒhƒ‰‚̐ݒè
560 */
561#pragma inline
562void
563x_define_exc(EXCNO excno, FP exc_entry)
564{
565 /*
566 * ˆê•”‚Ì—áŠO‚Í‹–‰Â‚ðs‚¤•K—v‚ª‚ ‚é
567 */
568 enable_exc(excno);
569}
570
571/*
572 * CPU—áŠOƒnƒ“ƒhƒ‰‚Ì“üŒûˆ—‚̐¶¬ƒ}ƒNƒ
573 */
574#define EXC_ENTRY(excno, exchdr) exchdr
575#define EXCHDR_ENTRY(excno, excno_num, exchdr) extern void exchdr(void *p_excinf);
576
577/*
578 * CPU—áŠO‚Ì”­¶‚µ‚½Žž‚̃Rƒ“ƒeƒLƒXƒg‚ÌŽQÆ
579 *
580 * CPU—áŠO‚Ì”­¶‚µ‚½Žž‚̃Rƒ“ƒeƒLƒXƒg‚ªCƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg‚ÌŽž‚ÉfalseC
581 * ‚»‚¤‚Å‚È‚¢Žž‚Étrue‚ð•Ô‚·D
582 */
583#pragma inline
584bool_t
585exc_sense_context(void *p_excinf)
586{
587 uint32_t exc_return;
588
589 exc_return = *((uint32_t *)p_excinf + P_EXCINF_OFFSET_EXC_RETURN);
590 if ((exc_return & EXC_RETURN_PSP) == EXC_RETURN_PSP){
591 return false;
592 }
593 else {
594 return true;
595 }
596}
597
598/*
599 * CPU—áŠO‚Ì”­¶‚µ‚½Žž‚ÌIPMiƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒNC“à•”•\
600 * Œ»j‚ÌŽQÆ
601 */
602#pragma inline
603uint32_t
604exc_get_iipm(void *p_excinf)
605{
606 return(*((uint32_t *)p_excinf + P_EXCINF_OFFSET_BASEPRI));
607}
608
609/*
610 * CPU—áŠO‚Ì”­¶‚µ‚½Žž‚̃Rƒ“ƒeƒLƒXƒg‚ÆŠ„ž‚݂̃}ƒXƒNó‘Ô‚ÌŽQÆ
611 *
612 * CPU—áŠO‚Ì”­¶‚µ‚½Žž‚̃VƒXƒeƒ€ó‘Ô‚ªCƒJ[ƒlƒ‹ŽÀs’†‚Å‚È‚­Cƒ^ƒXƒNƒR
613 * ƒ“ƒeƒLƒXƒg‚Å‚ ‚èCŠ„ž‚݃ƒbƒNó‘Ô‚Å‚È‚­CCPUƒƒbƒNó‘Ô‚Å‚È‚­Ciƒ‚
614 * ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚Å‚ ‚鎞‚ÉtrueC‚»‚¤‚Å‚È‚¢Žž
615 * ‚Éfalse‚ð•Ô‚·iCPU—áŠO‚ªƒJ[ƒlƒ‹ŠÇ—ŠO‚ÌŠ„ž‚ݏˆ—’†‚Å”­¶‚µ‚½ê‡
616 * ‚É‚àfalse‚ð•Ô‚·jD
617 *
618 * PU—áŠO‚Ì”­¶‚µ‚½Žž‚ÌBASEPRIiƒn[ƒhƒEƒFƒA‚ÌŠ„ž‚Ý—Dæ“xƒ}ƒXƒNj
619 * ‚ª‚·‚ׂĂ̊„ž‚Ý‚ð‹–‰Â‚·‚éó‘Ô‚Å‚ ‚邱‚Æ‚ðƒ`ƒFƒbƒN‚·‚邱‚ƂŁCƒJ[
620 * ƒlƒ‹ŽÀs’†‚Å‚È‚¢‚±‚ƁCŠ„ž‚݃ƒbƒNó‘Ô‚Å‚È‚¢‚±‚ƁCCPUƒƒbƒNó‘Ô‚Å‚È
621 * ‚¢‚±‚ƁCiƒ‚ƒfƒ‹ã‚́jŠ„ž‚Ý—Dæ“xƒ}ƒXƒN‘S‰ðœó‘Ô‚Å‚ ‚邱‚Æ‚Ì4‚‚Ì
622 * ðŒ‚ðƒ`ƒFƒbƒN‚·‚邱‚Æ‚ª‚Å‚«‚éiCPU—áŠO‚ª”­¶‚µ‚½Žž‚Ìlock_flag‚ðŽQ
623 * Æ‚·‚é•K—v‚Í‚È‚¢jD
624 */
625#pragma inline
626bool_t
627exc_sense_intmask(void *p_excinf)
628{
629 return(!exc_sense_context(p_excinf)
630 && (exc_get_iipm(p_excinf) == IIPM_ENAALL));
631}
632
633/*
634 * CPU—áŠOƒGƒ“ƒgƒŠiprc_support.Sj
635 */
636extern void core_exc_entry(void);
637
638/*
639 * Š„ž‚݃Gƒ“ƒgƒŠiprc_support.Sj
640 */
641extern void core_int_entry(void);
642
643/*
644 * ƒvƒƒZƒbƒTˆË‘¶‚̏‰Šú‰»
645 */
646extern void core_initialize(void);
647
648/*
649 * ƒvƒƒZƒbƒTˆË‘¶‚̏I—¹Žžˆ—
650 */
651extern void core_terminate(void);
652
653/*
654 * “o˜^‚³‚ê‚Ä‚¢‚È‚¢—áŠO‚ª”­¶‚·‚é‚ƌĂяo‚³‚ê‚é
655 */
656extern void default_exc_handler(void *p_excinf);
657
658/*
659 * –¢“o˜^‚ÌŠ„ž‚Ý‚ª”­¶‚µ‚½ê‡‚ɌĂяo‚³‚ê‚é
660 */
661extern void default_int_handler(void *p_excinf);
662
663#endif /* TOPPERS_MACRO_ONLY */
664#endif /* TOPPERS_PRC_CONFIG_H */
Note: See TracBrowser for help on using the repository browser.