source: azure_iot_hub_f767zi/trunk/asp_baseplatform/monitor/task_expansion.c@ 457

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

ファイルを追加

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 9.9 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) 2003-2012 by Ryosuke Takeuchi
7 * GJ Business Division RICOH COMPANY,LTD. JAPAN
8 *
9 * 上記著作権者は,Free Software Foundation によって公表されている
10 * GNU General Public License の Version 2 に記述されている条件か,以
11 * 下の(1)~(4)の条件を満たす場合に限り,本ソフトウェア(本ソフトウェ
12 * アを改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13 * 利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを再利用可能なバイナリコード(リロケータブルオブ
18 * ジェクトファイルやライブラリなど)の形で利用する場合には,利用
19 * に伴うドキュメント(利用者マニュアルなど)に,上記の著作権表示,
20 * この利用条件および下記の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを再利用不可能なバイナリコードの形または機器に組
22 * み込んだ形で利用する場合には,次のいずれかの条件を満たすこと.
23 * (a) 利用に伴うドキュメント(利用者マニュアルなど)に,上記の著作
24 * 権表示,この利用条件および下記の無保証規定を掲載すること.
25 * (b) 利用の形態を,別に定める方法によって,上記著作権者に報告する
26 * こと.
27 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
28 * 害からも,上記著作権者を免責すること.
29 *
30 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者は,
31 * 本ソフトウェアに関して,その適用可能性も含めて,いかなる保証も行わ
32 * ない.また,本ソフトウェアの利用により直接的または間接的に生じたい
33 * かなる損害に関しても,その責任を負わない.
34 *
35 * @(#) $Id$
36 */
37
38/*
39 * TOPPERS/ASP用タスク管理拡張機能
40 */
41
42#include "kernel_impl.h"
43#include "check.h"
44#include "task.h"
45#include "task_expansion.h"
46#include "kernel_cfg.h"
47#include "target_timer.h"
48
49/*
50 * コンテクスト中からの強制待ち状態への移行
51 */
52ER
53isus_tsk(ID tskid)
54{
55 TCB *tcb;
56 UINT tstat;
57 ER ercd;
58
59 CHECK_INTCTX_UNL();
60 CHECK_TSKID(tskid);
61 tcb = get_tcb(tskid);
62
63 i_lock_cpu();
64 if (TSTAT_DORMANT(tstat = tcb->tstat)) {
65 ercd = E_OBJ;
66 }
67 else if (TSTAT_RUNNABLE(tstat)) {
68 /*
69 * 実行できる状態から強制待ち状態への遷移
70 */
71 tcb->tstat = TS_SUSPENDED;
72 if (make_non_runnable(tcb)) {
73 reqflg = TRUE;
74 }
75 ercd = E_OK;
76 }
77 else if (TSTAT_SUSPENDED(tstat)) {
78 ercd = E_QOVR;
79 }
80 else {
81 /*
82 * 待ち状態から二重待ち状態への遷移
83 */
84 tcb->tstat |= TS_SUSPENDED;
85 ercd = E_OK;
86 }
87 i_unlock_cpu();
88
89 error_exit:
90 return(ercd);
91}
92
93/*
94 * タスク状態参照(簡易版)
95 */
96ER
97ref_tst(ID tskid, T_RTST *pk_rtst)
98{
99 TCB *tcb;
100 UB tstat;
101 ER ercd;
102
103 CHECK_TSKCTX_UNL();
104 CHECK_TSKID_SELF(tskid);
105 tcb = get_tcb_self(tskid);
106
107 t_lock_cpu();
108 pk_rtst->tskwait = 0;
109 pk_rtst->tskpri = EXT_TSKPRI(tcb->priority);
110#ifdef USE_TSKINICTXB
111 pk_rtst->inistk = (VP)tcb->p_tinib->tskinictxb.stk_bottom;
112 pk_rtst->inistksz = tcb->p_tinib->tskinictxb.stksz;
113#else
114 pk_rtst->inistk = (VP)tcb->p_tinib->stk;
115 pk_rtst->inistksz = tcb->p_tinib->stksz;
116#endif
117
118 tstat = tcb->tstat;
119 if (TSTAT_RUNNABLE(tstat)) {
120 if (tcb == p_runtsk) {
121 pk_rtst->tskstat = TTS_RUN;
122 }
123 else {
124 pk_rtst->tskstat = TTS_RDY;
125 }
126 }
127 else if (TSTAT_WAITING(tstat)) {
128 if (TSTAT_SUSPENDED(tstat)) {
129 pk_rtst->tskstat = TTS_WAS;
130 }
131 else {
132 pk_rtst->tskstat = TTS_WAI;
133 }
134 if ((tstat & TS_WAIT_MASK) == TS_WAIT_DLY) {
135 pk_rtst->tskwait = TTW_DLY;
136 }
137 else if ((tstat & TS_WAIT_MASK) == TS_WAIT_SLP) {
138 pk_rtst->tskwait = TTW_SLP;
139 }
140 else if ((tstat & TS_WAIT_MASK) == TS_WAIT_RDTQ) {
141 pk_rtst->tskwait = TTW_RDTQ;
142 }
143 else {
144 pk_rtst->tskwait = TTW_OTHR;
145 }
146 }
147 else if (TSTAT_SUSPENDED(tstat)) {
148 pk_rtst->tskstat = TTS_SUS;
149 }
150 else {
151 pk_rtst->tskstat = TTS_DMT;
152 }
153 if (pk_rtst->tskstat == TTS_DMT)
154 pk_rtst->tskpc = (FP)tcb->p_tinib->task;
155 else
156 pk_rtst->tskpc = (FP)tcb->tskctxb.pc;
157 pk_rtst->tsksp = (VP)tcb->tskctxb.sp;
158 ercd = E_OK;
159 t_unlock_cpu();
160
161 error_exit:
162 return(ercd);
163}
164
165/*
166 * タスク状態のロギング格納領域
167 */
168static T_TLOG tsk_log[MAX_TASK_LOG+1];
169static uint32_t check_tskid;
170static SYSTIM check_time;
171static SYSTIM pervious_time;
172
173/*
174 * システム時間取り出し関数
175 * 割込み中でも使用でき、共通化できるように
176 * インライン関数とする.
177 */
178Inline SYSTIM get_systime(void)
179{
180 return next_time;
181}
182
183/*
184 * タスクの実測時間測定用の時間
185 * 取り出し関数、CPUロック状態で呼び出す.
186 */
187Inline SYSTIM get_anatime(void)
188{
189 SYSTIM time;
190#if TIC_DENO != 1
191 INT subtime;
192#endif /* TIC_DENO != 1 */
193 CLOCK clock1, clock2;
194 BOOL ireq;
195
196 /*
197 * 時間の取り出しはコンテキスト中でも行われるので
198 * get_utmと同等の記述をここにおく。
199 */
200#if TIC_DENO != 1
201 subtime = (INT) next_subtime;
202#endif /* TIC_DENO != 1 */
203 clock1 = target_timer_get_current();
204 ireq = target_timer_probe_int();
205 clock2 = target_timer_get_current();
206
207 time = get_systime() * ANA_STIC;
208#if TIC_DENO != 1
209 time += subtime * ANA_STIC / TIC_DENO;
210#endif /* TIC_DENO != 1 */
211 if (!(ireq) || clock1 > clock2) {
212 time -= TIC_NUME * ANA_STIC / TIC_DENO;
213 }
214 time += clock1 * ANA_STIC / TIMER_CLOCK;
215 return time;
216}
217
218/*
219 * タスク実行領域設定関数
220 * この関数はdispatchの開始時、CPUロック状態で呼び出す.
221 * STM32F746はこの関数を複雑にするとハングアップ時間の方はあきらめる.
222 */
223void log_dsp_enter(TCB *runtsk)
224{
225#if !defined(TOPPERS_ARM_M) || defined(TOPPERS_STM32F4_DISCOVERY)
226 SYSTIM time = get_systime();
227#endif /* ROI DEBUG */
228 T_TLOG *t;
229
230 if(check_tskid < MAX_TASK_LOG)
231 t = &tsk_log[check_tskid];
232 else
233 t = &tsk_log[MAX_TASK_LOG];
234#if !defined(TOPPERS_ARM_M) || defined(TOPPERS_STM32F4_DISCOVERY)
235 t->runtimes += time - check_time;
236 check_time = time;
237#endif
238 if(p_schedtsk == 0){
239 check_tskid = 0;
240#if defined(TOPPERS_ARM_M) && !defined(TOPPERS_STM32F4_DISCOVERY)
241 t->runtimes += 2;
242// check_time += 2;
243#endif
244 }
245}
246
247/*
248 * タスク実行領域設定関数
249 * この関数はdispatchの終了時時、CPUロック状態で呼び出す.
250 */
251void log_dsp_leave(TCB *runtsk)
252{
253 SYSTIM time = get_anatime();
254 T_TLOG *t;
255
256 if(check_tskid < MAX_TASK_LOG)
257 t = &tsk_log[check_tskid];
258 else
259 t = &tsk_log[MAX_TASK_LOG];
260 t->runtimes += time - check_time;
261
262 if(runtsk){
263 check_tskid = TSKID(runtsk);
264 t = &tsk_log[check_tskid];
265 t->runcount++;
266 }
267 else
268 check_tskid = 0;
269 check_time = time;
270}
271
272/*
273 * タスクログ状態取り出し関数
274 */
275int_t get_tsklog(T_TPRM * pprm)
276{
277 INT no;
278 INT num_item=0;
279
280 get_tim(&pprm->currtime);
281 t_lock_cpu();
282 pprm->pervtime = pervious_time;
283 pervious_time = pprm->currtime;
284 for(no = 0 ; no <= tmax_tskid && no <= MAX_TASK_LOG ; no++){
285 if(no < NUM_LDSP){
286 pprm->tlog[no] = tsk_log[no];
287 num_item = no;
288 }
289 else{
290 pprm->tlog[1].runcount += tsk_log[no].runcount;
291 pprm->tlog[1].runtimes += tsk_log[no].runtimes;
292 num_item = NUM_LDSP-1;
293 }
294 tsk_log[no].runcount = 0;
295 tsk_log[no].runtimes = 0;
296 }
297 t_unlock_cpu();
298 return num_item;
299}
300
301
302/*
303 * デバイス・ポートのログアウト要求判定用データ領域
304 */
305
306static T_PCHK port_log[NUM_PCHK];
307
308/*
309 * デバイスログを行うかどうかの判定
310 */
311static uint_t check_device_log(ulong_t address, ulong_t size)
312{
313 int i;
314 T_PCHK *p;
315
316 for(i = 0 ; i < NUM_PCHK ; i++){
317 p = &port_log[i];
318 if(p->portaddress >= address && p->portaddress < (address+size) && p->logtype)
319 return (UINT)p->logtype;
320 }
321 return 0;
322}
323
324/*
325 * デバイス・ポートのログ判定データの取り出し
326 */
327T_PCHK *get_device_log(ulong_t no){
328 if(no < NUM_PCHK)
329 return &port_log[no];
330 else
331 return 0;
332}
333
334/*
335 * デバイス読み出し表示判定とログアウト関数
336 */
337void
338ana_rdv(ulong_t address, ulong_t data, int_t size)
339{
340 SYSTIM time = get_systime();
341 ID id;
342 uint_t logtype = check_device_log(address, size);
343
344 if(logtype == 0)
345 return;
346 if(sense_context() || !p_runtsk)
347 syslog_3(logtype, "Device Read time=%09d interrupt port=%08x data=0x%x", time, address, data);
348 else{
349 id = TSKID(p_runtsk);
350 switch(size){
351 case 4:
352 syslog_4(logtype, "Device Read time=%09d task=%04d port=%08x data=%08x", time, id, address, data);
353 break;
354 case 2:
355 syslog_4(logtype, "Device Read time=%09d task=%04d port=%08x data=%04x", time, id, address, data);
356 break;
357 default:
358 syslog_4(logtype, "Device Read time=%09d task=%04d port=%08x data=%02x", time, id, address, data);
359 break;
360 }
361 }
362}
363
364/*
365 * デバイス書き込み表示判定とログアウト関数
366 */
367void
368ana_wdv(ulong_t address, ulong_t data, int_t size)
369{
370 SYSTIM time = get_systime();
371 ID id;
372 uint_t logtype = check_device_log(address, size);
373
374 if(logtype == 0)
375 return;
376 if(sense_context() || !p_runtsk)
377 syslog_3(logtype, "Device Write time=%09d interrupt port=%08x data=0x%x", time, address, data);
378 else{
379 id = TSKID(p_runtsk);
380 switch(size){
381 case 4:
382 syslog_4(logtype, "Device Write time=%09d task=%04d port=%08x data=%08x", time, id, address, data);
383 break;
384 case 2:
385 syslog_4(logtype, "Device Write time=%09d task=%04d port=%08x data=%04x", time, id, address, data);
386 break;
387 default:
388 syslog_4(logtype, "Device Write time=%09d task=%04d port=%08x data=%02x", time, id, address, data);
389 break;
390 }
391 }
392}
393
Note: See TracBrowser for help on using the repository browser.