source: asp3_wo_tecs/trunk/extension/dcre/kernel/task_sync.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: 10.5 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: task_sync.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
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_CAN_WUP_ENTER
95#define LOG_CAN_WUP_ENTER(tskid)
96#endif /* LOG_CAN_WUP_ENTER */
97
98#ifndef LOG_CAN_WUP_LEAVE
99#define LOG_CAN_WUP_LEAVE(ercd)
100#endif /* LOG_CAN_WUP_LEAVE */
101
102#ifndef LOG_REL_WAI_ENTER
103#define LOG_REL_WAI_ENTER(tskid)
104#endif /* LOG_REL_WAI_ENTER */
105
106#ifndef LOG_REL_WAI_LEAVE
107#define LOG_REL_WAI_LEAVE(ercd)
108#endif /* LOG_REL_WAI_LEAVE */
109
110#ifndef LOG_SUS_TSK_ENTER
111#define LOG_SUS_TSK_ENTER(tskid)
112#endif /* LOG_SUS_TSK_ENTER */
113
114#ifndef LOG_SUS_TSK_LEAVE
115#define LOG_SUS_TSK_LEAVE(ercd)
116#endif /* LOG_SUS_TSK_LEAVE */
117
118#ifndef LOG_RSM_TSK_ENTER
119#define LOG_RSM_TSK_ENTER(tskid)
120#endif /* LOG_RSM_TSK_ENTER */
121
122#ifndef LOG_RSM_TSK_LEAVE
123#define LOG_RSM_TSK_LEAVE(ercd)
124#endif /* LOG_RSM_TSK_LEAVE */
125
126#ifndef LOG_DLY_TSK_ENTER
127#define LOG_DLY_TSK_ENTER(dlytim)
128#endif /* LOG_DLY_TSK_ENTER */
129
130#ifndef LOG_DLY_TSK_LEAVE
131#define LOG_DLY_TSK_LEAVE(ercd)
132#endif /* LOG_DLY_TSK_LEAVE */
133
134/*
135 * 起床待
136ち
137 */
138#ifdef TOPPERS_slp_tsk
139
140ER
141slp_tsk(void)
142{
143 WINFO winfo;
144 ER ercd;
145
146 LOG_SLP_TSK_ENTER();
147 CHECK_DISPATCH();
148
149 lock_cpu_dsp();
150 if (p_runtsk->raster) {
151 ercd = E_RASTER;
152 }
153 else if (p_runtsk->wupque) {
154 p_runtsk->wupque = false;
155 ercd = E_OK;
156 }
157 else {
158 p_runtsk->tstat = TS_WAITING_SLP;
159 make_wait(&winfo);
160 LOG_TSKSTAT(p_runtsk);
161 dispatch();
162 ercd = winfo.wercd;
163 }
164 unlock_cpu_dsp();
165
166 error_exit:
167 LOG_SLP_TSK_LEAVE(ercd);
168 return(ercd);
169}
170
171#endif /* TOPPERS_slp_tsk */
172
173/*
174 * 起床待
175ち(タイムアウトあり)
176 */
177#ifdef TOPPERS_tslp_tsk
178
179ER
180tslp_tsk(TMO tmout)
181{
182 WINFO winfo;
183 TMEVTB tmevtb;
184 ER ercd;
185
186 LOG_TSLP_TSK_ENTER(tmout);
187 CHECK_DISPATCH();
188 CHECK_PAR(VALID_TMOUT(tmout));
189
190 lock_cpu_dsp();
191 if (p_runtsk->raster) {
192 ercd = E_RASTER;
193 }
194 else if (p_runtsk->wupque) {
195 p_runtsk->wupque = false;
196 ercd = E_OK;
197 }
198 else if (tmout == TMO_POL) {
199 ercd = E_TMOUT;
200 }
201 else {
202 p_runtsk->tstat = TS_WAITING_SLP;
203 make_wait_tmout(&winfo, &tmevtb, tmout);
204 LOG_TSKSTAT(p_runtsk);
205 dispatch();
206 ercd = winfo.wercd;
207 }
208 unlock_cpu_dsp();
209
210 error_exit:
211 LOG_TSLP_TSK_LEAVE(ercd);
212 return(ercd);
213}
214
215#endif /* TOPPERS_tslp_tsk */
216
217/*
218 * タスクの起床
219 */
220#ifdef TOPPERS_wup_tsk
221
222ER
223wup_tsk(ID tskid)
224{
225 TCB *p_tcb;
226 ER ercd;
227
228 LOG_WUP_TSK_ENTER(tskid);
229 CHECK_UNL();
230 if (tskid == TSK_SELF && !sense_context()) {
231 p_tcb = p_runtsk;
232 }
233 else {
234 CHECK_ID(VALID_TSKID(tskid));
235 p_tcb = get_tcb(tskid);
236 }
237
238 lock_cpu();
239 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
240 ercd = E_NOEXS;
241 }
242 else if (TSTAT_DORMANT(p_tcb->tstat)) {
243 ercd = E_OBJ;
244 }
245 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
246 wait_complete(p_tcb);
247 if (p_runtsk != p_schedtsk) {
248 if (!sense_context()) {
249 dispatch();
250 }
251 else {
252 request_dispatch();
253 }
254 }
255 ercd = E_OK;
256 }
257 else if (!(p_tcb->wupque)) {
258 p_tcb->wupque = true;
259 ercd = E_OK;
260 }
261 else {
262 ercd = E_QOVR;
263 }
264 unlock_cpu();
265
266 error_exit:
267 LOG_WUP_TSK_LEAVE(ercd);
268 return(ercd);
269}
270
271#endif /* TOPPERS_wup_tsk */
272
273/*
274 * タスク起床要求のキャンセル
275 */
276#ifdef TOPPERS_can_wup
277
278ER_UINT
279can_wup(ID tskid)
280{
281 TCB *p_tcb;
282 ER_UINT ercd;
283
284 LOG_CAN_WUP_ENTER(tskid);
285 CHECK_TSKCTX_UNL();
286 if (tskid == TSK_SELF) {
287 p_tcb = p_runtsk;
288 }
289 else {
290 CHECK_ID(VALID_TSKID(tskid));
291 p_tcb = get_tcb(tskid);
292 }
293
294 lock_cpu();
295 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
296 ercd = E_NOEXS;
297 }
298 else if (TSTAT_DORMANT(p_tcb->tstat)) {
299 ercd = E_OBJ;
300 }
301 else {
302 ercd = p_tcb->wupque ? 1 : 0;
303 p_tcb->wupque = false;
304 }
305 unlock_cpu();
306
307 error_exit:
308 LOG_CAN_WUP_LEAVE(ercd);
309 return(ercd);
310}
311
312#endif /* TOPPERS_can_wup */
313
314/*
315 * 待
316ち状æ…
317‹ã®å¼·åˆ¶è§£é™¤
318 */
319#ifdef TOPPERS_rel_wai
320
321ER
322rel_wai(ID tskid)
323{
324 TCB *p_tcb;
325 ER ercd;
326
327 LOG_REL_WAI_ENTER(tskid);
328 CHECK_UNL();
329 CHECK_ID(VALID_TSKID(tskid));
330 p_tcb = get_tcb(tskid);
331
332 lock_cpu();
333 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
334 ercd = E_NOEXS;
335 }
336 else if (!TSTAT_WAITING(p_tcb->tstat)) {
337 ercd = E_OBJ;
338 }
339 else {
340 wait_dequeue_wobj(p_tcb);
341 wait_dequeue_tmevtb(p_tcb);
342 p_tcb->p_winfo->wercd = E_RLWAI;
343 make_non_wait(p_tcb);
344 if (p_runtsk != p_schedtsk) {
345 if (!sense_context()) {
346 dispatch();
347 }
348 else {
349 request_dispatch();
350 }
351 }
352 ercd = E_OK;
353 }
354 unlock_cpu();
355
356 error_exit:
357 LOG_REL_WAI_LEAVE(ercd);
358 return(ercd);
359}
360
361#endif /* TOPPERS_rel_wai */
362
363/*
364 * 強制待
365ち状æ…
366‹ã¸ã®ç§»è¡Œï¼»NGKI1298ï¼½
367 */
368#ifdef TOPPERS_sus_tsk
369
370ER
371sus_tsk(ID tskid)
372{
373 TCB *p_tcb;
374 ER ercd;
375
376 LOG_SUS_TSK_ENTER(tskid);
377 CHECK_TSKCTX_UNL(); /*[NGKI1299][NGKI1300]*/
378 if (tskid == TSK_SELF) {
379 p_tcb = p_runtsk; /*ï¼»NGKI1310ï¼½*/
380 }
381 else {
382 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1302ï¼½*/
383 p_tcb = get_tcb(tskid);
384 }
385
386 lock_cpu();
387 if (p_tcb == p_runtsk && !dspflg) { /*[NGKI1311][NGKI3604]*/
388 ercd = E_CTX;
389 }
390 else if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
391 ercd = E_NOEXS; /*ï¼»NGKI1303ï¼½*/
392 }
393 else if (TSTAT_DORMANT(p_tcb->tstat)) {
394 ercd = E_OBJ; /*ï¼»NGKI1305ï¼½*/
395 }
396 else if (p_tcb->raster) {
397 ercd = E_RASTER; /*ï¼»NGKI3605ï¼½*/
398 }
399 else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
400 /*
401 * 実行できる状æ…
402‹ã‹ã‚‰å¼·åˆ¶å¾…
403ち状æ…
404‹ã¸ã®é·ç§»ï¼»NGKI1307ï¼½
405 */
406 p_tcb->tstat = TS_SUSPENDED;
407 LOG_TSKSTAT(p_tcb);
408 make_non_runnable(p_tcb);
409 if (p_runtsk != p_schedtsk) {
410 dispatch();
411 }
412 ercd = E_OK;
413 }
414 else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
415 ercd = E_QOVR; /*ï¼»NGKI1306ï¼½*/
416 }
417 else {
418 /*
419 * 待
420ち状æ…
421‹ã‹ã‚‰äºŒé‡å¾…
422ち状æ…
423‹ã¸ã®é·ç§»ï¼»NGKI1308ï¼½
424 */
425 p_tcb->tstat |= TS_SUSPENDED;
426 LOG_TSKSTAT(p_tcb);
427 ercd = E_OK;
428 }
429 unlock_cpu();
430
431 error_exit:
432 LOG_SUS_TSK_LEAVE(ercd);
433 return(ercd);
434}
435
436#endif /* TOPPERS_sus_tsk */
437
438/*
439 * 強制待
440ち状æ…
441‹ã‹ã‚‰ã®å†é–‹
442 */
443#ifdef TOPPERS_rsm_tsk
444
445ER
446rsm_tsk(ID tskid)
447{
448 TCB *p_tcb;
449 ER ercd;
450
451 LOG_RSM_TSK_ENTER(tskid);
452 CHECK_TSKCTX_UNL();
453 CHECK_ID(VALID_TSKID(tskid));
454 p_tcb = get_tcb(tskid);
455
456 lock_cpu();
457 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
458 ercd = E_NOEXS;
459 }
460 else if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
461 ercd = E_OBJ;
462 }
463 else if (!TSTAT_WAITING(p_tcb->tstat)) {
464 /*
465 * 強制待
466ち状æ…
467‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
468‹ã¸ã®é·ç§»
469 */
470 p_tcb->tstat = TS_RUNNABLE;
471 LOG_TSKSTAT(p_tcb);
472 make_runnable(p_tcb);
473 if (p_runtsk != p_schedtsk) {
474 dispatch();
475 }
476 ercd = E_OK;
477 }
478 else {
479 /*
480 * 二重待
481ち状æ…
482‹ã‹ã‚‰å¾…
483ち状æ…
484‹ã¸ã®é·ç§»
485 */
486 p_tcb->tstat &= ~TS_SUSPENDED;
487 LOG_TSKSTAT(p_tcb);
488 ercd = E_OK;
489 }
490 unlock_cpu();
491
492 error_exit:
493 LOG_RSM_TSK_LEAVE(ercd);
494 return(ercd);
495}
496
497#endif /* TOPPERS_rsm_tsk */
498
499/*
500 * 自タスクの遅
501延
502 */
503#ifdef TOPPERS_dly_tsk
504
505ER
506dly_tsk(RELTIM dlytim)
507{
508 WINFO winfo;
509 TMEVTB tmevtb;
510 ER ercd;
511
512 LOG_DLY_TSK_ENTER(dlytim);
513 CHECK_DISPATCH();
514 CHECK_PAR(VALID_RELTIM(dlytim));
515
516 lock_cpu_dsp();
517 if (p_runtsk->raster) {
518 ercd = E_RASTER;
519 }
520 else {
521 p_runtsk->tstat = TS_WAITING_DLY;
522 make_non_runnable(p_runtsk);
523 p_runtsk->p_winfo = &winfo;
524 winfo.p_tmevtb = &tmevtb;
525 tmevtb.callback = (CBACK) wait_tmout_ok;
526 tmevtb.arg = (void *) p_runtsk;
527 tmevtb_enqueue(&tmevtb, dlytim);
528 LOG_TSKSTAT(p_runtsk);
529 dispatch();
530 ercd = winfo.wercd;
531 }
532 unlock_cpu_dsp();
533
534 error_exit:
535 LOG_DLY_TSK_LEAVE(ercd);
536 return(ercd);
537}
538
539#endif /* TOPPERS_dly_tsk */
Note: See TracBrowser for help on using the repository browser.