source: rtos_arduino/trunk/asp_1.9.2/kernel/task_sync.c@ 136

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

ライブラリとOS及びベーシックなサンプルの追加.

File size: 10.6 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-2009 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: task_sync.c 1453 2009-02-18 09:09:34Z 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
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_SLP_TSK_ENTER
71#define LOG_SLP_TSK_ENTER()
72#endif /* LOG_SLP_TSK_ENTER */
73
74#ifndef LOG_SLP_TSK_LEAVE
75#define LOG_SLP_TSK_LEAVE(ercd)
76#endif /* LOG_SLP_TSK_LEAVE */
77
78#ifndef LOG_TSLP_TSK_ENTER
79#define LOG_TSLP_TSK_ENTER(tmout)
80#endif /* LOG_TSLP_TSK_ENTER */
81
82#ifndef LOG_TSLP_TSK_LEAVE
83#define LOG_TSLP_TSK_LEAVE(ercd)
84#endif /* LOG_TSLP_TSK_LEAVE */
85
86#ifndef LOG_WUP_TSK_ENTER
87#define LOG_WUP_TSK_ENTER(tskid)
88#endif /* LOG_WUP_TSK_ENTER */
89
90#ifndef LOG_WUP_TSK_LEAVE
91#define LOG_WUP_TSK_LEAVE(ercd)
92#endif /* LOG_WUP_TSK_LEAVE */
93
94#ifndef LOG_IWUP_TSK_ENTER
95#define LOG_IWUP_TSK_ENTER(tskid)
96#endif /* LOG_IWUP_TSK_ENTER */
97
98#ifndef LOG_IWUP_TSK_LEAVE
99#define LOG_IWUP_TSK_LEAVE(ercd)
100#endif /* LOG_IWUP_TSK_LEAVE */
101
102#ifndef LOG_CAN_WUP_ENTER
103#define LOG_CAN_WUP_ENTER(tskid)
104#endif /* LOG_CAN_WUP_ENTER */
105
106#ifndef LOG_CAN_WUP_LEAVE
107#define LOG_CAN_WUP_LEAVE(ercd)
108#endif /* LOG_CAN_WUP_LEAVE */
109
110#ifndef LOG_REL_WAI_ENTER
111#define LOG_REL_WAI_ENTER(tskid)
112#endif /* LOG_REL_WAI_ENTER */
113
114#ifndef LOG_REL_WAI_LEAVE
115#define LOG_REL_WAI_LEAVE(ercd)
116#endif /* LOG_REL_WAI_LEAVE */
117
118#ifndef LOG_IREL_WAI_ENTER
119#define LOG_IREL_WAI_ENTER(tskid)
120#endif /* LOG_IREL_WAI_ENTER */
121
122#ifndef LOG_IREL_WAI_LEAVE
123#define LOG_IREL_WAI_LEAVE(ercd)
124#endif /* LOG_IREL_WAI_LEAVE */
125
126#ifndef LOG_SUS_TSK_ENTER
127#define LOG_SUS_TSK_ENTER(tskid)
128#endif /* LOG_SUS_TSK_ENTER */
129
130#ifndef LOG_SUS_TSK_LEAVE
131#define LOG_SUS_TSK_LEAVE(ercd)
132#endif /* LOG_SUS_TSK_LEAVE */
133
134#ifndef LOG_RSM_TSK_ENTER
135#define LOG_RSM_TSK_ENTER(tskid)
136#endif /* LOG_RSM_TSK_ENTER */
137
138#ifndef LOG_RSM_TSK_LEAVE
139#define LOG_RSM_TSK_LEAVE(ercd)
140#endif /* LOG_RSM_TSK_LEAVE */
141
142#ifndef LOG_DLY_TSK_ENTER
143#define LOG_DLY_TSK_ENTER(dlytim)
144#endif /* LOG_DLY_TSK_ENTER */
145
146#ifndef LOG_DLY_TSK_LEAVE
147#define LOG_DLY_TSK_LEAVE(ercd)
148#endif /* LOG_DLY_TSK_LEAVE */
149
150/*
151 * 起床待
152ち
153 */
154#ifdef TOPPERS_slp_tsk
155
156ER
157slp_tsk(void)
158{
159 WINFO winfo;
160 ER ercd;
161
162 LOG_SLP_TSK_ENTER();
163 CHECK_DISPATCH();
164
165 t_lock_cpu();
166 if (p_runtsk->wupque) {
167 p_runtsk->wupque = false;
168 ercd = E_OK;
169 }
170 else {
171 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
172 make_wait(&winfo);
173 LOG_TSKSTAT(p_runtsk);
174 dispatch();
175 ercd = winfo.wercd;
176 }
177 t_unlock_cpu();
178
179 error_exit:
180 LOG_SLP_TSK_LEAVE(ercd);
181 return(ercd);
182}
183
184#endif /* TOPPERS_slp_tsk */
185
186/*
187 * 起床待
188ち(タイムアウトあり)
189 */
190#ifdef TOPPERS_tslp_tsk
191
192ER
193tslp_tsk(TMO tmout)
194{
195 WINFO winfo;
196 TMEVTB tmevtb;
197 ER ercd;
198
199 LOG_TSLP_TSK_ENTER(tmout);
200 CHECK_DISPATCH();
201 CHECK_TMOUT(tmout);
202
203 t_lock_cpu();
204 if (p_runtsk->wupque) {
205 p_runtsk->wupque = false;
206 ercd = E_OK;
207 }
208 else if (tmout == TMO_POL) {
209 ercd = E_TMOUT;
210 }
211 else {
212 p_runtsk->tstat = (TS_WAITING | TS_WAIT_SLP);
213 make_wait_tmout(&winfo, &tmevtb, tmout);
214 LOG_TSKSTAT(p_runtsk);
215 dispatch();
216 ercd = winfo.wercd;
217 }
218 t_unlock_cpu();
219
220 error_exit:
221 LOG_TSLP_TSK_LEAVE(ercd);
222 return(ercd);
223}
224
225#endif /* TOPPERS_tslp_tsk */
226
227/*
228 * タスクの起床
229 */
230#ifdef TOPPERS_wup_tsk
231
232ER
233wup_tsk(ID tskid)
234{
235 TCB *p_tcb;
236 ER ercd;
237
238 LOG_WUP_TSK_ENTER(tskid);
239 CHECK_TSKCTX_UNL();
240 CHECK_TSKID_SELF(tskid);
241 p_tcb = get_tcb_self(tskid);
242
243 t_lock_cpu();
244 if (TSTAT_DORMANT(p_tcb->tstat)) {
245 ercd = E_OBJ;
246 }
247 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
248 if (wait_complete(p_tcb)) {
249 dispatch();
250 }
251 ercd = E_OK;
252 }
253 else if (!(p_tcb->wupque)) {
254 p_tcb->wupque = true;
255 ercd = E_OK;
256 }
257 else {
258 ercd = E_QOVR;
259 }
260 t_unlock_cpu();
261
262 error_exit:
263 LOG_WUP_TSK_LEAVE(ercd);
264 return(ercd);
265}
266
267#endif /* TOPPERS_wup_tsk */
268
269/*
270 * タスクの起床(非タスクコンテキスト用)
271 */
272#ifdef TOPPERS_iwup_tsk
273
274ER
275iwup_tsk(ID tskid)
276{
277 TCB *p_tcb;
278 ER ercd;
279
280 LOG_IWUP_TSK_ENTER(tskid);
281 CHECK_INTCTX_UNL();
282 CHECK_TSKID(tskid);
283 p_tcb = get_tcb(tskid);
284
285 i_lock_cpu();
286 if (TSTAT_DORMANT(p_tcb->tstat)) {
287 ercd = E_OBJ;
288 }
289 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
290 if (wait_complete(p_tcb)) {
291 reqflg = true;
292 }
293 ercd = E_OK;
294 }
295 else if (!(p_tcb->wupque)) {
296 p_tcb->wupque = true;
297 ercd = E_OK;
298 }
299 else {
300 ercd = E_QOVR;
301 }
302 i_unlock_cpu();
303
304 error_exit:
305 LOG_IWUP_TSK_LEAVE(ercd);
306 return(ercd);
307}
308
309#endif /* TOPPERS_iwup_tsk */
310
311/*
312 * タスク起床要求のキャンセル
313 */
314#ifdef TOPPERS_can_wup
315
316ER_UINT
317can_wup(ID tskid)
318{
319 TCB *p_tcb;
320 ER_UINT ercd;
321
322 LOG_CAN_WUP_ENTER(tskid);
323 CHECK_TSKCTX_UNL();
324 CHECK_TSKID_SELF(tskid);
325 p_tcb = get_tcb_self(tskid);
326
327 t_lock_cpu();
328 if (TSTAT_DORMANT(p_tcb->tstat)) {
329 ercd = E_OBJ;
330 }
331 else {
332 ercd = p_tcb->wupque ? 1 : 0;
333 p_tcb->wupque = false;
334 }
335 t_unlock_cpu();
336
337 error_exit:
338 LOG_CAN_WUP_LEAVE(ercd);
339 return(ercd);
340}
341
342#endif /* TOPPERS_can_wup */
343
344/*
345 * 待
346ち状æ…
347‹ã®å¼·åˆ¶è§£é™¤
348 */
349#ifdef TOPPERS_rel_wai
350
351ER
352rel_wai(ID tskid)
353{
354 TCB *p_tcb;
355 ER ercd;
356
357 LOG_REL_WAI_ENTER(tskid);
358 CHECK_TSKCTX_UNL();
359 CHECK_TSKID(tskid);
360 p_tcb = get_tcb(tskid);
361
362 t_lock_cpu();
363 if (!TSTAT_WAITING(p_tcb->tstat)) {
364 ercd = E_OBJ;
365 }
366 else {
367 if (wait_release(p_tcb)) {
368 dispatch();
369 }
370 ercd = E_OK;
371 }
372 t_unlock_cpu();
373
374 error_exit:
375 LOG_REL_WAI_LEAVE(ercd);
376 return(ercd);
377}
378
379#endif /* TOPPERS_rel_wai */
380
381/*
382 * 待
383ち状æ…
384‹ã®å¼·åˆ¶è§£é™¤ï¼ˆéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆç”¨ï¼‰
385 */
386#ifdef TOPPERS_irel_wai
387
388ER
389irel_wai(ID tskid)
390{
391 TCB *p_tcb;
392 ER ercd;
393
394 LOG_IREL_WAI_ENTER(tskid);
395 CHECK_INTCTX_UNL();
396 CHECK_TSKID(tskid);
397 p_tcb = get_tcb(tskid);
398
399 i_lock_cpu();
400 if (!TSTAT_WAITING(p_tcb->tstat)) {
401 ercd = E_OBJ;
402 }
403 else {
404 if (wait_release(p_tcb)) {
405 reqflg = true;
406 }
407 ercd = E_OK;
408 }
409 i_unlock_cpu();
410
411 error_exit:
412 LOG_IREL_WAI_LEAVE(ercd);
413 return(ercd);
414}
415
416#endif /* TOPPERS_irel_wai */
417
418/*
419 * 強制待
420ち状æ…
421‹ã¸ã®ç§»è¡Œ
422 */
423#ifdef TOPPERS_sus_tsk
424
425ER
426sus_tsk(ID tskid)
427{
428 TCB *p_tcb;
429 ER ercd;
430
431 LOG_SUS_TSK_ENTER(tskid);
432 CHECK_TSKCTX_UNL();
433 CHECK_TSKID_SELF(tskid);
434 p_tcb = get_tcb_self(tskid);
435
436 t_lock_cpu();
437 if (p_tcb == p_runtsk && !dspflg) {
438 ercd = E_CTX;
439 }
440 else if (TSTAT_DORMANT(p_tcb->tstat)) {
441 ercd = E_OBJ;
442 }
443 else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
444 /*
445 * 実行できる状æ…
446‹ã‹ã‚‰å¼·åˆ¶å¾…
447ち状æ…
448‹ã¸ã®é·ç§»
449 */
450 p_tcb->tstat = TS_SUSPENDED;
451 LOG_TSKSTAT(p_tcb);
452 if (make_non_runnable(p_tcb)) {
453 dispatch();
454 }
455 ercd = E_OK;
456 }
457 else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
458 ercd = E_QOVR;
459 }
460 else {
461 /*
462 * 待
463ち状æ…
464‹ã‹ã‚‰äºŒé‡å¾…
465ち状æ…
466‹ã¸ã®é·ç§»
467 */
468 p_tcb->tstat |= TS_SUSPENDED;
469 LOG_TSKSTAT(p_tcb);
470 ercd = E_OK;
471 }
472 t_unlock_cpu();
473
474 error_exit:
475 LOG_SUS_TSK_LEAVE(ercd);
476 return(ercd);
477}
478
479#endif /* TOPPERS_sus_tsk */
480
481/*
482 * 強制待
483ち状æ…
484‹ã‹ã‚‰ã®å†é–‹
485 */
486#ifdef TOPPERS_rsm_tsk
487
488ER
489rsm_tsk(ID tskid)
490{
491 TCB *p_tcb;
492 ER ercd;
493
494 LOG_RSM_TSK_ENTER(tskid);
495 CHECK_TSKCTX_UNL();
496 CHECK_TSKID(tskid);
497 p_tcb = get_tcb(tskid);
498
499 t_lock_cpu();
500 if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
501 ercd = E_OBJ;
502 }
503 else if (!TSTAT_WAITING(p_tcb->tstat)) {
504 /*
505 * 強制待
506ち状æ…
507‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
508‹ã¸ã®é·ç§»
509 */
510 p_tcb->tstat = TS_RUNNABLE;
511 LOG_TSKSTAT(p_tcb);
512 if (make_runnable(p_tcb)) {
513 dispatch();
514 }
515 ercd = E_OK;
516 }
517 else {
518 /*
519 * 二重待
520ち状æ…
521‹ã‹ã‚‰å¾…
522ち状æ…
523‹ã¸ã®é·ç§»
524 */
525 p_tcb->tstat &= ~TS_SUSPENDED;
526 LOG_TSKSTAT(p_tcb);
527 ercd = E_OK;
528 }
529 t_unlock_cpu();
530
531 error_exit:
532 LOG_RSM_TSK_LEAVE(ercd);
533 return(ercd);
534}
535
536#endif /* TOPPERS_rsm_tsk */
537
538/*
539 * 自タスクの遅
540延
541 */
542#ifdef TOPPERS_dly_tsk
543
544ER
545dly_tsk(RELTIM dlytim)
546{
547 WINFO winfo;
548 TMEVTB tmevtb;
549 ER ercd;
550
551 LOG_DLY_TSK_ENTER(dlytim);
552 CHECK_DISPATCH();
553 CHECK_PAR(dlytim <= TMAX_RELTIM);
554
555 t_lock_cpu();
556 p_runtsk->tstat = (TS_WAITING | TS_WAIT_DLY);
557 (void) make_non_runnable(p_runtsk);
558 p_runtsk->p_winfo = &winfo;
559 winfo.p_tmevtb = &tmevtb;
560 tmevtb_enqueue(&tmevtb, dlytim, (CBACK) wait_tmout_ok, (void *) p_runtsk);
561 LOG_TSKSTAT(p_runtsk);
562 dispatch();
563 ercd = winfo.wercd;
564 t_unlock_cpu();
565
566 error_exit:
567 LOG_DLY_TSK_LEAVE(ercd);
568 return(ercd);
569}
570
571#endif /* TOPPERS_dly_tsk */
Note: See TracBrowser for help on using the repository browser.