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/sample1.c

    r331 r429  
    66 *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
    77 *                              Toyohashi Univ. of Technology, JAPAN
    8  *  Copyright (C) 2004-2016 by Embedded and Real-Time Systems Laboratory
     8 *  Copyright (C) 2004-2019 by Embedded and Real-Time Systems Laboratory
    99 *              Graduate School of Information Science, Nagoya Univ., JAPAN
    1010 *
     
    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 *  ユーザインタフェースを受け持つメインタスク(MAIN_TASK)と,3つの並
     51 *  行実行されるタスク(TASK1~TASK3),例外処理タスク(EXC_TASK)の5
     52 *  つのタスクを用いる.これらの他に,システムログタスクが動作する.ま
     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  *        終了する).
     104 *  'z' : 対象タスクにCPU例外を発生させる(ターゲットによっては復帰可能).
     105 *  'Z' : 対象タスクにCPUロック状態でCPU例外を発生させる(復帰不可能).
    102106 *  '@' : タスク3をacre_tskにより生成する.
    103107 *  '!' : 対象タスクをdel_tskにより削除する.
    104108 *  '$' : アラームハンドラをacre_almにより生成する.
    105109 *  '#' : アラームハンドラをdel_almにより削除する.
    106  *  'V' : fch_hrtで高分解能タイマを2回読む.
     110 *  'V' : 短いループを挟んで,fch_hrtで高分解能タイマを2回読む.
    107111 *  'v' : 発行したシステムコールを表示する(デフォルト).
    108112 *  'q' : 発行したシステムコールを表示しない.
     
    116120#include "kernel_cfg.h"
    117121#include "sample1.h"
    118 /*#include "sample1n.h"*/
    119122
    120123/*
     
    132135
    133136/*
     137 *  プロセッサ時間の消費
     138 *
     139 *  ループによりプロセッサ時間を消費する.最適化ができないように,ルー
     140 *  プ内でvolatile変数を読み込む.
     141 */
     142static volatile long_t  volatile_var;
     143
     144static void
     145consume_time(ulong_t ctime)
     146{
     147        ulong_t         i;
     148
     149        for (i = 0; i < ctime; i++) {
     150                (void) volatile_var;
     151        }
     152}
     153
     154/*
    134155 *  並行実行されるタスクへのメッセージ領域
    135156 */
     
    144165 *  並行実行されるタスク
    145166 */
    146 void task(intptr_t exinf)
    147 {
    148         volatile ulong_t        i;
     167void
     168task(intptr_t exinf)
     169{
    149170        int_t           n = 0;
    150171        int_t           tskno = (int_t) exinf;
     
    155176                syslog(LOG_NOTICE, "task%d is running (%03d).   %s",
    156177                                                                                tskno, ++n, graph[tskno-1]);
    157                 for (i = 0; i < task_loop; i++);
     178                consume_time(task_loop);
    158179                c = message[tskno-1];
    159180                message[tskno-1] = 0;
     
    202223
    203224/*
    204  *  割込みハンドラ
     225 *  割込みサービスルーチン
     226 *
     227 *  HIGH_PRIORITY,MID_PRIORITY,LOW_PRIORITY の各優先度のレディキュー
     228 *  を回転させる.
    205229 */
    206230#ifdef INTNO1
    207231
    208 void intno1_isr(intptr_t exinf)
     232void
     233intno1_isr(intptr_t exinf)
    209234{
    210235        intno1_clear();
     
    235260                                        "sns_dpn() is not true in CPU exception handler.");
    236261        }
    237         syslog(LOG_INFO, "sns_loc = %d sns_dsp = %d xsns_dpn = %d",
     262        syslog(LOG_INFO, "sns_loc = %d, sns_dsp = %d, xsns_dpn = %d",
    238263                                                                sns_loc(), sns_dsp(), xsns_dpn(p_excinf));
    239264
     
    244269        }
    245270
    246 #ifdef PREPARE_RETURN_CPUEXC
    247         PREPARE_RETURN_CPUEXC;
    248271        SVC_PERROR(get_tid(&cpuexc_tskid));
    249272        SVC_PERROR(act_tsk(EXC_TASK));
    250 #else /* PREPARE_RETURN_CPUEXC */
    251         syslog(LOG_NOTICE, "Sample program ends with exception.");
    252         SVC_PERROR(ext_ker());
    253         assert(0);
    254 #endif /* PREPARE_RETURN_CPUEXC */
    255273}
    256274
     
    263281 *  を回転させる.
    264282 */
    265 void cyclic_handler(intptr_t exinf)
     283void
     284cyclic_handler(intptr_t exinf)
    266285{
    267286        SVC_PERROR(rot_rdq(HIGH_PRIORITY));
     
    276295 *  を回転させる.
    277296 */
    278 void alarm_handler(intptr_t exinf)
     297void
     298alarm_handler(intptr_t exinf)
    279299{
    280300        SVC_PERROR(rot_rdq(HIGH_PRIORITY));
     
    286306 *  例外処理タスク
    287307 */
    288 void exc_task(intptr_t exinf)
     308void
     309exc_task(intptr_t exinf)
    289310{
    290311        SVC_PERROR(ras_ter(cpuexc_tskid));
     
    294315 *  メインタスク
    295316 */
    296 void main_task(intptr_t exinf)
     317void
     318main_task(intptr_t exinf)
    297319{
    298320        char    c;
     
    302324        PRI             tskpri;
    303325#ifndef TASK_LOOP
    304         volatile ulong_t        i;
    305326        SYSTIM  stime1, stime2;
    306327#endif /* TASK_LOOP */
     
    332353         *  ループ回数の設定
    333354         *
    334          *  並行実行されるタスク内での空ループの回数(task_loop)は,空ルー
    335          *  の実行時間が約0.4秒になるように設定する.この設定のために,
    336          *  LOOP_REF回のループの実行時間を,その前後でget_timを呼ぶことで
    337          *  測定し,その測定結果から空ループの実行時間が0.4秒になるループ
    338          *  数を求め,task_loopに設定する.
     355         *  並行実行されるタスク内でのループの回数(task_loop)は,ループ
     356         *  の実行時間が約0.4秒になるように設定する.この設定のために,
     357         *  LOOP_REF回のループの実行時間を,その前後でget_timを呼ぶことで
     358         *  測定し,その測定結果から空ループの実行時間が0.4秒になるループ
     359         *  数を求め,task_loopに設定する.
    339360         *
    340          *  LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定したよ
    341          *  り遅いプロセッサでは,サンプルプログラムの実行開始に時間がかか
    342          *  りすぎるという問題を生じる.逆に想定したより速いプロセッサでは,
    343          *  LOOP_REF回の空ループの実行時間が短くなり,task_loopに設定する値
    344          *  の誤差が大きくなるという問題がある.
    345          *
    346          *  そこで,そのようなターゲットでは,target_test.hで,LOOP_REFを適
    347          *  切な値に定義するのが望ましい.
     361         *  LOOP_REFは,デフォルトでは1,000,000に設定しているが,想定した
     362         *  より遅いプロセッサでは,サンプルプログラムの実行開始に時間がか
     363         *  かりすぎるという問題を生じる.逆に想定したより速いプロセッサで
     364         *  は,LOOP_REF回のループの実行時間が短くなり,task_loopに設定す
     365         *  る値の誤差が大きくなるという問題がある.そこで,そのようなター
     366         *  ゲットでは,target_test.hで,LOOP_REFを適切な値に定義すること
     367         *  とする.
    348368         *
    349369         *  また,task_loopの値を固定したい場合には,その値をTASK_LOOPにマ
    350          *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
    351          *  行わずに,TASK_LOOPに定義された値を空ループの回数とする.
     370         *  クロ定義する.TASK_LOOPがマクロ定義されている場合,上記の測定
     371         *  を行わずに,TASK_LOOPに定義された値をループの回数とする.
    352372         *
    353          * ターゲットによっては,空ループの実行時間の1回目の測定で,本来よ
    354          * も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
    355          * をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結果
    356          * を使う.
     373         *  ターゲットによっては,ループの実行時間の1回目の測定で,本来より
     374         *  も長めになるものがある.このようなターゲットでは,MEASURE_TWICE
     375         *  をマクロ定義することで,1回目の測定結果を捨てて,2回目の測定結
     376         *  果を使う.
    357377         */
    358378#ifdef TASK_LOOP
     
    361381
    362382#ifdef MEASURE_TWICE
    363         task_loop = LOOP_REF;
    364383        SVC_PERROR(get_tim(&stime1));
    365         for (i = 0; i < task_loop; i++);
     384        consume_time(LOOP_REF);
    366385        SVC_PERROR(get_tim(&stime2));
    367386#endif /* MEASURE_TWICE */
    368387
    369         task_loop = LOOP_REF;
    370388        SVC_PERROR(get_tim(&stime1));
    371         for (i = 0; i < task_loop; i++);
     389        consume_time(LOOP_REF);
    372390        SVC_PERROR(get_tim(&stime2));
    373391        task_loop = LOOP_REF * 400LU / (ulong_t)(stime2 - stime1) * 1000LU;
     
    477495                        break;
    478496                case 'c':
    479                         syslog(LOG_INFO, "#sta_cyc(1)");
     497                        syslog(LOG_INFO, "#sta_cyc(CYCHDR1)");
    480498                        SVC_PERROR(sta_cyc(CYCHDR1));
    481499                        break;
    482500                case 'C':
    483                         syslog(LOG_INFO, "#stp_cyc(1)");
     501                        syslog(LOG_INFO, "#stp_cyc(CYCHDR1)");
    484502                        SVC_PERROR(stp_cyc(CYCHDR1));
    485503                        break;
    486504                case 'b':
    487                         syslog(LOG_INFO, "#sta_alm(1, 5000000)");
     505                        syslog(LOG_INFO, "#sta_alm(ALMHDR1, 5000000)");
    488506                        SVC_PERROR(sta_alm(ALMHDR1, 5000000));
    489507                        break;
    490508                case 'B':
    491                         syslog(LOG_INFO, "#stp_alm(1)");
     509                        syslog(LOG_INFO, "#stp_alm(ALMHDR1)");
    492510                        SVC_PERROR(stp_alm(ALMHDR1));
    493511                        break;
     
    499517                        ctsk.stksz = STACK_SIZE;
    500518                        ctsk.stk = NULL;
    501                         SVC_PERROR(TASK3 = acre_tsk(&ctsk));
    502                         syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
     519                        SVC_PERROR(ercd = acre_tsk(&ctsk));
     520                        if (ercd >= 0) {
     521                                TASK3 = ercd;
     522                                syslog(LOG_NOTICE, "task3 is created with tskid = %d.",
    503523                                                                                                                (int_t) TASK3);
     524                        }
    504525                        break;
    505526                case '!':
     
    512533                        calm.nfyinfo.nfy.handler.exinf = (intptr_t) 0;
    513534                        calm.nfyinfo.nfy.handler.tmehdr = (TMEHDR) alarm_handler;
    514                         SVC_PERROR(ALMHDR1 = acre_alm(&calm));
    515                         syslog(LOG_NOTICE, "alarm handler is created with almid = %d.",
     535                        SVC_PERROR(ercd = acre_alm(&calm));
     536                        if (ercd >= 0) {
     537                                ALMHDR1 = ercd;
     538                                syslog(LOG_NOTICE, "alarm handler is created with almid = %d.",
    516539                                                                                                                (int_t) ALMHDR1);
     540                        }
    517541                        break;
    518542                case '#':
    519                         syslog(LOG_INFO, "#del_alm(1)");
     543                        syslog(LOG_INFO, "#del_alm(ALMHDR1)");
    520544                        SVC_PERROR(del_alm(ALMHDR1));
    521545                        break;
     
    523547                case 'V':
    524548                        hrtcnt1 = fch_hrt();
     549                        consume_time(1000LU);
    525550                        hrtcnt2 = fch_hrt();
    526551                        syslog(LOG_NOTICE, "hrtcnt1 = %tu, hrtcnt2 = %tu",
    527                                                                                 hrtcnt1, hrtcnt2);
     552                                                                (uint32_t) hrtcnt1, (uint32_t) hrtcnt2);
    528553                        break;
    529554
     
    552577#endif /* BIT_KERNEL */
    553578
     579                case '\003':
     580                case 'Q':
     581                        break;
     582
    554583                default:
     584                        syslog(LOG_INFO, "Unknown command: '%c'.", c);
    555585                        break;
    556586                }
Note: See TracChangeset for help on using the changeset viewer.