Changeset 429 for EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.c
- Timestamp:
- Jul 3, 2020, 7:19:17 PM (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.c
r321 r429 3 3 * Toyohashi Open Platform for Embedded Real-Time Systems/ 4 4 * Advanced Standard Profile Kernel 5 * 5 * 6 6 * Copyright (C) 2015-2016 by Ushio Laboratory 7 7 * Graduate School of Engineering Science, Osaka Univ., JAPAN 8 * Copyright (C) 2015-201 6by Embedded and Real-Time Systems Laboratory8 * Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory 9 9 * Graduate School of Information Science, Nagoya Univ., JAPAN 10 10 * … … 42 42 43 43 /* 44 * サンプルプログラム( 1)の本体45 * 46 * ASPカーネルの基本的な動作を確認するためのサンプルプログラム .44 * サンプルプログラム(2)の本体 45 * 46 * ASPカーネルの基本的な動作を確認するためのサンプルプログラム(TECS版). 47 47 * 48 48 * プログラムの概要: 49 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 * され,プログラムの動作が確認しずらくなるためである.また,低速なシ50 * ユーザインタフェースを受け持つメインタスク(MainTask)と,3つの並 51 * 行実行されるタスク(Task1~Task3),例外処理タスク(ExceptionTask) 52 * の5つのタスクを用いる.これらの他に,システムログタスクが動作する. 53 * また,周期ハンドラ,アラームハンドラ,割込みサービスルーチン,CPU 54 * 例外ハンドラをそれぞれ1つ用いる. 55 * 56 * 並行実行されるタスクは,task_loop回のループを実行する度に,タスク 57 * が実行中であることをあらわすメッセージを表示する.ループを実行する 58 * のは,プログラムの動作を確認しやすくするためである.また,低速なシ 59 59 * リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ 60 60 * が出力できるように,メッセージの量を制限するという理由もある. 61 61 * 62 * 周期ハンドラは,三つの優先度(HIGH_PRIORITY,MID_PRIORITY, 63 * LOW_PRIORITY)のレディキューを回転させる.プログラムの起動直後は, 64 * 周期ハンドラは停止状態になっている. 65 * 66 * メインタスクは,シリアルI/Oポートからの文字入力を行い(文字入力を 67 * 待っている間は,並列実行されるタスクが実行されている),入力された 68 * 文字に対応した処理を実行する.入力された文字と処理の関係は次の通り. 62 * 周期ハンドラ,アラームハンドラ,割込みサービスルーチンは,3つの優 63 * 先度(HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY)のレディキューを 64 * 回転させる.周期ハンドラは,プログラムの起動直後は停止状態になって 65 * いる. 66 * 67 * CPU例外ハンドラは,CPU例外からの復帰が可能な場合には,例外処理タス 68 * クを起動する.例外処理タスクは,CPU例外を起こしたタスクに対して, 69 * 終了要求を行う. 70 * 71 * メインタスクは,シリアルポートからの文字入力を行い(文字入力を待っ 72 * ている間は,並行実行されるタスクが実行されている),入力された文字 73 * に対応した処理を実行する.入力された文字と処理の関係は次の通り. 69 74 * Control-Cまたは'Q'が入力されると,プログラムを終了する. 70 75 * … … 97 102 * 'b' : アラームハンドラを5秒後に起動するよう動作開始させる. 98 103 * 'B' : アラームハンドラを動作停止させる. 99 * 'z' : 対象タスクにCPU例外を発生させる(タ スクを終了させる).100 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる( プログラムを101 * 終了する).102 * 'V' : fetchHighResolutionTimerで高分解能タイマを2回読む.104 * 'z' : 対象タスクにCPU例外を発生させる(ターゲットによっては復帰可能). 105 * 'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(復帰不可能). 106 * 'V' : 短いループを挟んで,fetchHighResolutionTimerで高分解能タイマを 107 * 2回読む. 103 108 * 'v' : 発行したシステムコールを表示する(デフォルト). 104 109 * '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>]# */ 110 */ 200 111 201 112 #include "tSample2_tecsgen.h" … … 220 131 221 132 /* 133 * プロセッサ時間の消費 134 * 135 * ループによりプロセッサ時間を消費する.最適化ができないように,ルー 136 * プ内でvolatile変数を読み込む. 137 */ 138 static volatile long_t volatile_var; 139 140 static void 141 consume_time(ulong_t ctime) 142 { 143 ulong_t i; 144 145 for (i = 0; i < ctime; i++) { 146 (void) volatile_var; 147 } 148 } 149 150 /* 222 151 * 並行実行されるタスクへのメッセージ領域 223 152 */ … … 232 161 * 並行実行されるタスク 233 162 */ 234 void eSampleTask_main(int_t subscript)235 { 236 volatile ulong_t i; 163 void 164 eSampleTask_main(int_t subscript) 165 { 237 166 int_t n = 0; 238 167 int_t tskno = subscript + 1; … … 243 172 syslog(LOG_NOTICE, "task%d is running (%03d). %s", 244 173 tskno, ++n, graph[tskno-1]); 245 for (i = 0; i < task_loop; i++);174 consume_time(task_loop); 246 175 c = message[tskno-1]; 247 176 message[tskno-1] = 0; … … 290 219 291 220 /* 221 * 割込みサービスルーチン 222 * 223 * HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー 224 * を回転させる. 225 */ 226 #ifdef INTNO1 227 228 void 229 eiISR_main(void) 230 { 231 intno1_clear(); 232 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY)); 233 SVC_PERROR(ciKernel_rotateReadyQueue(MID_PRIORITY)); 234 SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY)); 235 } 236 237 #endif /* INTNO1 */ 238 239 /* 292 240 * CPU例外ハンドラ 293 241 */ 294 295 242 ID cpuexc_tskid; /* CPU例外を起こしたタスクのID */ 296 243 … … 298 245 299 246 void 300 cpuexc_handler(void *p_excinf)247 eiCpuExceptionHandler_main(const void *p_excinf) 301 248 { 302 249 303 250 syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf); 304 251 if (ciKernel_senseContext() != true) { 305 syslog(LOG_WARNING, 306 "ciKernel_senseContext() is not truein CPU exception handler.");252 syslog(LOG_WARNING, "ciKernel_senseContext() is not true" 253 " in CPU exception handler."); 307 254 } 308 255 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)); 256 syslog(LOG_WARNING, "ciKernel_senseDispatchPendingState() is not true" 257 " in CPU exception handler."); 258 } 259 syslog(LOG_INFO, "ciKernel_senseLock() = %d, ciKernel_senseDispatch() = %d", 260 ciKernel_senseLock(), ciKernel_senseDispatch()); 261 syslog(LOG_INFO, "ciKernel_exceptionSenseDispatchPendingState() = %d", 262 ciKernel_exceptionSenseDispatchPendingState(p_excinf)); 314 263 315 264 if (ciKernel_exceptionSenseDispatchPendingState(p_excinf)) { 316 265 syslog(LOG_NOTICE, "Sample program ends with exception."); 317 SVC_PERROR(ciKernel_ senseKernel());266 SVC_PERROR(ciKernel_exitKernel()); 318 267 assert(0); 319 268 } 320 269 321 #ifdef PREPARE_RETURN_CPUEXC322 PREPARE_RETURN_CPUEXC;323 270 SVC_PERROR(ciKernel_getTaskId(&cpuexc_tskid)); 324 271 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 272 } 331 273 … … 338 280 * を回転させる. 339 281 */ 340 /* #[<ENTRY_FUNC>]# eiCyclicHandler_main 341 * name: eiCyclicHandler_main 342 * global_name: tSample2_eiCyclicHandler_main 343 * oneway: 344 * #[/ENTRY_FUNC>]# */ 345 void 346 eiCyclicHandler_main() 282 void 283 eiCyclicHandler_main(void) 347 284 { 348 285 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY)); … … 357 294 * を回転させる. 358 295 */ 359 /* #[<ENTRY_FUNC>]# eiAlarmHandler_main 360 * name: eiAlarmHandler_main 361 * global_name: tSample2_eiAlarmHandler_main 362 * oneway: 363 * #[/ENTRY_FUNC>]# */ 364 void 365 eiAlarmHandler_main() 296 void 297 eiAlarmHandler_main(void) 366 298 { 367 299 SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY)); … … 369 301 SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY)); 370 302 } 303 371 304 /* 372 305 * 例外処理タスク 373 306 */ 374 /* #[<ENTRY_FUNC>]# eExceptionTask_main 375 * name: eExceptionTask_main 376 * global_name: tSample2_eExceptionTask_main 377 * oneway: 378 * #[/ENTRY_FUNC>]# */ 379 void eExceptionTask_main() 307 void 308 eExceptionTask_main(void) 380 309 { 381 310 SVC_PERROR(ras_ter(cpuexc_tskid)); 382 311 } 312 383 313 /* 384 314 * メインタスク 385 315 */ 386 /* 属性の設定 *//* #[<ENTRY_FUNC>]# eMainTask_main 387 * name: eMainTask_main 388 * global_name: tSample2_eMainTask_main 389 * oneway: 390 * #[/ENTRY_FUNC>]# */ 391 void 392 eMainTask_main() 316 void 317 eMainTask_main(void) 393 318 { 394 319 char c; 395 volatile ulong_t i;396 ulong_t j;397 320 int_t tskno = 1; 398 321 ER_UINT ercd; 399 322 PRI tskpri; 323 #ifndef TASK_LOOP 400 324 SYSTIM stime1, stime2; 325 #endif /* TASK_LOOP */ 401 326 HRTCNT hrtcnt1, hrtcnt2; 402 327 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 } 328 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), LOG_UPTO(LOG_EMERG))); 412 329 syslog(LOG_NOTICE, "Sample program starts."); 413 330 … … 419 336 * ない. 420 337 */ 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 } 338 ercd = cSerialPort_open(); 339 if (ercd < 0 && MERCD(ercd) != E_OBJ) { 340 syslog(LOG_ERROR, "%s (%d) reported by `cSerialPort_open'.", 341 itron_strerror(ercd), SERCD(ercd)); 342 } 343 SVC_PERROR(cSerialPort_control(IOCTL_CRLF | IOCTL_FCSND | IOCTL_FCRCV)); 430 344 431 345 /* 432 346 * ループ回数の設定 433 347 * 434 * 並行実行されるタスク内での 空ループの回数(task_loop)は,空ルー435 * プの実行時間が約0.4秒になるように設定する.この設定のために,436 * LOOP_REF回の 空ループの実行時間を,その前後でget_timを呼ぶことで437 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ 回438 * 数を求め,task_loopに設定する.348 * 並行実行されるタスク内でのループの回数(task_loop)は,ループ 349 * の実行時間が約0.4秒になるように設定する.この設定のために, 350 * LOOP_REF回のループの実行時間を,その前後でgetTimeを呼ぶことで 351 * 測定し,その測定結果から空ループの実行時間が0.4秒になるループ 352 * 回数を求め,task_loopに設定する. 439 353 * 440 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ 441 * り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか 442 * りすぎるという問題を生じる.逆に想定したより速いプロセッサでは, 443 * LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値 444 * の誤差が大きくなるという問題がある. 445 * 446 * そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適 447 * 切な値に定義するのが望ましい. 354 * LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定した 355 * より遅いプロセッサでは,サンプルプログラムの実行開始に時間がか 356 * かりすぎるという問題を生じる.逆に想定したより速いプロセッサで 357 * は,LOOP_REF回のループの実行時間が短くなり,task_loopに設定す 358 * る値の誤差が大きくなるという問題がある.そこで,そのようなター 359 * ゲットでは,target_test.hで,LOOP_REFを適切な値に定義すること 360 * とする. 448 361 * 449 362 * また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ 450 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定 を451 * 行わずに,TASK_LOOPに定義された値を空ループの回数とする.363 * クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定 364 * を行わずに,TASK_LOOPに定義された値をループの回数とする. 452 365 * 453 * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ454 * りも長めになるものがある.このようなターゲットでは,MEASURE_TWICE455 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果456 * を使う.366 * ターゲットによっては,ループの実行時間の1回目の測定で,本来より 367 * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE 368 * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結 369 * 果を使う. 457 370 */ 458 371 #ifdef TASK_LOOP … … 461 374 462 375 #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)); 376 SVC_PERROR(getTime(&stime1)); 377 consume_time(LOOP_REF); 378 SVC_PERROR(getTime(&stime2)); 467 379 #endif /* MEASURE_TWICE */ 468 380 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)); 381 SVC_PERROR(getTime(&stime1)); 382 consume_time(LOOP_REF); 383 SVC_PERROR(getTime(&stime2)); 473 384 task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU; 474 385 … … 478 389 * タスクの起動 479 390 */ 480 481 SVC_PERROR(cTask_activate( 1 )); 482 SVC_PERROR(cTask_activate( 2 )); 483 SVC_PERROR(cTask_activate( 3 )); 391 SVC_PERROR(cTask_activate(1)); 392 SVC_PERROR(cTask_activate(2)); 393 SVC_PERROR(cTask_activate(3)); 484 394 485 395 /* 486 396 * メインループ 487 397 */ 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; 398 do { 399 SVC_PERROR(cSerialPort_read(&c, 1)); 400 switch (c) { 401 case 'e': 402 case 's': 403 case 'S': 404 case 'd': 405 case 'y': 406 case 'Y': 407 case 'z': 408 case 'Z': 409 message[tskno-1] = c; 410 break; 411 case '1': 412 tskno = 1; 413 break; 414 case '2': 415 tskno = 2; 416 break; 417 case '3': 418 tskno = 3; 419 break; 420 case 'a': 421 syslog(LOG_INFO, "#cTask_activate(%d)", tskno); 422 SVC_PERROR(cTask_activate(tskno)); 423 break; 424 case 'A': 425 syslog(LOG_INFO, "#cTask_cancelActivate(%d)", tskno); 426 SVC_PERROR(ercd = cTask_cancelActivate(tskno)); 427 if (ercd >= 0) { 428 syslog(LOG_NOTICE, "cTask_cancelActivate(%d) returns %d", 429 tskno, ercd); 630 430 } 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++); 431 break; 432 case 't': 433 syslog(LOG_INFO, "#cTask_terminate(%d)", tskno); 434 SVC_PERROR(cTask_terminate(tskno)); 435 break; 436 case '>': 437 syslog(LOG_INFO, "#cTask_changePriority(%d, HIGH_PRIORITY)", tskno); 438 SVC_PERROR(cTask_changePriority(tskno, HIGH_PRIORITY)); 439 break; 440 case '=': 441 syslog(LOG_INFO, "#cTask_changePriority(%d, MID_PRIORITY)", tskno); 442 SVC_PERROR(cTask_changePriority(tskno, MID_PRIORITY)); 443 break; 444 case '<': 445 syslog(LOG_INFO, "#(cTask_changePriority(%d, LOW_PRIORITY)", tskno); 446 SVC_PERROR(cTask_changePriority(tskno, LOW_PRIORITY)); 447 break; 448 case 'G': 449 syslog(LOG_INFO, "#cTask_getPriority(%d, &tskpri)", tskno); 450 SVC_PERROR(ercd = cTask_getPriority(tskno, &tskpri)); 451 if (ercd >= 0) { 452 syslog(LOG_NOTICE, "priority of task %d is %d", tskno, tskpri); 453 } 454 break; 455 case 'w': 456 syslog(LOG_INFO, "#cTask_wakeup(%d)", tskno); 457 SVC_PERROR(cTask_wakeup(tskno)); 458 break; 459 case 'W': 460 syslog(LOG_INFO, "#cTask_cancelWakeup(%d)", tskno); 461 SVC_PERROR(ercd = cTask_cancelWakeup(tskno)); 462 if (ercd >= 0) { 463 syslog(LOG_NOTICE, "cTask_cancelWakeup(%d) returns %d", 464 tskno, ercd); 465 } 466 break; 467 case 'l': 468 syslog(LOG_INFO, "#cTask_releaseWait(%d)", tskno); 469 SVC_PERROR(cTask_releaseWait(tskno)); 470 break; 471 case 'u': 472 syslog(LOG_INFO, "#cTask_suspend(%d)", tskno); 473 SVC_PERROR(cTask_suspend(tskno)); 474 break; 475 case 'm': 476 syslog(LOG_INFO, "#cTask_resume(%d)", tskno); 477 SVC_PERROR(cTask_resume(tskno)); 478 break; 479 case 'x': 480 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno); 481 SVC_PERROR(cTask_raiseTerminate(tskno)); 482 break; 483 case 'X': 484 syslog(LOG_INFO, "#cTask_raiseTerminate(%d)", tskno); 485 SVC_PERROR(cTask_raiseTerminate(tskno)); 486 break; 487 case 'r': 488 syslog(LOG_INFO, "#rotateReadyQueue(three priorities)"); 489 SVC_PERROR(rotateReadyQueue(HIGH_PRIORITY)); 490 SVC_PERROR(rotateReadyQueue(MID_PRIORITY)); 491 SVC_PERROR(rotateReadyQueue(LOW_PRIORITY)); 492 break; 493 case 'c': 494 syslog(LOG_INFO, "#cCyclic_start()"); 495 SVC_PERROR(cCyclic_start()); 496 break; 497 case 'C': 498 syslog(LOG_INFO, "#cCyclic_stop()"); 499 SVC_PERROR(cCyclic_stop()); 500 break; 501 case 'b': 502 syslog(LOG_INFO, "#cAlarm_start(5000000)"); 503 SVC_PERROR(cAlarm_start(5000000)); 504 break; 505 case 'B': 506 syslog(LOG_INFO, "#cAlarm_stop()"); 507 SVC_PERROR(cAlarm_stop()); 508 break; 509 510 case 'V': 511 hrtcnt1 = fetchHighResolutionTimer(); 512 consume_time(1000LU); 513 hrtcnt2 = fetchHighResolutionTimer(); 514 syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu", 515 (uint32_t) hrtcnt1, (uint32_t) hrtcnt2); 516 break; 517 518 case 'v': 519 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_INFO), 520 LOG_UPTO(LOG_EMERG))); 521 break; 522 case 'q': 523 SVC_PERROR(cSysLog_mask(LOG_UPTO(LOG_NOTICE), 524 LOG_UPTO(LOG_EMERG))); 525 break; 526 527 case '\003': 528 case 'Q': 529 break; 530 531 default: 532 syslog(LOG_INFO, "Unknown command: '%c'.", c); 533 break; 637 534 } 638 } 535 } while (c != '\003' && c != 'Q'); 639 536 640 537 syslog(LOG_NOTICE, "Sample program ends."); 641 SVC_PERROR( ciKernel_exitKernel());538 SVC_PERROR(exitKernel()); 642 539 assert(0); 643 540 }
Note:
See TracChangeset
for help on using the changeset viewer.