source: asp_ewarm/asp-1.7.0/extension/dcre/kernel/alarm.c@ 61

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

ASP for EWARM のコミット.

File size: 10.3 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-2010 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì(1)`(4)‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
12 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü
13 * •ÏEÄ”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
14 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ì
15 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[
16 * ƒXƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
17 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
18 * —p‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
19ƒƒ“ƒgi—˜—p
20 * ŽÒƒ}ƒjƒ…
21ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L
22 * ‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
23 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg
24 * —p‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±
25 * ‚ƁD
26 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
27ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
28ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜
29 * ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
30 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É
31 * •ñ‚·‚邱‚ƁD
32 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹
33 * ŠQ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
34 * ‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝
35 * —R‚ÉŠî‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð
36 * –Ɛӂ·‚邱‚ƁD
37 *
38 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨
39 * ‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I
40 * ‚ɑ΂·‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒF
41 * ƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»
42 * ‚̐ӔC‚𕉂í‚È‚¢D
43 *
44 * @(#) $Id: alarm.c 1966 2010-11-20 07:23:56Z ertl-hiro $
45 */
46
47/*
48 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "alarm.h"
54
55/*
56 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
57 */
58#ifndef LOG_ALM_ENTER
59#define LOG_ALM_ENTER(p_almcb)
60#endif /* LOG_ALM_ENTER */
61
62#ifndef LOG_ALM_LEAVE
63#define LOG_ALM_LEAVE(p_almcb)
64#endif /* LOG_ALM_LEAVE */
65
66#ifndef LOG_ACRE_ALM_ENTER
67#define LOG_ACRE_ALM_ENTER(pk_calm)
68#endif /* LOG_ACRE_ALM_ENTER */
69
70#ifndef LOG_ACRE_ALM_LEAVE
71#define LOG_ACRE_ALM_LEAVE(ercd)
72#endif /* LOG_ACRE_ALM_LEAVE */
73
74#ifndef LOG_DEL_ALM_ENTER
75#define LOG_DEL_ALM_ENTER(almid)
76#endif /* LOG_DEL_ALM_ENTER */
77
78#ifndef LOG_DEL_ALM_LEAVE
79#define LOG_DEL_ALM_LEAVE(ercd)
80#endif /* LOG_DEL_ALM_LEAVE */
81
82#ifndef LOG_STA_ALM_ENTER
83#define LOG_STA_ALM_ENTER(almid, almtim)
84#endif /* LOG_STA_ALM_ENTER */
85
86#ifndef LOG_STA_ALM_LEAVE
87#define LOG_STA_ALM_LEAVE(ercd)
88#endif /* LOG_STA_ALM_LEAVE */
89
90#ifndef LOG_ISTA_ALM_ENTER
91#define LOG_ISTA_ALM_ENTER(almid, almtim)
92#endif /* LOG_ISTA_ALM_ENTER */
93
94#ifndef LOG_ISTA_ALM_LEAVE
95#define LOG_ISTA_ALM_LEAVE(ercd)
96#endif /* LOG_ISTA_ALM_LEAVE */
97
98#ifndef LOG_STP_ALM_ENTER
99#define LOG_STP_ALM_ENTER(almid)
100#endif /* LOG_STP_ALM_ENTER */
101
102#ifndef LOG_STP_ALM_LEAVE
103#define LOG_STP_ALM_LEAVE(ercd)
104#endif /* LOG_STP_ALM_LEAVE */
105
106#ifndef LOG_ISTP_ALM_ENTER
107#define LOG_ISTP_ALM_ENTER(almid)
108#endif /* LOG_ISTP_ALM_ENTER */
109
110#ifndef LOG_ISTP_ALM_LEAVE
111#define LOG_ISTP_ALM_LEAVE(ercd)
112#endif /* LOG_ISTP_ALM_LEAVE */
113
114#ifndef LOG_REF_ALM_ENTER
115#define LOG_REF_ALM_ENTER(almid, pk_ralm)
116#endif /* LOG_REF_ALM_ENTER */
117
118#ifndef LOG_REF_ALM_LEAVE
119#define LOG_REF_ALM_LEAVE(ercd, pk_ralm)
120#endif /* LOG_REF_ALM_LEAVE */
121
122/*
123 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̐”
124 */
125#define tnum_alm ((uint_t)(tmax_almid - TMIN_ALMID + 1))
126#define tnum_salm ((uint_t)(tmax_salmid - TMIN_ALMID + 1))
127
128/*
129 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰ID‚©‚çƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰ŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½‚߂̃}ƒNƒ
130 */
131#define INDEX_ALM(almid) ((uint_t)((almid) - TMIN_ALMID))
132#define get_almcb(almid) (&(almcb_table[INDEX_ALM(almid)]))
133
134#ifdef TOPPERS_almini
135
136/*
137 * Žg—p‚µ‚Ä‚¢‚È‚¢ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰ŠÇ—ƒuƒƒbƒN‚̃ŠƒXƒg
138 *
139 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰ŠÇ—ƒuƒƒbƒN‚̐擪‚ɂ̓Lƒ…
140[‚ɂ‚Ȃ®‚½‚߂̗̈悪‚È
141 * ‚¢‚½‚߁Cƒ^ƒCƒ€ƒCƒxƒ“ƒgƒuƒƒbƒNitmevtbj‚̗̈æ‚ð—p‚¢‚éD
142 */
143QUEUE free_almcb;
144
145/*
146 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹@”\‚̏‰Šú‰»
147 */
148void
149initialize_alarm(void)
150{
151 uint_t i, j;
152 ALMCB *p_almcb;
153 ALMINIB *p_alminib;
154
155 for (p_almcb = almcb_table, i = 0; i < tnum_salm; p_almcb++, i++) {
156 p_almcb->p_alminib = &(alminib_table[i]);
157 p_almcb->almsta = false;
158 }
159 queue_initialize(&free_almcb);
160 for (j = 0; i < tnum_alm; p_almcb++, i++, j++) {
161 p_alminib = &(aalminib_table[j]);
162 p_alminib->almatr = TA_NOEXS;
163 p_almcb->p_alminib = ((const ALMINIB *) p_alminib);
164 queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb)));
165 }
166}
167
168#endif /* TOPPERS_almini */
169
170/*
171 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̐¶¬
172 */
173#ifdef TOPPERS_acre_alm
174
175ER_UINT
176acre_alm(const T_CALM *pk_calm)
177{
178 ALMCB *p_almcb;
179 ALMINIB *p_alminib;
180 ER ercd;
181
182 LOG_ACRE_ALM_ENTER(pk_calm);
183 CHECK_TSKCTX_UNL();
184 CHECK_RSATR(pk_calm->almatr, TA_NULL);
185 CHECK_ALIGN_FUNC(pk_calm->almhdr);
186 CHECK_NONNULL_FUNC(pk_calm->almhdr);
187
188 t_lock_cpu();
189 if (queue_empty(&free_almcb)) {
190 ercd = E_NOID;
191 }
192 else {
193 p_almcb = ((ALMCB *)(((char *) queue_delete_next(&free_almcb))
194 - offsetof(ALMCB, tmevtb)));
195 p_alminib = (ALMINIB *)(p_almcb->p_alminib);
196 p_alminib->almatr = pk_calm->almatr;
197 p_alminib->exinf = pk_calm->exinf;
198 p_alminib->almhdr = pk_calm->almhdr;
199
200 p_almcb->almsta = false;
201 ercd = ALMID(p_almcb);
202 }
203 t_unlock_cpu();
204
205 error_exit:
206 LOG_ACRE_ALM_LEAVE(ercd);
207 return(ercd);
208}
209
210#endif /* TOPPERS_acre_alm */
211
212/*
213 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̍폜
214 */
215#ifdef TOPPERS_del_alm
216
217ER
218del_alm(ID almid)
219{
220 ALMCB *p_almcb;
221 ALMINIB *p_alminib;
222 ER ercd;
223
224 LOG_DEL_ALM_ENTER(almid);
225 CHECK_TSKCTX_UNL();
226 CHECK_ALMID(almid);
227 p_almcb = get_almcb(almid);
228
229 t_lock_cpu();
230 if (p_almcb->p_alminib->almatr == TA_NOEXS) {
231 ercd = E_NOEXS;
232 }
233 else if (ALMID(p_almcb) > tmax_salmid) {
234 if (p_almcb->almsta) {
235 p_almcb->almsta = false;
236 tmevtb_dequeue(&(p_almcb->tmevtb));
237 }
238
239 p_alminib = (ALMINIB *)(p_almcb->p_alminib);
240 p_alminib->almatr = TA_NOEXS;
241 queue_insert_prev(&free_almcb, ((QUEUE *) &(p_almcb->tmevtb)));
242 ercd = E_OK;
243 }
244 else {
245 ercd = E_OBJ;
246 }
247 t_unlock_cpu();
248
249 error_exit:
250 LOG_DEL_ALM_LEAVE(ercd);
251 return(ercd);
252}
253
254#endif /* TOPPERS_del_alm */
255
256/*
257 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì“®ìŠJŽn
258 */
259#ifdef TOPPERS_sta_alm
260
261ER
262sta_alm(ID almid, RELTIM almtim)
263{
264 ALMCB *p_almcb;
265 ER ercd;
266
267 LOG_STA_ALM_ENTER(almid, almtim);
268 CHECK_TSKCTX_UNL();
269 CHECK_ALMID(almid);
270 CHECK_PAR(almtim <= TMAX_RELTIM);
271 p_almcb = get_almcb(almid);
272
273 t_lock_cpu();
274 if (p_almcb->p_alminib->almatr == TA_NOEXS) {
275 ercd = E_NOEXS;
276 }
277 else if (p_almcb->almsta) {
278 tmevtb_dequeue(&(p_almcb->tmevtb));
279 }
280 else {
281 p_almcb->almsta = true;
282 }
283 tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
284 (CBACK) call_almhdr, (void *) p_almcb);
285 ercd = E_OK;
286 t_unlock_cpu();
287
288 error_exit:
289 LOG_STA_ALM_LEAVE(ercd);
290 return(ercd);
291}
292
293#endif /* TOPPERS_sta_alm */
294
295/*
296 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì“®ìŠJŽni”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
297 */
298#ifdef TOPPERS_ista_alm
299
300ER
301ista_alm(ID almid, RELTIM almtim)
302{
303 ALMCB *p_almcb;
304 ER ercd;
305
306 LOG_ISTA_ALM_ENTER(almid, almtim);
307 CHECK_INTCTX_UNL();
308 CHECK_ALMID(almid);
309 CHECK_PAR(almtim <= TMAX_RELTIM);
310 p_almcb = get_almcb(almid);
311
312 i_lock_cpu();
313 if (p_almcb->p_alminib->almatr == TA_NOEXS) {
314 ercd = E_NOEXS;
315 }
316 else if (p_almcb->almsta) {
317 tmevtb_dequeue(&(p_almcb->tmevtb));
318 }
319 else {
320 p_almcb->almsta = true;
321 }
322 tmevtb_enqueue(&(p_almcb->tmevtb), almtim,
323 (CBACK) call_almhdr, (void *) p_almcb);
324 ercd = E_OK;
325 i_unlock_cpu();
326
327 error_exit:
328 LOG_ISTA_ALM_LEAVE(ercd);
329 return(ercd);
330}
331
332#endif /* TOPPERS_ista_alm */
333
334/*
335 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì“®ì’âŽ~
336 */
337#ifdef TOPPERS_stp_alm
338
339ER
340stp_alm(ID almid)
341{
342 ALMCB *p_almcb;
343 ER ercd;
344
345 LOG_STP_ALM_ENTER(almid);
346 CHECK_TSKCTX_UNL();
347 CHECK_ALMID(almid);
348 p_almcb = get_almcb(almid);
349
350 t_lock_cpu();
351 if (p_almcb->p_alminib->almatr == TA_NOEXS) {
352 ercd = E_NOEXS;
353 }
354 else if (p_almcb->almsta) {
355 p_almcb->almsta = false;
356 tmevtb_dequeue(&(p_almcb->tmevtb));
357 }
358 ercd = E_OK;
359 t_unlock_cpu();
360
361 error_exit:
362 LOG_STP_ALM_LEAVE(ercd);
363 return(ercd);
364}
365
366#endif /* TOPPERS_stp_alm */
367
368/*
369 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚Ì“®ì’âŽ~i”ñƒ^ƒXƒNƒRƒ“ƒeƒLƒXƒg—pj
370 */
371#ifdef TOPPERS_istp_alm
372
373ER
374istp_alm(ID almid)
375{
376 ALMCB *p_almcb;
377 ER ercd;
378
379 LOG_ISTP_ALM_ENTER(almid);
380 CHECK_INTCTX_UNL();
381 CHECK_ALMID(almid);
382 p_almcb = get_almcb(almid);
383
384 i_lock_cpu();
385 if (p_almcb->p_alminib->almatr == TA_NOEXS) {
386 ercd = E_NOEXS;
387 }
388 else if (p_almcb->almsta) {
389 p_almcb->almsta = false;
390 tmevtb_dequeue(&(p_almcb->tmevtb));
391 }
392 ercd = E_OK;
393 i_unlock_cpu();
394
395 error_exit:
396 LOG_ISTP_ALM_LEAVE(ercd);
397 return(ercd);
398}
399
400#endif /* TOPPERS_istp_alm */
401
402/*
403 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚̏ó‘ÔŽQÆ
404 */
405#ifdef TOPPERS_ref_alm
406
407ER
408ref_alm(ID almid, T_RALM *pk_ralm)
409{
410 ALMCB *p_almcb;
411 ER ercd;
412
413 LOG_REF_ALM_ENTER(almid, pk_ralm);
414 CHECK_TSKCTX_UNL();
415 CHECK_ALMID(almid);
416 p_almcb = get_almcb(almid);
417
418 t_lock_cpu();
419 if (p_almcb->p_alminib->almatr == TA_NOEXS) {
420 ercd = E_NOEXS;
421 }
422 else {
423 if (p_almcb->almsta) {
424 pk_ralm->almstat = TALM_STA;
425 pk_ralm->lefttim = tmevt_lefttim(&(p_almcb->tmevtb));
426 }
427 else {
428 pk_ralm->almstat = TALM_STP;
429 }
430 ercd = E_OK;
431 }
432 t_unlock_cpu();
433
434 error_exit:
435 LOG_REF_ALM_LEAVE(ercd, pk_ralm);
436 return(ercd);
437}
438
439#endif /* TOPPERS_ref_alm */
440
441/*
442 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‹N“®ƒ‹[ƒ`ƒ“
443 */
444#ifdef TOPPERS_almcal
445
446void
447call_almhdr(ALMCB *p_almcb)
448{
449 PRI saved_ipm;
450
451 /*
452 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ð’âŽ~ó‘Ô‚É‚·‚éD
453 */
454 p_almcb->almsta = false;
455
456 /*
457 * ƒAƒ‰[ƒ€ƒnƒ“ƒhƒ‰‚ðCCPUƒƒbƒN‰ðœó‘ԂŌĂяo‚·D
458 */
459 saved_ipm = i_get_ipm();
460 i_unlock_cpu();
461
462 LOG_ALM_ENTER(p_almcb);
463 (*((ALMHDR)(p_almcb->p_alminib->almhdr)))(p_almcb->p_alminib->exinf);
464 LOG_ALM_LEAVE(p_almcb);
465
466 if (!i_sense_lock()) {
467 i_lock_cpu();
468 }
469 i_set_ipm(saved_ipm);
470}
471
472#endif /* TOPPERS_almcal */
Note: See TracBrowser for help on using the repository browser.