source: azure_iot_hub/trunk/asp3_dcre/sample/tSample2.c@ 389

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

ビルドが通るよう更新

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 23.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) 2015-2016 by Ushio Laboratory
7 * Graduate School of Engineering Science, Osaka Univ., JAPAN
8 * Copyright (C) 2015-2016 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16 * スコード中に含まれていること.
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20 * の無保証規定を掲載すること.
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23 * と.
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27 * 報告すること.
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
32 * 免責すること.
33 *
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
38 * の責任を負わない.
39 *
40 * $Id$
41 */
42
43/*
44 * サンプルプログラム(1)の本体
45 *
46 * ASPカーネルの基本的な動作を確認するためのサンプルプログラム.
47 *
48 * プログラムの概要:
49 *
50 * ユーザインタフェースを受け持つメインタスク(タスクID: MAIN_TASK,優
51 * 先度: MAIN_PRIORITY)と,3つの並行実行されるタスク(タスクID:
52 * TASK1~TASK3,初期優先度: MID_PRIORITY)で構成される.また,起動周
53 * 期が2秒の周期ハンドラ(周期ハンドラID: CYCHDR1)を用いる.
54 *
55 * 並行実行されるタスクは,task_loop回空ループを実行する度に,タスクが
56 * 実行中であることをあらわすメッセージを表示する.空ループを実行する
57 * のは,空ループなしでメッセージを出力すると,多量のメッセージが出力
58 * され,プログラムの動作が確認しずらくなるためである.また,低速なシ
59 * リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ
60 * が出力できるように,メッセージの量を制限するという理由もある.
61 *
62 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY,
63 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は,
64 * 周期ハンドラは停止状態になっている.
65 *
66 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を
67 * 待っている間は,並列実行されるタスクが実行されている),入力された
68 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り.
69 * Control-Cまたは'Q'が入力されると,プログラムを終了する.
70 *
71 * '1' : 対象タスクをTASK1に切り換える(初期設定).
72 * '2' : 対象タスクをTASK2に切り換える.
73 * '3' : 対象タスクをTASK3に切り換える.
74 * 'a' : 対象タスクをcTask_activateにより起動する.
75 * 'A' : 対象タスクに対する起動要求をcTask_cancelActivateによりキャンセルする.
76 * 'e' : 対象タスクにexitTaskを呼び出させ,終了させる.
77 * 't' : 対象タスクをcTask_terminateにより強制終了する.
78 * '>' : 対象タスクの優先度をHIGH_PRIORITYにする.
79 * '=' : 対象タスクの優先度をMID_PRIORITYにする.
80 * '<' : 対象タスクの優先度をLOW_PRIORITYにする.
81 * 'G' : 対象タスクの優先度をcTask_getPriorityで読み出す.
82 * 's' : 対象タスクにsleepを呼び出させ,起床待ちにさせる.
83 * 'S' : 対象タスクにsleepTimeout10秒)を呼び出させ,起床待ちにさせる.
84 * 'w' : 対象タスクをcTask_wakeupにより起床する.
85 * 'W' : 対象タスクに対する起床要求をcTask_cancelWakeupによりキャンセルする.
86 * 'l' : 対象タスクをcTask_releaseWaitにより強制的に待ち解除にする.
87 * 'u' : 対象タスクをcTask_suspendにより強制待ち状態にする.
88 * 'm' : 対象タスクの強制待ち状態をcTask_resumeにより解除する.
89 * 'd' : 対象タスクにdelay(10秒)を呼び出させ,時間経過待ちにさせる.
90 * 'x' : 対象タスクにraiseTerminateにより終了要求する.
91 * 'y' : 対象タスクにdisableTerminateを呼び出させ,タスク終了を禁止する.
92 * 'Y' : 対象タスクにenableTerminateを呼び出させ,タスク終了を許可する.
93 * 'r' : 3つの優先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレ
94 * ディキューを回転させる.
95 * 'c' : 周期ハンドラを動作開始させる.
96 * 'C' : 周期ハンドラを動作停止させる.
97 * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
98 * 'B' : アラームハンドラを動作停止させる.
99 * 'z' : 対象タスクにCPU例外を発生させる(タスクを終了させる).
100 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(プログラムを
101 * 終了する).
102 * 'V' : fetchHighResolutionTimerで高分解能タイマを2回読む.
103 * 'v' : 発行したシステムコールを表示する(デフォルト).
104 * 'q' : 発行したシステムコールを表示しない.
105 * 呼び口関数 #_TCPF_#
106 * require port: signature:sKernel context:task
107 * ER getExtendedInformation( intptr_t* p_exinf );
108 * ER sleep( );
109 * ER sleepTimeout( TMO timeout );
110 * ER delay( RELTIM delayTime );
111 * ER exit( );
112 * ER disableTerminate( );
113 * ER enableTerminate( );
114 * bool_t senseTerminate( );
115 * ER setTime( SYSTIM systemTime );
116 * ER getTime( SYSTIM* p_systemTime );
117 * ER adjustTime( int32_t adjustTime );
118 * HRTCNT fetchHighResolutionTimer( );
119 * ER rotateReadyQueue( PRI taskPriority );
120 * ER getTaskId( ID* p_taskId );
121 * ER getLoad( PRI taskPriority, uint_t* p_load );
122 * ER getNthTask( PRI taskPriority, uint_t nth, ID* p_taskID );
123 * ER lockCpu( );
124 * ER unlockCpu( );
125 * ER disableDispatch( );
126 * ER enableDispatch( );
127 * bool_t senseContext( );
128 * bool_t senseLock( );
129 * bool_t senseDispatch( );
130 * bool_t senseDispatchPendingState( );
131 * bool_t senseKernel( );
132 * ER exitKernel( );
133 * ER changeInterruptPriorityMask( PRI interruptPriority );
134 * ER getInterruptPriorityMask( PRI* p_interruptPriority );
135 * require port: signature:siKernel context:non-task
136 * HRTCNT ciKernel_fetchHighResolutionTimer( );
137 * ER ciKernel_rotateReadyQueue( PRI taskPriority );
138 * ER ciKernel_getTaskId( ID* p_taskId );
139 * ER ciKernel_lockCpu( );
140 * ER ciKernel_unlockCpu( );
141 * bool_t ciKernel_senseContext( );
142 * bool_t ciKernel_senseLock( );
143 * bool_t ciKernel_senseDispatch( );
144 * bool_t ciKernel_senseDispatchPendingState( );
145 * bool_t ciKernel_senseKernel( );
146 * ER ciKernel_exitKernel( );
147 * bool_t ciKernel_exceptionSenseDispatchPendingState( const void* p_exceptionInformation );
148 * call port: cTask signature: sTask context:task
149 * ER cTask_activate( subscript );
150 * ER_UINT cTask_cancelActivate( subscript );
151 * ER cTask_getTaskState( subscript, STAT* p_tskstat );
152 * ER cTask_changePriority( subscript, PRI priority );
153 * ER cTask_getPriority( subscript, PRI* p_priority );
154 * ER cTask_refer( subscript, T_RTSK* pk_taskStatus );
155 * ER cTask_wakeup( subscript );
156 * ER_UINT cTask_cancelWakeup( subscript );
157 * ER cTask_releaseWait( subscript );
158 * ER cTask_suspend( subscript );
159 * ER cTask_resume( subscript );
160 * ER cTask_raiseTerminate( subscript );
161 * ER cTask_terminate( subscript );
162 * subscript: 0...(NCP_cTask-1)
163 * call port: cExceptionTask signature: sTask context:task
164 * ER cExceptionTask_activate( );
165 * ER_UINT cExceptionTask_cancelActivate( );
166 * ER cExceptionTask_getTaskState( STAT* p_tskstat );
167 * ER cExceptionTask_changePriority( PRI priority );
168 * ER cExceptionTask_getPriority( PRI* p_priority );
169 * ER cExceptionTask_refer( T_RTSK* pk_taskStatus );
170 * ER cExceptionTask_wakeup( );
171 * ER_UINT cExceptionTask_cancelWakeup( );
172 * ER cExceptionTask_releaseWait( );
173 * ER cExceptionTask_suspend( );
174 * ER cExceptionTask_resume( );
175 * ER cExceptionTask_raiseTerminate( );
176 * ER cExceptionTask_terminate( );
177 * call port: cCyclic signature: sCyclic context:task
178 * ER cCyclic_start( );
179 * ER cCyclic_stop( );
180 * ER cCyclic_refer( T_RCYC* pk_cyclicHandlerStatus );
181 * call port: cAlarm signature: sAlarm context:task
182 * ER cAlarm_start( RELTIM alarmTime );
183 * ER cAlarm_stop( );
184 * ER cAlarm_refer( T_RALM* pk_alarmStatus );
185 * call port: cSerialPort signature: sSerialPort context:task optional:true
186 * bool_t is_cSerialPort_joined() check if joined
187 * ER cSerialPort_open( );
188 * ER cSerialPort_close( );
189 * ER_UINT cSerialPort_read( char* buffer, uint_t length );
190 * ER_UINT cSerialPort_write( const char* buffer, uint_t length );
191 * ER cSerialPort_control( uint_t ioControl );
192 * ER cSerialPort_refer( T_SERIAL_RPOR* pk_rpor );
193 * call port: cSysLog signature: sSysLog context:task
194 * ER cSysLog_write( uint_t priority, const SYSLOG* p_syslog );
195 * ER_UINT cSysLog_read( SYSLOG* p_syslog );
196 * ER cSysLog_mask( uint_t logMask, uint_t lowMask );
197 * ER cSysLog_refer( T_SYSLOG_RLOG* pk_rlog );
198 * ER cSysLog_flush( );
199 * #[</PREAMBLE>]# */
200
201#include "tSample2_tecsgen.h"
202#include <kernel.h>
203#include <t_syslog.h>
204#include <t_stdlib.h>
205#include "kernel_cfg.h"
206#include "tSample2.h"
207
208/*
209 * サービスコールのエラーのログ出力
210 */
211Inline void
212svc_perror(const char *file, int_t line, const char *expr, ER ercd)
213{
214 if (ercd < 0) {
215 t_perror(LOG_ERROR, file, line, expr, ercd);
216 }
217}
218
219#define SVC_PERROR(expr) svc_perror(__FILE__, __LINE__, #expr, (expr))
220
221/*
222 * 並行実行されるタスクへのメッセージ領域
223 */
224char message[3];
225
226/*
227 * ループ回数
228 */
229ulong_t task_loop; /* タスク内でのループ回数 */
230
231/*
232 * 並行実行されるタスク
233 */
234void eSampleTask_main(int_t subscript)
235{
236 volatile ulong_t i;
237 int_t n = 0;
238 int_t tskno = subscript + 1;
239 const char *graph[] = { "|", " +", " *" };
240 char c;
241
242 while (true) {
243 syslog(LOG_NOTICE, "task%d is running (%03d). %s",
244 tskno, ++n, graph[tskno-1]);
245 for (i = 0; i < task_loop; i++);
246 c = message[tskno-1];
247 message[tskno-1] = 0;
248 switch (c) {
249 case 'e':
250 syslog(LOG_INFO, "#%d#exit()", tskno);
251 SVC_PERROR(exit());
252 assert(0);
253 case 's':
254 syslog(LOG_INFO, "#%d#sleep()", tskno);
255 SVC_PERROR(sleep());
256 break;
257 case 'S':
258 syslog(LOG_INFO, "#%d#sleepTimeout(10000)", tskno);
259 SVC_PERROR(sleepTimeout(10000));
260 break;
261 case 'd':
262 syslog(LOG_INFO, "#%d#delay(10000)", tskno);
263 SVC_PERROR(delay(10000));
264 break;
265 case 'y':
266 syslog(LOG_INFO, "#%d#disableTerminate()", tskno);
267 SVC_PERROR(disableTerminate());
268 break;
269 case 'Y':
270 syslog(LOG_INFO, "#%d#enableTerminate()", tskno);
271 SVC_PERROR(enableTerminate());
272 break;
273#ifdef CPUEXC1
274 case 'z':
275 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
276 RAISE_CPU_EXCEPTION;
277 break;
278 case 'Z':
279 SVC_PERROR(lockCpu());
280 syslog(LOG_NOTICE, "#%d#raise CPU exception", tskno);
281 RAISE_CPU_EXCEPTION;
282 SVC_PERROR(unlockCpu());
283 break;
284#endif /* CPUEXC1 */
285 default:
286 break;
287 }
288 }
289}
290
291/*
292 * CPU例外ハンドラ
293 */
294
295ID cpuexc_tskid; /* CPU例外を起こしたタスクのID */
296
297#ifdef CPUEXC1
298
299void
300cpuexc_handler(void *p_excinf)
301{
302
303 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
304 if (ciKernel_senseContext() != true) {
305 syslog(LOG_WARNING,
306 "ciKernel_senseContext() is not true in CPU exception handler.");
307 }
308 if (ciKernel_senseDispatchPendingState() != true) {
309 syslog(LOG_WARNING,
310 "ciKernel_senseDispatchPendingState() is not true in CPU exception handler.");
311 }
312 syslog(LOG_INFO, "ciKernel_senseLock() = %d ciKernel_senseDispatch() = %d ciKernel_exceptionSenseDispatchPendingState() = %d",
313 ciKernel_senseLock(), ciKernel_senseDispatch(), ciKernel_exceptionSenseDispatchPendingState(p_excinf));
314
315 if (ciKernel_exceptionSenseDispatchPendingState(p_excinf)) {
316 syslog(LOG_NOTICE, "Sample program ends with exception.");
317 SVC_PERROR(ciKernel_senseKernel());
318 assert(0);
319 }
320
321#ifdef PREPARE_RETURN_CPUEXC
322 PREPARE_RETURN_CPUEXC;
323 SVC_PERROR(ciKernel_getTaskId(&cpuexc_tskid));
324 cExceptionTask_activate();
325#else /* PREPARE_RETURN_CPUEXC */
326 syslog(LOG_NOTICE, "Sample program ends with exception.");
327 SVC_PERROR(ciKernel_exitKernel());
328 assert(0);
329#endif /* PREPARE_RETURN_CPUEXC */
330}
331
332#endif /* CPUEXC1 */
333
334/*
335 * 周期ハンドラ
336 *
337 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
338 * を回転させる.
339 */
340/* #[<ENTRY_FUNC>]# eiCyclicHandler_main
341 * name: eiCyclicHandler_main
342 * global_name: tSample2_eiCyclicHandler_main
343 * oneway:
344 * #[/ENTRY_FUNC>]# */
345void
346eiCyclicHandler_main()
347{
348 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY));
349 SVC_PERROR(ciKernel_rotateReadyQueue(MID_PRIORITY));
350 SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY));
351}
352
353/*
354 * アラームハンドラ
355 *
356 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
357 * を回転させる.
358 */
359/* #[<ENTRY_FUNC>]# eiAlarmHandler_main
360 * name: eiAlarmHandler_main
361 * global_name: tSample2_eiAlarmHandler_main
362 * oneway:
363 * #[/ENTRY_FUNC>]# */
364void
365eiAlarmHandler_main()
366{
367 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY));
368 SVC_PERROR(ciKernel_rotateReadyQueue(MID_PRIORITY));
369 SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY));
370}
371/*
372 * 例外処理タスク
373 */
374/* #[<ENTRY_FUNC>]# eExceptionTask_main
375 * name: eExceptionTask_main
376 * global_name: tSample2_eExceptionTask_main
377 * oneway:
378 * #[/ENTRY_FUNC>]# */
379void eExceptionTask_main()
380{
381 SVC_PERROR(ras_ter(cpuexc_tskid));
382}
383/*
384 * メインタスク
385 */
386/* 属性の設定 *//* #[<ENTRY_FUNC>]# eMainTask_main
387 * name: eMainTask_main
388 * global_name: tSample2_eMainTask_main
389 * oneway:
390 * #[/ENTRY_FUNC>]# */
391void
392eMainTask_main()
393{
394 char c;
395 volatile ulong_t i;
396 ulong_t j;
397 int_t tskno = 1;
398 ER_UINT ercd;
399 PRI tskpri;
400 SYSTIM stime1, stime2;
401 HRTCNT hrtcnt1, hrtcnt2;
402
403 if (is_cSerialPort_joined()) {
404 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_ERROR)));
405 } else {
406 /*
407 * シリアル出力ができない場合、ログメッセージを全て
408 * 低レベル出力により出力する。
409 */
410 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_DEBUG)));
411 }
412 syslog(LOG_NOTICE, "Sample program starts.");
413
414 /*
415 * シリアルポートの初期化
416 *
417 * システムログタスクと同じシリアルポートを使う場合など,シリアル
418 * ポートがオープン済みの場合にはここでE_OBJエラーになるが,支障は
419 * ない.
420 */
421
422 if (is_cSerialPort_joined()) {
423 ercd = cSerialPort_open();
424 if (ercd < 0 && MERCD(ercd) != E_OBJ) {
425 syslog(LOG_ERROR, "%s (%d) reported by `cSerialPort_open'.",
426 itron_strerror(ercd), SERCD(ercd));
427 }
428 SVC_PERROR(cSerialPort_control(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV));
429 }
430
431 /*
432 * ループ回数の設定
433 *
434 * 並行実行されるタスク内での空ループの回数(task_loop)は,空ルー
435 * プの実行時間が約0.4秒になるように設定する.この設定のために,
436 * LOOP_REF回の空ループの実行時間を,その前後でget_timを呼ぶことで
437 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ回
438 * 数を求め,task_loopに設定する.
439 *
440 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ
441 * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか
442 * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは,
443 * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値
444 * の誤差が大きくなるという問題がある.
445 *
446 * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適
447 * 切な値に定義するのが望ましい.
448 *
449 * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
450 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定を
451 * 行わずに,TASK_LOOPに定義された値を空ループの回数とする.
452 *
453 * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
454 * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE
455 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
456 * を使う.
457 */
458#ifdef TASK_LOOP
459 task_loop = TASK_LOOP;
460#else /* TASK_LOOP */
461
462#ifdef MEASURE_TWICE
463 task_loop = LOOP_REF;
464 SVC_PERROR(get_tim(&stime1));
465 for (i = 0; i < task_loop; i++);
466 SVC_PERROR(get_tim(&stime2));
467#endif /* MEASURE_TWICE */
468
469 task_loop = LOOP_REF;
470 SVC_PERROR(get_tim(&stime1));
471 for (i = 0; i < task_loop; i++);
472 SVC_PERROR(get_tim(&stime2));
473 task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU;
474
475#endif /* TASK_LOOP */
476
477 /*
478 * タスクの起動
479 */
480
481 SVC_PERROR(cTask_activate( 1 ));
482 SVC_PERROR(cTask_activate( 2 ));
483 SVC_PERROR(cTask_activate( 3 ));
484
485 /*
486 * メインループ
487 */
488 if (is_cSerialPort_joined()) {
489 do {
490 SVC_PERROR(cSerialPort_read(&c, 1));
491 switch (c) {
492 case 'e':
493 case 's':
494 case 'S':
495 case 'd':
496 case 'y':
497 case 'Y':
498 case 'z':
499 case 'Z':
500 message[tskno-1] = c;
501 break;
502 case '1':
503 tskno = 1;
504 break;
505 case '2':
506 tskno = 2;
507 break;
508 case '3':
509 tskno = 3;
510 break;
511 case 'a':
512 syslog(LOG_INFO, "#cTask_activate(%d)", tskno);
513 SVC_PERROR(cTask_activate(tskno));
514 break;
515 case 'A':
516 syslog(LOG_INFO, "#cTask_cancelActivate(%d)", tskno);
517 SVC_PERROR(cTask_cancelActivate(tskno));
518
519 if (ercd >= 0) {
520 syslog(LOG_NOTICE, "cTask_cancelActivate(%d) returns %d", tskno, ercd);
521 }
522 break;
523 case 't':
524 syslog(LOG_INFO, "#cTask_terminate(%d)", tskno);
525 SVC_PERROR(cTask_terminate(tskno));
526 break;
527 case '>':
528 syslog(LOG_INFO, "#cTask_changePriority(%d, HIGH_PRIORITY)", tskno);
529 SVC_PERROR(cTask_changePriority(tskno, HIGH_PRIORITY));
530 break;
531 case '=':
532 syslog(LOG_INFO, "#cTask_changePriority(%d, MID_PRIORITY)", tskno);
533 SVC_PERROR(cTask_changePriority(tskno, MID_PRIORITY));
534 break;
535 case '<':
536 syslog(LOG_INFO, "#(cTask_changePriority(%d, LOW_PRIORITY)", tskno);
537 SVC_PERROR(cTask_changePriority(tskno, LOW_PRIORITY));
538 break;
539 case 'G':
540 syslog(LOG_INFO, "#cTask_getPriority(%d, &tskpri)", tskno);
541 SVC_PERROR(ercd = cTask_getPriority(tskno, &tskpri));
542 if (ercd >= 0) {
543 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri);
544 }
545 break;
546 case 'w':
547 syslog(LOG_INFO, "#cTask_wakeup(%d)", tskno);
548 SVC_PERROR(cTask_wakeup(tskno));
549 break;
550 case 'W':
551 syslog(LOG_INFO, "#cTask_cancelWakeup(%d)", tskno);
552 SVC_PERROR(ercd = cTask_cancelWakeup(tskno));
553 if (ercd >= 0) {
554 syslog(LOG_NOTICE, "cTask_cancelWakeup(%d) returns %d", tskno, ercd);
555 }
556 break;
557 case 'l':
558 syslog(LOG_INFO, "#cTask_releaseWait(%d)", tskno);
559 SVC_PERROR(cTask_releaseWait(tskno));
560 break;
561 case 'u':
562 syslog(LOG_INFO, "#cTask_suspend(%d)", tskno);
563 SVC_PERROR(cTask_suspend(tskno));
564 break;
565 case 'm':
566 syslog(LOG_INFO, "#cTask_resume(%d)", tskno);
567 SVC_PERROR(cTask_resume(tskno));
568 break;
569 case 'x':
570 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno);
571 SVC_PERROR(cTask_raiseTerminate(tskno));
572 break;
573 case 'X':
574 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno);
575 SVC_PERROR(cTask_raiseTerminate(tskno));
576 break;
577 case 'r':
578 syslog(LOG_INFO, "#rotateReadyQueue(three priorities)");
579 SVC_PERROR(rotateReadyQueue(HIGH_PRIORITY));
580 SVC_PERROR(rotateReadyQueue(MID_PRIORITY));
581 SVC_PERROR(rotateReadyQueue(LOW_PRIORITY));
582 break;
583 case 'c':
584 syslog(LOG_INFO, "#cCyclic_start(1)");
585 SVC_PERROR(cCyclic_start());
586 break;
587 case 'C':
588 syslog(LOG_INFO, "#cCyclic_stop(1)");
589 SVC_PERROR(cCyclic_stop());
590 break;
591 case 'b':
592 syslog(LOG_INFO, "#cAlarm_start(1, 5000000)");
593 SVC_PERROR(cAlarm_start(5000000));
594 break;
595 case 'B':
596 syslog(LOG_INFO, "#cAlarm_stop()(1)");
597 SVC_PERROR(cAlarm_stop());
598 break;
599 case 'V':
600 hrtcnt1 = fetchHighResolutionTimer();
601 hrtcnt2 = fetchHighResolutionTimer();
602 syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu",
603 hrtcnt1, hrtcnt2);
604 break;
605 case 'v':
606 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO),
607 LOG_UPTO(LOG_EMERG)));
608 break;
609 case 'q':
610 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_NOTICE),
611 LOG_UPTO(LOG_EMERG)));
612 break;
613#ifdef BIT_KERNEL
614 case ' ':
615 SVC_PERROR(lockCpu());
616 {
617 extern ER bit_kernel(void);
618
619 SVC_PERROR(ercd = bit_kernel());
620 if (ercd >= 0) {
621 syslog(LOG_NOTICE, "bit_kernel passed.");
622 }
623 }
624 SVC_PERROR(unlockCpu());
625 break;
626#endif /* BIT_KERNEL */
627
628 default:
629 break;
630 }
631 } while (c != '\003' && c != 'Q');
632 } else {
633 syslog(LOG_NOTICE, "cSerialPort of tSample2 is not joined.");
634 syslog(LOG_NOTICE, "Sample program will halt after 40 seconds.");
635 for (j = 0; j < 100; j++) {
636 for (i = 0; i < task_loop; i++);
637 }
638 }
639
640 syslog(LOG_NOTICE, "Sample program ends.");
641 SVC_PERROR(ciKernel_exitKernel());
642 assert(0);
643}
Note: See TracBrowser for help on using the repository browser.