source: asp_ewarm/asp-1.7.0/kernel/mempfix.c@ 61

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

ASP for EWARM のコミット.

File size: 9.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-2008 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: mempfix.c 748 2008-03-07 17:18:06Z hiro $
45 */
46
47/*
48 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‹@”\
49 */
50
51#include "kernel_impl.h"
52#include "check.h"
53#include "task.h"
54#include "wait.h"
55#include "mempfix.h"
56
57/*
58 * ƒgƒŒ[ƒXƒƒOƒ}ƒNƒ‚̃fƒtƒHƒ‹ƒg’è‹`
59 */
60#ifndef LOG_GET_MPF_ENTER
61#define LOG_GET_MPF_ENTER(mpfid, p_blk)
62#endif /* LOG_GET_MPF_ENTER */
63
64#ifndef LOG_GET_MPF_LEAVE
65#define LOG_GET_MPF_LEAVE(ercd, blk)
66#endif /* LOG_GET_MPF_LEAVE */
67
68#ifndef LOG_PGET_MPF_ENTER
69#define LOG_PGET_MPF_ENTER(mpfid, p_blk)
70#endif /* LOG_PGET_MPF_ENTER */
71
72#ifndef LOG_PGET_MPF_LEAVE
73#define LOG_PGET_MPF_LEAVE(ercd, blk)
74#endif /* LOG_PGET_MPF_LEAVE */
75
76#ifndef LOG_TGET_MPF_ENTER
77#define LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout)
78#endif /* LOG_TGET_MPF_ENTER */
79
80#ifndef LOG_TGET_MPF_LEAVE
81#define LOG_TGET_MPF_LEAVE(ercd, blk)
82#endif /* LOG_TGET_MPF_LEAVE */
83
84#ifndef LOG_REL_MPF_ENTER
85#define LOG_REL_MPF_ENTER(mpfid, blk)
86#endif /* LOG_REL_MPF_ENTER */
87
88#ifndef LOG_REL_MPF_LEAVE
89#define LOG_REL_MPF_LEAVE(ercd)
90#endif /* LOG_REL_MPF_LEAVE */
91
92#ifndef LOG_INI_MPF_ENTER
93#define LOG_INI_MPF_ENTER(mpfid)
94#endif /* LOG_INI_MPF_ENTER */
95
96#ifndef LOG_INI_MPF_LEAVE
97#define LOG_INI_MPF_LEAVE(ercd)
98#endif /* LOG_INI_MPF_LEAVE */
99
100#ifndef LOG_REF_MPF_ENTER
101#define LOG_REF_MPF_ENTER(mpfid, pk_rmpf)
102#endif /* LOG_REF_MPF_ENTER */
103
104#ifndef LOG_REF_MPF_LEAVE
105#define LOG_REF_MPF_LEAVE(ercd, pk_rmpf)
106#endif /* LOG_REF_MPF_LEAVE */
107
108/*
109 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̐”
110 */
111#define tnum_mpf ((uint_t)(tmax_mpfid - TMIN_MPFID + 1))
112
113/*
114 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹ID‚©‚çŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹ŠÇ—ƒuƒƒbƒN‚ðŽæ‚èo‚·‚½
115 * ‚߂̃}ƒNƒ
116 */
117#define INDEX_MPF(mpfid) ((uint_t)((mpfid) - TMIN_MPFID))
118#define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)]))
119
120/*
121 * “ÁŽê‚ȃCƒ“ƒfƒbƒNƒX’l‚Ì’è‹`
122 */
123#define INDEX_NULL (~0U) /* ‹ó‚«ƒuƒƒbƒNƒŠƒXƒg‚̍Ōã */
124#define INDEX_ALLOC (~1U) /* Š„“–‚čς݂̃uƒƒbƒN */
125
126/*
127 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‹@”\‚̏‰Šú‰»
128 */
129#ifdef TOPPERS_mpfini
130
131void
132initialize_mempfix(void)
133{
134 uint_t i;
135 MPFCB *p_mpfcb;
136
137 for (p_mpfcb = mpfcb_table, i = 0; i < tnum_mpf; p_mpfcb++, i++) {
138 queue_initialize(&(p_mpfcb->wait_queue));
139 p_mpfcb->p_mpfinib = &(mpfinib_table[i]);
140 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
141 p_mpfcb->unused = 0U;
142 p_mpfcb->freelist = INDEX_NULL;
143 }
144}
145
146#endif /* TOPPERS_mpfini */
147
148/*
149 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚©‚çƒuƒƒbƒN‚ðŠl“¾
150 */
151#ifdef TOPPERS_mpfget
152
153void
154get_mpf_block(MPFCB *p_mpfcb, void **p_blk)
155{
156 uint_t blkidx;
157
158 if (p_mpfcb->freelist != INDEX_NULL) {
159 blkidx = p_mpfcb->freelist;
160 p_mpfcb->freelist = (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next;
161 }
162 else {
163 blkidx = p_mpfcb->unused;
164 p_mpfcb->unused++;
165 }
166 *p_blk = (void *)((char *)(p_mpfcb->p_mpfinib->mpf)
167 + p_mpfcb->p_mpfinib->blksz * blkidx);
168 p_mpfcb->fblkcnt--;
169 (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = INDEX_ALLOC;
170}
171
172#endif /* TOPPERS_mpfget */
173
174/*
175 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾
176 */
177#ifdef TOPPERS_get_mpf
178
179ER
180get_mpf(ID mpfid, void **p_blk)
181{
182 MPFCB *p_mpfcb;
183 WINFO_MPF winfo_mpf;
184 ER ercd;
185
186 LOG_GET_MPF_ENTER(mpfid, p_blk);
187 CHECK_DISPATCH();
188 CHECK_MPFID(mpfid);
189 p_mpfcb = get_mpfcb(mpfid);
190
191 t_lock_cpu();
192 if (p_mpfcb->fblkcnt > 0) {
193 get_mpf_block(p_mpfcb, p_blk);
194 ercd = E_OK;
195 }
196 else {
197 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
198 wobj_make_wait((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf);
199 dispatch();
200 ercd = winfo_mpf.winfo.wercd;
201 if (ercd == E_OK) {
202 *p_blk = winfo_mpf.blk;
203 }
204 }
205 t_unlock_cpu();
206
207 error_exit:
208 LOG_GET_MPF_LEAVE(ercd, *p_blk);
209 return(ercd);
210}
211
212#endif /* TOPPERS_get_mpf */
213
214/*
215 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾iƒ|[ƒŠƒ“ƒOj
216 */
217#ifdef TOPPERS_pget_mpf
218
219ER
220pget_mpf(ID mpfid, void **p_blk)
221{
222 MPFCB *p_mpfcb;
223 ER ercd;
224
225 LOG_PGET_MPF_ENTER(mpfid, p_blk);
226 CHECK_TSKCTX_UNL();
227 CHECK_MPFID(mpfid);
228 p_mpfcb = get_mpfcb(mpfid);
229
230 t_lock_cpu();
231 if (p_mpfcb->fblkcnt > 0) {
232 get_mpf_block(p_mpfcb, p_blk);
233 ercd = E_OK;
234 }
235 else {
236 ercd = E_TMOUT;
237 }
238 t_unlock_cpu();
239
240 error_exit:
241 LOG_PGET_MPF_LEAVE(ercd, *p_blk);
242 return(ercd);
243}
244
245#endif /* TOPPERS_pget_mpf */
246
247/*
248 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚ÌŠl“¾iƒ^ƒCƒ€ƒAƒEƒg‚ ‚èj
249 */
250#ifdef TOPPERS_tget_mpf
251
252ER
253tget_mpf(ID mpfid, void **p_blk, TMO tmout)
254{
255 MPFCB *p_mpfcb;
256 WINFO_MPF winfo_mpf;
257 TMEVTB tmevtb;
258 ER ercd;
259
260 LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout);
261 CHECK_DISPATCH();
262 CHECK_MPFID(mpfid);
263 CHECK_TMOUT(tmout);
264 p_mpfcb = get_mpfcb(mpfid);
265
266 t_lock_cpu();
267 if (p_mpfcb->fblkcnt > 0) {
268 get_mpf_block(p_mpfcb, p_blk);
269 ercd = E_OK;
270 }
271 else if (tmout == TMO_POL) {
272 ercd = E_TMOUT;
273 }
274 else {
275 p_runtsk->tstat = (TS_WAITING | TS_WAIT_MPF);
276 wobj_make_wait_tmout((WOBJCB *) p_mpfcb, (WINFO_WOBJ *) &winfo_mpf,
277 &tmevtb, tmout);
278 dispatch();
279 ercd = winfo_mpf.winfo.wercd;
280 if (ercd == E_OK) {
281 *p_blk = winfo_mpf.blk;
282 }
283 }
284 t_unlock_cpu();
285
286 error_exit:
287 LOG_TGET_MPF_LEAVE(ercd, *p_blk);
288 return(ercd);
289}
290
291#endif /* TOPPERS_tget_mpf */
292
293/*
294 * ŒÅ’è’·ƒƒ‚ƒŠƒuƒƒbƒN‚Ì•Ô‹p
295 */
296#ifdef TOPPERS_rel_mpf
297
298ER
299rel_mpf(ID mpfid, void *blk)
300{
301 MPFCB *p_mpfcb;
302 SIZE blkoffset;
303 uint_t blkidx;
304 TCB *p_tcb;
305 ER ercd;
306
307 LOG_REL_MPF_ENTER(mpfid, blk);
308 CHECK_TSKCTX_UNL();
309 CHECK_MPFID(mpfid);
310 p_mpfcb = get_mpfcb(mpfid);
311 CHECK_PAR(p_mpfcb->p_mpfinib->mpf <= blk);
312 blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf);
313 CHECK_PAR(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U);
314 CHECK_PAR(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused);
315 blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz);
316 CHECK_PAR((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC);
317
318 t_lock_cpu();
319 if (!queue_empty(&(p_mpfcb->wait_queue))) {
320 p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue));
321 ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk;
322 if (wait_complete(p_tcb)) {
323 dispatch();
324 }
325 ercd = E_OK;
326 }
327 else {
328 p_mpfcb->fblkcnt++;
329 (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist;
330 p_mpfcb->freelist = blkidx;
331 ercd = E_OK;
332 }
333 t_unlock_cpu();
334
335 error_exit:
336 LOG_REL_MPF_LEAVE(ercd);
337 return(ercd);
338}
339
340#endif /* TOPPERS_rel_mpf */
341
342/*
343 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̍ú‰»
344 */
345#ifdef TOPPERS_ini_mpf
346
347ER
348ini_mpf(ID mpfid)
349{
350 MPFCB *p_mpfcb;
351 bool_t dspreq;
352 ER ercd;
353
354 LOG_INI_MPF_ENTER(mpfid);
355 CHECK_TSKCTX_UNL();
356 CHECK_MPFID(mpfid);
357 p_mpfcb = get_mpfcb(mpfid);
358
359 t_lock_cpu();
360 dspreq = init_wait_queue(&(p_mpfcb->wait_queue));
361 p_mpfcb->fblkcnt = p_mpfcb->p_mpfinib->blkcnt;
362 p_mpfcb->unused = 0U;
363 p_mpfcb->freelist = INDEX_NULL;
364 if (dspreq) {
365 dispatch();
366 }
367 ercd = E_OK;
368 t_unlock_cpu();
369
370 error_exit:
371 LOG_INI_MPF_LEAVE(ercd);
372 return(ercd);
373}
374
375#endif /* TOPPERS_ini_mpf */
376
377/*
378 * ŒÅ’è’·ƒƒ‚ƒŠƒv[ƒ‹‚̏ó‘ÔŽQÆ
379 */
380#ifdef TOPPERS_ref_mpf
381
382ER
383ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
384{
385 MPFCB *p_mpfcb;
386 ER ercd;
387
388 LOG_REF_MPF_ENTER(mpfid, pk_rmpf);
389 CHECK_TSKCTX_UNL();
390 CHECK_MPFID(mpfid);
391 p_mpfcb = get_mpfcb(mpfid);
392
393 t_lock_cpu();
394 pk_rmpf->wtskid = wait_tskid(&(p_mpfcb->wait_queue));
395 pk_rmpf->fblkcnt = p_mpfcb->fblkcnt;
396 ercd = E_OK;
397 t_unlock_cpu();
398
399 error_exit:
400 LOG_REF_MPF_LEAVE(ercd, pk_rmpf);
401 return(ercd);
402}
403
404#endif /* TOPPERS_ref_mpf */
Note: See TracBrowser for help on using the repository browser.