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