source: asp3_wo_tecs/trunk/extension/messagebuf/kernel/task_refer.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: 6.8 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) 2005-2014 by Embedded and Real-Time Systems Laboratory
7 * Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 * 上記著作権者
10は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
11 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
12 * 変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再é…
19å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
20å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
21 * 者
22マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * の無保証規定を掲載すること.
24 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
25 * 用できない形で再é…
26å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
27 * と.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (b) 再é…
33å¸ƒã®å½¢æ…
34‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
35 * 報告すること.
36 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 * 害からも,上記著作権者
38およびTOPPERSプロジェクトをå…
39è²¬ã™ã‚‹ã“と.
40 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
41 * 由に基づく請求からも,上記著作権者
42およびTOPPERSプロジェクトを
43 * å…
44è²¬ã™ã‚‹ã“と.
45 *
46 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
47お
48 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
49 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
50 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
51 * の責任を負わない.
52 *
53 * $Id: task_refer.c 78 2014-04-29 08:00:14Z ertl-hiro $
54 */
55
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#include "eventflag.h"
68#include "dataqueue.h"
69#include "pridataq.h"
70#include "mutex.h"
71#include "messagebuf.h"
72#include "mempfix.h"
73#include "time_event.h"
74
75/*
76 * トレースログマクロのデフォルト定義
77 */
78#ifndef LOG_REF_TSK_ENTER
79#define LOG_REF_TSK_ENTER(tskid, pk_rtsk)
80#endif /* LOG_REF_TSK_ENTER */
81
82#ifndef LOG_REF_TSK_LEAVE
83#define LOG_REF_TSK_LEAVE(ercd, pk_rtsk)
84#endif /* LOG_REF_TSK_LEAVE */
85
86/*
87 * タスクの状æ…
88‹å‚ç…
89§
90 */
91#ifdef TOPPERS_ref_tsk
92
93ER
94ref_tsk(ID tskid, T_RTSK *pk_rtsk)
95{
96 TCB *p_tcb;
97 uint_t tstat;
98 ER ercd;
99
100 LOG_REF_TSK_ENTER(tskid, pk_rtsk);
101 CHECK_TSKCTX_UNL();
102 if (tskid == TSK_SELF) {
103 p_tcb = p_runtsk;
104 }
105 else {
106 CHECK_ID(VALID_TSKID(tskid));
107 p_tcb = get_tcb(tskid);
108 }
109
110 lock_cpu();
111 tstat = p_tcb->tstat;
112 if (TSTAT_DORMANT(tstat)) {
113 /*
114 * 対象タスクが休止状æ…
115‹ã®å ´åˆ
116 */
117 pk_rtsk->tskstat = TTS_DMT;
118 }
119 else {
120 /*
121 * タスク状æ…
122‹ã®å–出し
123 */
124 if (TSTAT_SUSPENDED(tstat)) {
125 if (TSTAT_WAITING(tstat)) {
126 pk_rtsk->tskstat = TTS_WAS;
127 }
128 else {
129 pk_rtsk->tskstat = TTS_SUS;
130 }
131 }
132 else if (TSTAT_WAITING(tstat)) {
133 pk_rtsk->tskstat = TTS_WAI;
134 }
135 else if (p_tcb == p_runtsk) {
136 pk_rtsk->tskstat = TTS_RUN;
137 }
138 else {
139 pk_rtsk->tskstat = TTS_RDY;
140 }
141
142 /*
143 * 現在優å…
144ˆåº¦ã¨ãƒ™ãƒ¼ã‚¹å„ªå…
145ˆåº¦ã®å–出し
146 */
147 pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority);
148 pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->bpriority);
149
150 if (TSTAT_WAITING(tstat)) {
151 /*
152 * 待
153ち要因と待
154ち対象のオブジェクトのIDの取出し
155 */
156 switch (tstat) {
157 case TS_WAITING_SLP:
158 pk_rtsk->tskwait = TTW_SLP;
159 break;
160 case TS_WAITING_DLY:
161 pk_rtsk->tskwait = TTW_DLY;
162 break;
163 case TS_WAITING_SEM:
164 pk_rtsk->tskwait = TTW_SEM;
165 pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo))
166 ->p_semcb);
167 break;
168 case TS_WAITING_FLG:
169 pk_rtsk->tskwait = TTW_FLG;
170 pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo))
171 ->p_flgcb);
172 break;
173 case TS_WAITING_SDTQ:
174 pk_rtsk->tskwait = TTW_SDTQ;
175 pk_rtsk->wobjid = DTQID(((WINFO_SDTQ *)(p_tcb->p_winfo))
176 ->p_dtqcb);
177 break;
178 case TS_WAITING_RDTQ:
179 pk_rtsk->tskwait = TTW_RDTQ;
180 pk_rtsk->wobjid = DTQID(((WINFO_RDTQ *)(p_tcb->p_winfo))
181 ->p_dtqcb);
182 break;
183 case TS_WAITING_SPDQ:
184 pk_rtsk->tskwait = TTW_SPDQ;
185 pk_rtsk->wobjid = PDQID(((WINFO_SPDQ *)(p_tcb->p_winfo))
186 ->p_pdqcb);
187 break;
188 case TS_WAITING_RPDQ:
189 pk_rtsk->tskwait = TTW_RPDQ;
190 pk_rtsk->wobjid = PDQID(((WINFO_RPDQ *)(p_tcb->p_winfo))
191 ->p_pdqcb);
192 break;
193 case TS_WAITING_MTX:
194 pk_rtsk->tskwait = TTW_MTX;
195 pk_rtsk->wobjid = MTXID(((WINFO_MTX *)(p_tcb->p_winfo))
196 ->p_mtxcb);
197 break;
198 case TS_WAITING_SMBF:
199 pk_rtsk->tskwait = TTW_SMBF;
200 pk_rtsk->wobjid = MBFID(((WINFO_SMBF *)(p_tcb->p_winfo))
201 ->p_mbfcb);
202 break;
203 case TS_WAITING_RMBF:
204 pk_rtsk->tskwait = TTW_RMBF;
205 pk_rtsk->wobjid = MBFID(((WINFO_RMBF *)(p_tcb->p_winfo))
206 ->p_mbfcb);
207 break;
208 case TS_WAITING_MPF:
209 pk_rtsk->tskwait = TTW_MPF;
210 pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo))
211 ->p_mpfcb);
212 break;
213 }
214
215 /*
216 * タイムアウトするまでの時間の取出し
217 */
218 if (p_tcb->p_winfo->p_tmevtb != NULL) {
219 pk_rtsk->lefttmo
220 = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb);
221 }
222 else {
223 pk_rtsk->lefttmo = TMO_FEVR;
224 }
225 }
226
227 /*
228 * 起床要求キューイング数の取出し
229 */
230 pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U;
231
232 /*
233 * タスク終了要求状æ…
234‹ã®å–出し
235 */
236 pk_rtsk->raster = p_tcb->raster;
237
238 /*
239 * タスク終了禁止状æ…
240‹ã®å–出し
241 */
242 pk_rtsk->dister = !(p_tcb->enater);
243 }
244
245 /*
246 * 起動要求キューイング数の取出し
247 */
248 pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U;
249 ercd = E_OK;
250 unlock_cpu();
251
252 error_exit:
253 LOG_REF_TSK_LEAVE(ercd, pk_rtsk);
254 return(ercd);
255}
256
257#endif /* TOPPERS_ref_tsk */
Note: See TracBrowser for help on using the repository browser.