source: asp3_wo_tecs/trunk/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.1 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 (TSTAT_DORMANT(p_tcb->tstat)) {
240 ercd = E_OBJ;
241 }
242 else if (TSTAT_WAIT_SLP(p_tcb->tstat)) {
243 wait_complete(p_tcb);
244 if (p_runtsk != p_schedtsk) {
245 if (!sense_context()) {
246 dispatch();
247 }
248 else {
249 request_dispatch();
250 }
251 }
252 ercd = E_OK;
253 }
254 else if (!(p_tcb->wupque)) {
255 p_tcb->wupque = true;
256 ercd = E_OK;
257 }
258 else {
259 ercd = E_QOVR;
260 }
261 unlock_cpu();
262
263 error_exit:
264 LOG_WUP_TSK_LEAVE(ercd);
265 return(ercd);
266}
267
268#endif /* TOPPERS_wup_tsk */
269
270/*
271 * タスク起床要求のキャンセル
272 */
273#ifdef TOPPERS_can_wup
274
275ER_UINT
276can_wup(ID tskid)
277{
278 TCB *p_tcb;
279 ER_UINT ercd;
280
281 LOG_CAN_WUP_ENTER(tskid);
282 CHECK_TSKCTX_UNL();
283 if (tskid == TSK_SELF) {
284 p_tcb = p_runtsk;
285 }
286 else {
287 CHECK_ID(VALID_TSKID(tskid));
288 p_tcb = get_tcb(tskid);
289 }
290
291 lock_cpu();
292 if (TSTAT_DORMANT(p_tcb->tstat)) {
293 ercd = E_OBJ;
294 }
295 else {
296 ercd = p_tcb->wupque ? 1 : 0;
297 p_tcb->wupque = false;
298 }
299 unlock_cpu();
300
301 error_exit:
302 LOG_CAN_WUP_LEAVE(ercd);
303 return(ercd);
304}
305
306#endif /* TOPPERS_can_wup */
307
308/*
309 * 待
310ち状æ…
311‹ã®å¼·åˆ¶è§£é™¤
312 */
313#ifdef TOPPERS_rel_wai
314
315ER
316rel_wai(ID tskid)
317{
318 TCB *p_tcb;
319 ER ercd;
320
321 LOG_REL_WAI_ENTER(tskid);
322 CHECK_UNL();
323 CHECK_ID(VALID_TSKID(tskid));
324 p_tcb = get_tcb(tskid);
325
326 lock_cpu();
327 if (!TSTAT_WAITING(p_tcb->tstat)) {
328 ercd = E_OBJ;
329 }
330 else {
331 wait_dequeue_wobj(p_tcb);
332 wait_dequeue_tmevtb(p_tcb);
333 p_tcb->p_winfo->wercd = E_RLWAI;
334 make_non_wait(p_tcb);
335 if (p_runtsk != p_schedtsk) {
336 if (!sense_context()) {
337 dispatch();
338 }
339 else {
340 request_dispatch();
341 }
342 }
343 ercd = E_OK;
344 }
345 unlock_cpu();
346
347 error_exit:
348 LOG_REL_WAI_LEAVE(ercd);
349 return(ercd);
350}
351
352#endif /* TOPPERS_rel_wai */
353
354/*
355 * 強制待
356ち状æ…
357‹ã¸ã®ç§»è¡Œï¼»NGKI1298ï¼½
358 */
359#ifdef TOPPERS_sus_tsk
360
361ER
362sus_tsk(ID tskid)
363{
364 TCB *p_tcb;
365 ER ercd;
366
367 LOG_SUS_TSK_ENTER(tskid);
368 CHECK_TSKCTX_UNL(); /*[NGKI1299][NGKI1300]*/
369 if (tskid == TSK_SELF) {
370 p_tcb = p_runtsk; /*ï¼»NGKI1310ï¼½*/
371 }
372 else {
373 CHECK_ID(VALID_TSKID(tskid)); /*ï¼»NGKI1302ï¼½*/
374 p_tcb = get_tcb(tskid);
375 }
376
377 lock_cpu();
378 if (p_tcb == p_runtsk && !dspflg) { /*[NGKI1311][NGKI3604]*/
379 ercd = E_CTX;
380 }
381 else if (TSTAT_DORMANT(p_tcb->tstat)) {
382 ercd = E_OBJ; /*ï¼»NGKI1305ï¼½*/
383 }
384 else if (p_tcb->raster) {
385 ercd = E_RASTER; /*ï¼»NGKI3605ï¼½*/
386 }
387 else if (TSTAT_RUNNABLE(p_tcb->tstat)) {
388 /*
389 * 実行できる状æ…
390‹ã‹ã‚‰å¼·åˆ¶å¾…
391ち状æ…
392‹ã¸ã®é·ç§»ï¼»NGKI1307ï¼½
393 */
394 p_tcb->tstat = TS_SUSPENDED;
395 LOG_TSKSTAT(p_tcb);
396 make_non_runnable(p_tcb);
397 if (p_runtsk != p_schedtsk) {
398 dispatch();
399 }
400 ercd = E_OK;
401 }
402 else if (TSTAT_SUSPENDED(p_tcb->tstat)) {
403 ercd = E_QOVR; /*ï¼»NGKI1306ï¼½*/
404 }
405 else {
406 /*
407 * 待
408ち状æ…
409‹ã‹ã‚‰äºŒé‡å¾…
410ち状æ…
411‹ã¸ã®é·ç§»ï¼»NGKI1308ï¼½
412 */
413 p_tcb->tstat |= TS_SUSPENDED;
414 LOG_TSKSTAT(p_tcb);
415 ercd = E_OK;
416 }
417 unlock_cpu();
418
419 error_exit:
420 LOG_SUS_TSK_LEAVE(ercd);
421 return(ercd);
422}
423
424#endif /* TOPPERS_sus_tsk */
425
426/*
427 * 強制待
428ち状æ…
429‹ã‹ã‚‰ã®å†é–‹
430 */
431#ifdef TOPPERS_rsm_tsk
432
433ER
434rsm_tsk(ID tskid)
435{
436 TCB *p_tcb;
437 ER ercd;
438
439 LOG_RSM_TSK_ENTER(tskid);
440 CHECK_TSKCTX_UNL();
441 CHECK_ID(VALID_TSKID(tskid));
442 p_tcb = get_tcb(tskid);
443
444 lock_cpu();
445 if (!TSTAT_SUSPENDED(p_tcb->tstat)) {
446 ercd = E_OBJ;
447 }
448 else if (!TSTAT_WAITING(p_tcb->tstat)) {
449 /*
450 * 強制待
451ち状æ…
452‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹çŠ¶æ…
453‹ã¸ã®é·ç§»
454 */
455 p_tcb->tstat = TS_RUNNABLE;
456 LOG_TSKSTAT(p_tcb);
457 make_runnable(p_tcb);
458 if (p_runtsk != p_schedtsk) {
459 dispatch();
460 }
461 ercd = E_OK;
462 }
463 else {
464 /*
465 * 二重待
466ち状æ…
467‹ã‹ã‚‰å¾…
468ち状æ…
469‹ã¸ã®é·ç§»
470 */
471 p_tcb->tstat &= ~TS_SUSPENDED;
472 LOG_TSKSTAT(p_tcb);
473 ercd = E_OK;
474 }
475 unlock_cpu();
476
477 error_exit:
478 LOG_RSM_TSK_LEAVE(ercd);
479 return(ercd);
480}
481
482#endif /* TOPPERS_rsm_tsk */
483
484/*
485 * 自タスクの遅
486延
487 */
488#ifdef TOPPERS_dly_tsk
489
490ER
491dly_tsk(RELTIM dlytim)
492{
493 WINFO winfo;
494 TMEVTB tmevtb;
495 ER ercd;
496
497 LOG_DLY_TSK_ENTER(dlytim);
498 CHECK_DISPATCH();
499 CHECK_PAR(VALID_RELTIM(dlytim));
500
501 lock_cpu_dsp();
502 if (p_runtsk->raster) {
503 ercd = E_RASTER;
504 }
505 else {
506 p_runtsk->tstat = TS_WAITING_DLY;
507 make_non_runnable(p_runtsk);
508 p_runtsk->p_winfo = &winfo;
509 winfo.p_tmevtb = &tmevtb;
510 tmevtb.callback = (CBACK) wait_tmout_ok;
511 tmevtb.arg = (void *) p_runtsk;
512 tmevtb_enqueue(&tmevtb, dlytim);
513 LOG_TSKSTAT(p_runtsk);
514 dispatch();
515 ercd = winfo.wercd;
516 }
517 unlock_cpu_dsp();
518
519 error_exit:
520 LOG_DLY_TSK_LEAVE(ercd);
521 return(ercd);
522}
523
524#endif /* TOPPERS_dly_tsk */
Note: See TracBrowser for help on using the repository browser.