source: asp3_wo_tecs/trunk/kernel/semaphore.c@ 302

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 8.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-2015 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * $Id: semaphore.c 471 2015-12-30 10:03:16Z ertl-hiro $
56 */
57
58/*
59 * セマフォ機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "wait.h"
66#include "semaphore.h"
67
68/*
69 * トレースログマクロのデフォルト定義
70 */
71#ifndef LOG_SIG_SEM_ENTER
72#define LOG_SIG_SEM_ENTER(semid)
73#endif /* LOG_SIG_SEM_ENTER */
74
75#ifndef LOG_SIG_SEM_LEAVE
76#define LOG_SIG_SEM_LEAVE(ercd)
77#endif /* LOG_SIG_SEM_LEAVE */
78
79#ifndef LOG_WAI_SEM_ENTER
80#define LOG_WAI_SEM_ENTER(semid)
81#endif /* LOG_WAI_SEM_ENTER */
82
83#ifndef LOG_WAI_SEM_LEAVE
84#define LOG_WAI_SEM_LEAVE(ercd)
85#endif /* LOG_WAI_SEM_LEAVE */
86
87#ifndef LOG_POL_SEM_ENTER
88#define LOG_POL_SEM_ENTER(semid)
89#endif /* LOG_POL_SEM_ENTER */
90
91#ifndef LOG_POL_SEM_LEAVE
92#define LOG_POL_SEM_LEAVE(ercd)
93#endif /* LOG_POL_SEM_LEAVE */
94
95#ifndef LOG_TWAI_SEM_ENTER
96#define LOG_TWAI_SEM_ENTER(semid, tmout)
97#endif /* LOG_TWAI_SEM_ENTER */
98
99#ifndef LOG_TWAI_SEM_LEAVE
100#define LOG_TWAI_SEM_LEAVE(ercd)
101#endif /* LOG_TWAI_SEM_LEAVE */
102
103#ifndef LOG_INI_SEM_ENTER
104#define LOG_INI_SEM_ENTER(semid)
105#endif /* LOG_INI_SEM_ENTER */
106
107#ifndef LOG_INI_SEM_LEAVE
108#define LOG_INI_SEM_LEAVE(ercd)
109#endif /* LOG_INI_SEM_LEAVE */
110
111#ifndef LOG_REF_SEM_ENTER
112#define LOG_REF_SEM_ENTER(semid, pk_rsem)
113#endif /* LOG_REF_SEM_ENTER */
114
115#ifndef LOG_REF_SEM_LEAVE
116#define LOG_REF_SEM_LEAVE(ercd, pk_rsem)
117#endif /* LOG_REF_SEM_LEAVE */
118
119/*
120 * セマフォの数
121 */
122#define tnum_sem ((uint_t)(tmax_semid - TMIN_SEMID + 1))
123
124/*
125 * セマフォIDからセマフォ管理ブロックを取り出すためのマクロ
126 */
127#define INDEX_SEM(semid) ((uint_t)((semid) - TMIN_SEMID))
128#define get_semcb(semid) (&(semcb_table[INDEX_SEM(semid)]))
129
130/*
131 * セマフォ機能の初期化
132 */
133#ifdef TOPPERS_semini
134
135void
136initialize_semaphore(void)
137{
138 uint_t i;
139 SEMCB *p_semcb;
140
141 for (i = 0; i < tnum_sem; i++) {
142 p_semcb = &(semcb_table[i]);
143 queue_initialize(&(p_semcb->wait_queue));
144 p_semcb->p_seminib = &(seminib_table[i]);
145 p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
146 }
147}
148
149#endif /* TOPPERS_semini */
150
151/*
152 * セマフォ資源の返却
153 */
154#ifdef TOPPERS_sig_sem
155
156ER
157sig_sem(ID semid)
158{
159 SEMCB *p_semcb;
160 TCB *p_tcb;
161 ER ercd;
162
163 LOG_SIG_SEM_ENTER(semid);
164 CHECK_UNL();
165 CHECK_ID(VALID_SEMID(semid));
166 p_semcb = get_semcb(semid);
167
168 lock_cpu();
169 if (!queue_empty(&(p_semcb->wait_queue))) {
170 p_tcb = (TCB *) queue_delete_next(&(p_semcb->wait_queue));
171 wait_complete(p_tcb);
172 if (p_runtsk != p_schedtsk) {
173 if (!sense_context()) {
174 dispatch();
175 }
176 else {
177 request_dispatch();
178 }
179 }
180 ercd = E_OK;
181 }
182 else if (p_semcb->semcnt < p_semcb->p_seminib->maxsem) {
183 p_semcb->semcnt += 1;
184 ercd = E_OK;
185 }
186 else {
187 ercd = E_QOVR;
188 }
189 unlock_cpu();
190
191 error_exit:
192 LOG_SIG_SEM_LEAVE(ercd);
193 return(ercd);
194}
195
196#endif /* TOPPERS_sig_sem */
197
198/*
199 * セマフォ資源の獲得
200 */
201#ifdef TOPPERS_wai_sem
202
203ER
204wai_sem(ID semid)
205{
206 SEMCB *p_semcb;
207 WINFO_SEM winfo_sem;
208 ER ercd;
209
210 LOG_WAI_SEM_ENTER(semid);
211 CHECK_DISPATCH();
212 CHECK_ID(VALID_SEMID(semid));
213 p_semcb = get_semcb(semid);
214
215 lock_cpu_dsp();
216 if (p_runtsk->raster) {
217 ercd = E_RASTER;
218 }
219 else if (p_semcb->semcnt >= 1) {
220 p_semcb->semcnt -= 1;
221 ercd = E_OK;
222 }
223 else {
224 p_runtsk->tstat = TS_WAITING_SEM;
225 wobj_make_wait((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem);
226 dispatch();
227 ercd = winfo_sem.winfo.wercd;
228 }
229 unlock_cpu_dsp();
230
231 error_exit:
232 LOG_WAI_SEM_LEAVE(ercd);
233 return(ercd);
234}
235
236#endif /* TOPPERS_wai_sem */
237
238/*
239 * セマフォ資源の獲得(ポーリング)
240 */
241#ifdef TOPPERS_pol_sem
242
243ER
244pol_sem(ID semid)
245{
246 SEMCB *p_semcb;
247 ER ercd;
248
249 LOG_POL_SEM_ENTER(semid);
250 CHECK_TSKCTX_UNL();
251 CHECK_ID(VALID_SEMID(semid));
252 p_semcb = get_semcb(semid);
253
254 lock_cpu();
255 if (p_semcb->semcnt >= 1) {
256 p_semcb->semcnt -= 1;
257 ercd = E_OK;
258 }
259 else {
260 ercd = E_TMOUT;
261 }
262 unlock_cpu();
263
264 error_exit:
265 LOG_POL_SEM_LEAVE(ercd);
266 return(ercd);
267}
268
269#endif /* TOPPERS_pol_sem */
270
271/*
272 * セマフォ資源の獲得(タイムアウトあり)
273 */
274#ifdef TOPPERS_twai_sem
275
276ER
277twai_sem(ID semid, TMO tmout)
278{
279 SEMCB *p_semcb;
280 WINFO_SEM winfo_sem;
281 TMEVTB tmevtb;
282 ER ercd;
283
284 LOG_TWAI_SEM_ENTER(semid, tmout);
285 CHECK_DISPATCH();
286 CHECK_ID(VALID_SEMID(semid));
287 CHECK_PAR(VALID_TMOUT(tmout));
288 p_semcb = get_semcb(semid);
289
290 lock_cpu_dsp();
291 if (p_runtsk->raster) {
292 ercd = E_RASTER;
293 }
294 else if (p_semcb->semcnt >= 1) {
295 p_semcb->semcnt -= 1;
296 ercd = E_OK;
297 }
298 else if (tmout == TMO_POL) {
299 ercd = E_TMOUT;
300 }
301 else {
302 p_runtsk->tstat = TS_WAITING_SEM;
303 wobj_make_wait_tmout((WOBJCB *) p_semcb, (WINFO_WOBJ *) &winfo_sem,
304 &tmevtb, tmout);
305 dispatch();
306 ercd = winfo_sem.winfo.wercd;
307 }
308 unlock_cpu_dsp();
309
310 error_exit:
311 LOG_TWAI_SEM_LEAVE(ercd);
312 return(ercd);
313}
314
315#endif /* TOPPERS_twai_sem */
316
317/*
318 * セマフォの再初期化
319 */
320#ifdef TOPPERS_ini_sem
321
322ER
323ini_sem(ID semid)
324{
325 SEMCB *p_semcb;
326 ER ercd;
327
328 LOG_INI_SEM_ENTER(semid);
329 CHECK_TSKCTX_UNL();
330 CHECK_ID(VALID_SEMID(semid));
331 p_semcb = get_semcb(semid);
332
333 lock_cpu();
334 init_wait_queue(&(p_semcb->wait_queue));
335 p_semcb->semcnt = p_semcb->p_seminib->isemcnt;
336 if (p_runtsk != p_schedtsk) {
337 dispatch();
338 }
339 ercd = E_OK;
340 unlock_cpu();
341
342 error_exit:
343 LOG_INI_SEM_LEAVE(ercd);
344 return(ercd);
345}
346
347#endif /* TOPPERS_ini_sem */
348
349/*
350 * セマフォの状æ…
351‹å‚ç…
352§
353 */
354#ifdef TOPPERS_ref_sem
355
356ER
357ref_sem(ID semid, T_RSEM *pk_rsem)
358{
359 SEMCB *p_semcb;
360 ER ercd;
361
362 LOG_REF_SEM_ENTER(semid, pk_rsem);
363 CHECK_TSKCTX_UNL();
364 CHECK_ID(VALID_SEMID(semid));
365 p_semcb = get_semcb(semid);
366
367 lock_cpu();
368 pk_rsem->wtskid = wait_tskid(&(p_semcb->wait_queue));
369 pk_rsem->semcnt = p_semcb->semcnt;
370 ercd = E_OK;
371 unlock_cpu();
372
373 error_exit:
374 LOG_REF_SEM_LEAVE(ercd, pk_rsem);
375 return(ercd);
376}
377
378#endif /* TOPPERS_ref_sem */
Note: See TracBrowser for help on using the repository browser.