Ignore:
Timestamp:
Jul 3, 2020, 7:19:17 PM (4 years ago)
Author:
coas-nagasima
Message:

ASP3, TINET, mbed を更新

File:
1 edited

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/asp3_dcre/sample/tSample2.c

    r321 r429  
    33 *      Toyohashi Open Platform for Embedded Real-Time Systems/
    44 *      Advanced Standard Profile Kernel
    5  *
     5 * 
    66 *  Copyright (C) 2015-2016 by Ushio Laboratory
    77 *              Graduate School of Engineering Science, Osaka Univ., JAPAN
    8  *  Copyright (C) 2015-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2015-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    4242
    4343/*
    44  *  サンプルプログラム(1)の本体
    45  *
    46  *  ASPカーネルの基本的な動作を確認するためのサンプルプログラム
     44 *  サンプルプログラム(2)の本体
     45 *
     46 *  ASPカーネルの基本的な動作を確認するためのサンプルプログラム(TECS版)
    4747 *
    4848 *  プログラムの概要:
    4949 *
    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 *  のは,プログラムの動作を確認しやすくするためである.また,低速なシ
    5959 *  リアルポートを用いてメッセージを出力する場合に,すべてのメッセージ
    6060 *  が出力できるように,メッセージの量を制限するという理由もある.
    6161 *
    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 *  に対応した処理を実行する.入力された文字と処理の関係は次の通り.
    6974 *  Control-Cまたは'Q'が入力されると,プログラムを終了する.
    7075 *
     
    97102 *  'b' : アラームハンドラを5秒後に起動するよう動作開始させる.
    98103 *  '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回読む.
    103108 *  'v' : 発行したシステムコールを表示する(デフォルト).
    104109 *  '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 */
    200111
    201112#include "tSample2_tecsgen.h"
     
    220131
    221132/*
     133 *  プロセッサ時間の消費
     134 *
     135 *  ループによりプロセッサ時間を消費する.最適化ができないように,ルー
     136 *  プ内でvolatile変数を読み込む.
     137 */
     138static volatile long_t  volatile_var;
     139
     140static void
     141consume_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/*
    222151 *  並行実行されるタスクへのメッセージ領域
    223152 */
     
    232161 *  並行実行されるタスク
    233162 */
    234 void eSampleTask_main(int_t subscript)
    235 {
    236         volatile ulong_t        i;
     163void
     164eSampleTask_main(int_t subscript)
     165{
    237166        int_t           n = 0;
    238167        int_t           tskno = subscript + 1;
     
    243172                syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
    244173                                                                                tskno, ++n, graph[tskno-1]);
    245                 for (i = 0; i < task_loop; i++);
     174                consume_time(task_loop);
    246175                c = message[tskno-1];
    247176                message[tskno-1] = 0;
     
    290219
    291220/*
     221 *  割込みサービスルーチン
     222 *
     223 *  HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
     224 *  を回転させる.
     225 */
     226#ifdef INTNO1
     227
     228void
     229eiISR_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/*
    292240 *  CPU例外ハンドラ
    293241 */
    294 
    295242ID      cpuexc_tskid;           /* CPU例外を起こしたタスクのID */
    296243
     
    298245
    299246void
    300 cpuexc_handler(void *p_excinf)
     247eiCpuExceptionHandler_main(const void *p_excinf)
    301248{
    302249       
    303250        syslog(LOG_NOTICE, "CPU exception handler (p_excinf = %08p).", p_excinf);
    304251        if (ciKernel_senseContext() != true) {
    305                 syslog(LOG_WARNING,
    306                                         "ciKernel_senseContext() is not true in CPU exception handler.");
     252                syslog(LOG_WARNING, "ciKernel_senseContext() is not true"
     253                                                                                        " in CPU exception handler.");
    307254        }
    308255        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));
    314263
    315264        if (ciKernel_exceptionSenseDispatchPendingState(p_excinf)) {
    316265                syslog(LOG_NOTICE, "Sample program ends with exception.");
    317                 SVC_PERROR(ciKernel_senseKernel());
     266                SVC_PERROR(ciKernel_exitKernel());
    318267                assert(0);
    319268        }
    320269
    321 #ifdef PREPARE_RETURN_CPUEXC
    322         PREPARE_RETURN_CPUEXC;
    323270        SVC_PERROR(ciKernel_getTaskId(&cpuexc_tskid));
    324271        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 */
    330272}
    331273
     
    338280 *  を回転させる.
    339281 */
    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()
     282void
     283eiCyclicHandler_main(void)
    347284{
    348285        SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY));
     
    357294 *  を回転させる.
    358295 */
    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()
     296void
     297eiAlarmHandler_main(void)
    366298{
    367299        SVC_PERROR(ciKernel_rotateReadyQueue(HIGH_PRIORITY));
     
    369301        SVC_PERROR(ciKernel_rotateReadyQueue(LOW_PRIORITY));
    370302}
     303
    371304/*
    372305 *  例外処理タスク
    373306 */
    374 /* #[<ENTRY_FUNC>]# eExceptionTask_main
    375  * name:         eExceptionTask_main
    376  * global_name:  tSample2_eExceptionTask_main
    377  * oneway:       
    378  * #[/ENTRY_FUNC>]# */
    379 void eExceptionTask_main()
     307void
     308eExceptionTask_main(void)
    380309{
    381310        SVC_PERROR(ras_ter(cpuexc_tskid));
    382311}
     312
    383313/*
    384314 *  メインタスク
    385315 */
    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()
     316void
     317eMainTask_main(void)
    393318{
    394319        char    c;
    395         volatile ulong_t        i;
    396         ulong_t j;
    397320        int_t   tskno = 1;
    398321        ER_UINT ercd;
    399322        PRI             tskpri;
     323#ifndef TASK_LOOP
    400324        SYSTIM  stime1, stime2;
     325#endif /* TASK_LOOP */
    401326        HRTCNT  hrtcnt1, hrtcnt2;
    402327
    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)));
    412329        syslog(LOG_NOTICE, "Sample program starts.");
    413330
     
    419336         *  ない.
    420337         */
    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));
    430344
    431345        /*
    432346         *  ループ回数の設定
    433347         *
    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に設定する.
    439353         *
    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         *  とする.
    448361         *
    449362         *  また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
    450          *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
    451          *  行わずに,TASK_LOOPに定義された値を空ループの回数とする.
     363         *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
     364         *  を行わずに,TASK_LOOPに定義された値をループの回数とする.
    452365         *
    453          * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
    454          * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
    455          * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
    456          * を使う.
     366         *  ターゲットによっては,ループの実行時間の1回目の測定で,本来より
     367         *  も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
     368         *  をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結
     369         *  果を使う.
    457370         */
    458371#ifdef TASK_LOOP
     
    461374
    462375#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));
    467379#endif /* MEASURE_TWICE */
    468380
    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));
    473384        task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU;
    474385
     
    478389         *  タスクの起動
    479390         */
    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));
    484394
    485395        /*
    486396         *  メインループ
    487397         */
    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);
    630430                        }
    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;
    637534                }
    638         }
     535        } while (c != '\003' && c != 'Q');
    639536
    640537        syslog(LOG_NOTICE, "Sample program ends.");
    641         SVC_PERROR(ciKernel_exitKernel());
     538        SVC_PERROR(exitKernel());
    642539        assert(0);
    643540}
Note: See TracChangeset for help on using the changeset viewer.