source: asp3_wo_tecs/trunk/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.4 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 69 2014-04-28 19:26:49Z 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 "mempfix.h"
72#include "time_event.h"
73
74/*
75 * トレースログマクロのデフォルト定義
76 */
77#ifndef LOG_REF_TSK_ENTER
78#define LOG_REF_TSK_ENTER(tskid, pk_rtsk)
79#endif /* LOG_REF_TSK_ENTER */
80
81#ifndef LOG_REF_TSK_LEAVE
82#define LOG_REF_TSK_LEAVE(ercd, pk_rtsk)
83#endif /* LOG_REF_TSK_LEAVE */
84
85/*
86 * タスクの状æ…
87‹å‚ç…
88§
89 */
90#ifdef TOPPERS_ref_tsk
91
92ER
93ref_tsk(ID tskid, T_RTSK *pk_rtsk)
94{
95 TCB *p_tcb;
96 uint_t tstat;
97 ER ercd;
98
99 LOG_REF_TSK_ENTER(tskid, pk_rtsk);
100 CHECK_TSKCTX_UNL();
101 if (tskid == TSK_SELF) {
102 p_tcb = p_runtsk;
103 }
104 else {
105 CHECK_ID(VALID_TSKID(tskid));
106 p_tcb = get_tcb(tskid);
107 }
108
109 lock_cpu();
110 tstat = p_tcb->tstat;
111 if (TSTAT_DORMANT(tstat)) {
112 /*
113 * 対象タスクが休止状æ…
114‹ã®å ´åˆ
115 */
116 pk_rtsk->tskstat = TTS_DMT;
117 }
118 else {
119 /*
120 * タスク状æ…
121‹ã®å–出し
122 */
123 if (TSTAT_SUSPENDED(tstat)) {
124 if (TSTAT_WAITING(tstat)) {
125 pk_rtsk->tskstat = TTS_WAS;
126 }
127 else {
128 pk_rtsk->tskstat = TTS_SUS;
129 }
130 }
131 else if (TSTAT_WAITING(tstat)) {
132 pk_rtsk->tskstat = TTS_WAI;
133 }
134 else if (p_tcb == p_runtsk) {
135 pk_rtsk->tskstat = TTS_RUN;
136 }
137 else {
138 pk_rtsk->tskstat = TTS_RDY;
139 }
140
141 /*
142 * 現在優å…
143ˆåº¦ã¨ãƒ™ãƒ¼ã‚¹å„ªå…
144ˆåº¦ã®å–出し
145 */
146 pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority);
147 pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->bpriority);
148
149 if (TSTAT_WAITING(tstat)) {
150 /*
151 * 待
152ち要因と待
153ち対象のオブジェクトのIDの取出し
154 */
155 switch (tstat) {
156 case TS_WAITING_SLP:
157 pk_rtsk->tskwait = TTW_SLP;
158 break;
159 case TS_WAITING_DLY:
160 pk_rtsk->tskwait = TTW_DLY;
161 break;
162 case TS_WAITING_SEM:
163 pk_rtsk->tskwait = TTW_SEM;
164 pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo))
165 ->p_semcb);
166 break;
167 case TS_WAITING_FLG:
168 pk_rtsk->tskwait = TTW_FLG;
169 pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo))
170 ->p_flgcb);
171 break;
172 case TS_WAITING_SDTQ:
173 pk_rtsk->tskwait = TTW_SDTQ;
174 pk_rtsk->wobjid = DTQID(((WINFO_SDTQ *)(p_tcb->p_winfo))
175 ->p_dtqcb);
176 break;
177 case TS_WAITING_RDTQ:
178 pk_rtsk->tskwait = TTW_RDTQ;
179 pk_rtsk->wobjid = DTQID(((WINFO_RDTQ *)(p_tcb->p_winfo))
180 ->p_dtqcb);
181 break;
182 case TS_WAITING_SPDQ:
183 pk_rtsk->tskwait = TTW_SPDQ;
184 pk_rtsk->wobjid = PDQID(((WINFO_SPDQ *)(p_tcb->p_winfo))
185 ->p_pdqcb);
186 break;
187 case TS_WAITING_RPDQ:
188 pk_rtsk->tskwait = TTW_RPDQ;
189 pk_rtsk->wobjid = PDQID(((WINFO_RPDQ *)(p_tcb->p_winfo))
190 ->p_pdqcb);
191 break;
192 case TS_WAITING_MTX:
193 pk_rtsk->tskwait = TTW_MTX;
194 pk_rtsk->wobjid = MTXID(((WINFO_MTX *)(p_tcb->p_winfo))
195 ->p_mtxcb);
196 break;
197 case TS_WAITING_MPF:
198 pk_rtsk->tskwait = TTW_MPF;
199 pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo))
200 ->p_mpfcb);
201 break;
202 }
203
204 /*
205 * タイムアウトするまでの時間の取出し
206 */
207 if (p_tcb->p_winfo->p_tmevtb != NULL) {
208 pk_rtsk->lefttmo
209 = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb);
210 }
211 else {
212 pk_rtsk->lefttmo = TMO_FEVR;
213 }
214 }
215
216 /*
217 * 起床要求キューイング数の取出し
218 */
219 pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U;
220
221 /*
222 * タスク終了要求状æ…
223‹ã®å–出し
224 */
225 pk_rtsk->raster = p_tcb->raster;
226
227 /*
228 * タスク終了禁止状æ…
229‹ã®å–出し
230 */
231 pk_rtsk->dister = !(p_tcb->enater);
232 }
233
234 /*
235 * 起動要求キューイング数の取出し
236 */
237 pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U;
238 ercd = E_OK;
239 unlock_cpu();
240
241 error_exit:
242 LOG_REF_TSK_LEAVE(ercd, pk_rtsk);
243 return(ercd);
244}
245
246#endif /* TOPPERS_ref_tsk */
Note: See TracBrowser for help on using the repository browser.