source: EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.c@ 270

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

mruby版ECNLプロトタイピング・ツールを追加

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