source: asp3_tinet_ecnl_arm/trunk/asp3_dcre/kernel/task_refer.c@ 352

Last change on this file since 352 was 352, checked in by coas-nagasima, 6 years ago

arm向けASP3版ECNLを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.6 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 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
10 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
11 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
12 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
13 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
14 * スコード中に含まれていること.
15 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
16 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
17 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
18 * の無保証規定を掲載すること.
19 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
20 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
21 * と.
22 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
23 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
24 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
25 * 報告すること.
26 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
27 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
28 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
29 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
30 * 免責すること.
31 *
32 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
33 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
34 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
35 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
36 * の責任を負わない.
37 *
38 * $Id$
39 */
40
41/*
42 * タスクの状態参照機能
43 */
44
45#include "kernel_impl.h"
46#include "check.h"
47#include "task.h"
48#include "wait.h"
49#include "semaphore.h"
50#include "eventflag.h"
51#include "dataqueue.h"
52#include "pridataq.h"
53#include "mutex.h"
54#include "mempfix.h"
55#include "time_event.h"
56
57/*
58 * トレースログマクロのデフォルト定義
59 */
60#ifndef LOG_REF_TSK_ENTER
61#define LOG_REF_TSK_ENTER(tskid, pk_rtsk)
62#endif /* LOG_REF_TSK_ENTER */
63
64#ifndef LOG_REF_TSK_LEAVE
65#define LOG_REF_TSK_LEAVE(ercd, pk_rtsk)
66#endif /* LOG_REF_TSK_LEAVE */
67
68/*
69 * タスクの状態参照
70 */
71#ifdef TOPPERS_ref_tsk
72
73ER
74ref_tsk(ID tskid, T_RTSK *pk_rtsk)
75{
76 TCB *p_tcb;
77 uint_t tstat;
78 ER ercd;
79
80 LOG_REF_TSK_ENTER(tskid, pk_rtsk);
81 CHECK_TSKCTX_UNL();
82 if (tskid == TSK_SELF) {
83 p_tcb = p_runtsk;
84 }
85 else {
86 CHECK_ID(VALID_TSKID(tskid));
87 p_tcb = get_tcb(tskid);
88 }
89
90 lock_cpu();
91 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
92 ercd = E_NOEXS;
93 }
94 else {
95 tstat = p_tcb->tstat;
96 if (TSTAT_DORMANT(tstat)) {
97 /*
98 * 対象タスクが休止状態の場合
99 */
100 pk_rtsk->tskstat = TTS_DMT;
101 }
102 else {
103 /*
104 * タスク状態の取出し
105 */
106 if (TSTAT_SUSPENDED(tstat)) {
107 if (TSTAT_WAITING(tstat)) {
108 pk_rtsk->tskstat = TTS_WAS;
109 }
110 else {
111 pk_rtsk->tskstat = TTS_SUS;
112 }
113 }
114 else if (TSTAT_WAITING(tstat)) {
115 pk_rtsk->tskstat = TTS_WAI;
116 }
117 else if (p_tcb == p_runtsk) {
118 pk_rtsk->tskstat = TTS_RUN;
119 }
120 else {
121 pk_rtsk->tskstat = TTS_RDY;
122 }
123
124 /*
125 * 現在優先度とベース優先度の取出し
126 */
127 pk_rtsk->tskpri = EXT_TSKPRI(p_tcb->priority);
128 pk_rtsk->tskbpri = EXT_TSKPRI(p_tcb->bpriority);
129
130 if (TSTAT_WAITING(tstat)) {
131 /*
132 * 待ち要因と待ち対象のオブジェクトのIDの取出し
133 */
134 switch (tstat) {
135 case TS_WAITING_SLP:
136 pk_rtsk->tskwait = TTW_SLP;
137 break;
138 case TS_WAITING_DLY:
139 pk_rtsk->tskwait = TTW_DLY;
140 break;
141 case TS_WAITING_SEM:
142 pk_rtsk->tskwait = TTW_SEM;
143 pk_rtsk->wobjid = SEMID(((WINFO_SEM *)(p_tcb->p_winfo))
144 ->p_semcb);
145 break;
146 case TS_WAITING_FLG:
147 pk_rtsk->tskwait = TTW_FLG;
148 pk_rtsk->wobjid = FLGID(((WINFO_FLG *)(p_tcb->p_winfo))
149 ->p_flgcb);
150 break;
151 case TS_WAITING_SDTQ:
152 pk_rtsk->tskwait = TTW_SDTQ;
153 pk_rtsk->wobjid = DTQID(((WINFO_SDTQ *)(p_tcb->p_winfo))
154 ->p_dtqcb);
155 break;
156 case TS_WAITING_RDTQ:
157 pk_rtsk->tskwait = TTW_RDTQ;
158 pk_rtsk->wobjid = DTQID(((WINFO_RDTQ *)(p_tcb->p_winfo))
159 ->p_dtqcb);
160 break;
161 case TS_WAITING_SPDQ:
162 pk_rtsk->tskwait = TTW_SPDQ;
163 pk_rtsk->wobjid = PDQID(((WINFO_SPDQ *)(p_tcb->p_winfo))
164 ->p_pdqcb);
165 break;
166 case TS_WAITING_RPDQ:
167 pk_rtsk->tskwait = TTW_RPDQ;
168 pk_rtsk->wobjid = PDQID(((WINFO_RPDQ *)(p_tcb->p_winfo))
169 ->p_pdqcb);
170 break;
171 case TS_WAITING_MTX:
172 pk_rtsk->tskwait = TTW_MTX;
173 pk_rtsk->wobjid = MTXID(((WINFO_MTX *)(p_tcb->p_winfo))
174 ->p_mtxcb);
175 break;
176 case TS_WAITING_MPF:
177 pk_rtsk->tskwait = TTW_MPF;
178 pk_rtsk->wobjid = MPFID(((WINFO_MPF *)(p_tcb->p_winfo))
179 ->p_mpfcb);
180 break;
181 }
182
183 /*
184 * タイムアウトするまでの時間の取出し
185 */
186 if (p_tcb->p_winfo->p_tmevtb != NULL) {
187 pk_rtsk->lefttmo
188 = (TMO) tmevt_lefttim(p_tcb->p_winfo->p_tmevtb);
189 }
190 else {
191 pk_rtsk->lefttmo = TMO_FEVR;
192 }
193 }
194
195 /*
196 * 起床要求キューイング数の取出し
197 */
198 pk_rtsk->wupcnt = p_tcb->wupque ? 1U : 0U;
199
200 /*
201 * タスク終了要求状態の取出し
202 */
203 pk_rtsk->raster = p_tcb->raster;
204
205 /*
206 * タスク終了禁止状態の取出し
207 */
208 pk_rtsk->dister = !(p_tcb->enater);
209 }
210
211 /*
212 * 起動要求キューイング数の取出し
213 */
214 pk_rtsk->actcnt = p_tcb->actque ? 1U : 0U;
215 ercd = E_OK;
216 }
217 unlock_cpu();
218
219 error_exit:
220 LOG_REF_TSK_LEAVE(ercd, pk_rtsk);
221 return(ercd);
222}
223
224#endif /* TOPPERS_ref_tsk */
Note: See TracBrowser for help on using the repository browser.