source: uKadecot/trunk/ssp/extension/cyclic.c@ 101

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

TOPPERS/uKadecotのソースコードを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain
File size: 4.6 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2011 by Meika Sugimoto
6 *
7 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì (1)`(4) ‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
8 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü•ÏE
9 * Ä”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
10 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ìŒ 
11 * •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[ƒX
12 * ƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
13 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg—p
14 * ‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
15ƒƒ“ƒgi—˜—pŽÒƒ}
16 * ƒjƒ…
17ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•Û
18 * Ø‹K’è‚ðŒfÚ‚·‚邱‚ƁD
19 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg—p
20 * ‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±‚ƁD
21 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
22ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
23ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ì
24 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
25 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É•ñ
26 * ‚·‚邱‚ƁD
27 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹ŠQ
28 * ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD‚Ü‚½C
29 * –{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝—R‚ÉŠî‚Ã
30 * ‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
31 *
32 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨‚æ
33 * ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I‚ɑ΂·
34 * ‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p
35 * ‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»‚̐ӔC‚ð•‰
36 * ‚í‚È‚¢D
37 *
38 */
39
40/*
41 * ŽüŠúƒnƒ“ƒhƒ‰‹@”\
42 */
43
44#include "kernel_impl.h"
45#include "check.h"
46#include "time_event.h"
47#include "cyclic.h"
48
49/*
50 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
51 */
52#ifndef LOG_CYC_ENTER
53#define LOG_CYC_ENTER(cycidx)
54#endif /* LOG_CYC_ENTER */
55
56#ifndef LOG_CYC_LEAVE
57#define LOG_CYC_LEAVE(cycidx)
58#endif /* LOG_CYC_LEAVE */
59
60#ifndef LOG_STA_CYC_ENTER
61#define LOG_STA_CYC_ENTER(cycid)
62#endif /* LOG_STA_CYC_ENTER */
63
64#ifndef LOG_STA_CYC_LEAVE
65#define LOG_STA_CYC_LEAVE(ercd)
66#endif /* LOG_STA_CYC_LEAVE */
67
68#ifndef LOG_STP_CYC_ENTER
69#define LOG_STP_CYC_ENTER(cycid)
70#endif /* LOG_STP_CYC_ENTER */
71
72#ifndef LOG_STP_CYC_LEAVE
73#define LOG_STP_CYC_LEAVE(ercd)
74#endif /* LOG_STP_CYC_LEAVE */
75
76
77/* ŽüŠúƒnƒ“ƒhƒ‰ID‚ðƒ^ƒCƒ€ƒCƒxƒ“ƒgID‚É•ÏŠ· */
78#define CYC_EVTID(cycidx) ((ID)((cycidx) + cycevtid_offset))
79#define INDEX_CYC(cycid) ((uint_t)((cycid) - TMIN_CYCID))
80
81
82/* ŽüŠúƒnƒ“ƒhƒ‰‚Ì“®ìó‘Ô‚ð•\‚·ƒrƒbƒgƒ}ƒbƒv */
83#define CYCACT_BIT(index) (1U << (index))
84
85/*
86 * ŽüŠúƒnƒ“ƒhƒ‰‹N“®ƒ‹[ƒ`ƒ“
87 */
88void call_cychdr(uintptr_t cycidx);
89
90/*
91 * ŽüŠúƒnƒ“ƒhƒ‰‹@”\‚̏‰Šú‰»
92 */
93
94#ifdef TOPPERS_cycini
95
96void
97initialize_cyclic(void)
98{
99 uint_t i;
100
101 /* ŽüŠúƒnƒ“ƒhƒ‰‚̏ó‘Ԑݒè */
102 cyccb_cycact = cycinib_cycact;
103
104 for(i = 0U ; i < tnum_cyc ; i++) {
105 cyccb_evttim[i] = 0U;
106
107 /* ŽüŠúƒnƒ“ƒhƒ‰‚̏‰Šú‹N“® */
108 if((cycinib_cycact & CYCACT_BIT(i)) != 0U) {
109 time_event_enqueue(CYC_EVTID(i) ,
110 (EVTTIM)cycinib_cycphs[i] , call_cychdr , i);
111 cyccb_evttim[i] = cycinib_cycphs[i];
112 }
113 }
114}
115
116#endif /* TOPPERS_cycini */
117
118#ifdef TOPPERS_sta_cyc
119
120ER
121sta_cyc(ID cycid)
122{
123 ER ercd;
124 uint_t index = INDEX_CYC(cycid);
125 EVTTIM evttim;
126
127 LOG_STA_CYC_ENTER(cycid);
128 CHECK_TSKCTX_UNL();
129 CHECK_CYCID(cycid);
130
131 t_lock_cpu();
132
133 if((cyccb_cycact & CYCACT_BIT(index)) != 0U) {
134 time_event_dequeue(CYC_EVTID(index));
135 }
136 else {
137 cyccb_cycact |= CYCACT_BIT(index);
138 }
139
140 evttim = current_time + cycinib_cycphs[index];
141 time_event_enqueue(CYC_EVTID(index) ,
142 evttim , call_cychdr , index);
143 cyccb_evttim[index] = evttim;
144
145 ercd = E_OK;
146 t_unlock_cpu();
147
148 error_exit:
149 LOG_STA_CYC_LEAVE(ercd);
150 return ercd;
151}
152
153#endif /* TOPPERS_sta_cyc */
154
155
156#ifdef TOPPERS_stp_cyc
157
158ER
159stp_cyc(ID cycid)
160{
161 ER ercd;
162 uint_t index = INDEX_CYC(cycid);
163
164 LOG_STP_CYC_ENTER(cycid);
165 CHECK_TSKCTX_UNL();
166 CHECK_CYCID(cycid);
167
168 t_lock_cpu();
169
170 if((cyccb_cycact & CYCACT_BIT(index)) != 0U) {
171 cyccb_cycact &= ~CYCACT_BIT(index);
172 time_event_dequeue(CYC_EVTID(index));
173 }
174 ercd = E_OK;
175 t_unlock_cpu();
176
177 error_exit:
178 LOG_STA_CYC_LEAVE(ercd);
179 return ercd;
180}
181
182#endif /* TOPPERS_stp_cyc */
183
184#ifdef TOPPERS_cyccal
185
186void
187call_cychdr(uintptr_t cycidx)
188{
189 cyccb_evttim[cycidx] += cycinib_cyctim[cycidx];
190
191 /* ŽŸŽüŠú‚̃^ƒCƒ€ƒCƒxƒ“ƒg‚ð“o˜^ */
192 time_event_enqueue((ID)cycidx ,
193 cyccb_evttim[cycidx] , call_cychdr , cycidx);
194
195 i_unlock_cpu();
196
197 /* ŽüŠúƒnƒ“ƒhƒ‰‚ðŽÀs */
198 LOG_CYC_ENTER(cycidx);
199 (*cycinib_cychdr[cycidx])(cycinib_exinf[cycidx]);
200 LOG_CYC_LEAVE(cycidx);
201
202 if (!i_sense_lock()) {
203 i_lock_cpu();
204 }
205}
206
207#endif /* TOPPERS_cyccal */
Note: See TracBrowser for help on using the repository browser.