ITRON仕様共通規定のテストを〜 COM編

さて、本物(?)のprintfも手に入ったことだし、本題のテストに入ってみよう。 プログラムによるテストのCOM1〜COM8を実行してみることにする。

  1. 共通事項
  2. COM1:ITRON仕様共通規定のテスト手順 その1
  3. COM2:ITRON仕様共通規定のテスト手順 その2
  4. COM3:ITRON仕様共通規定のテスト手順 その3
  5. COM4:ITRON仕様共通規定のテスト手順 その4
  6. COM5:ITRON仕様共通規定のテスト手順 その5
  7. COM6:ITRON仕様共通規定のテスト手順 その6
  8. COM7:ITRON仕様共通規定のテスト手順 その7
  9. COM8:ITRON仕様共通規定のテスト手順 その8
2002.07.01 記 新井

共通事項

まずはこのテストを行なうにあたっての共通項を。
  1. 元ネタは、 μITRON4.0検定仕様書(案)(μITRON4.0仕様 Ver. 4.00.00に対応; 日本語版) である。
  2. 出力はprintfで、SCIFを割り込みは使わずに利用する。
    特に問題は無い筈だが、なるだけ単純化する為に。
  3. main.cは共通(COM1では必要無いが)。
    /* --------------------------------------------------------- */
    /*  HOS-V4                                                   */
    /*  ITRON仕様共通仕様規定テスト                              */
    /* --------------------------------------------------------- */
    
    #include <stdio.h>
    #include "kernel.h"
    #include "kernel_id.h"
    #include "test_def.h"
    
    
    /* ターゲット依存の各種定義 */
    #include "scif.h"
    #include "sh7750.h"
    
    void atexit(){}
    
    /* メイン関数 */
    int main()
    {
        printf("Test Start.\n");
    
        /* HOS-V4 の開始 */
        sta_hos();
        
        return 0;
    }
    /* --------------------------------------------------------- */
    

    HOS-V4の開始だけ。

  4. コンフィグのターゲット依存部分はdreamcast.cfgとし、system.cfgから includeする。
    /* ターゲット(Dremacast)依存の設定 */
    HOS_KERNEL_HEAP(4096);   /* カーネルヒープの設定 */
    HOS_TIM_TIC(1, 1);       /* タイムティックの設定 */
    HOS_MAX_TPRI(16);        /* 最大優先度           */
    HOS_MIN_INTNO(0);        /* 割り込み番号の最小値 */
    HOS_MAX_INTNO(43);       /* 割り込み番号の最大値 */
    HOS_MIN_EXCNO(0);        /* 割り込み番号の最小値 */
    HOS_MAX_EXCNO(43);    	 /* 割り込み番号の最大値 */
    
    /* インクルードファイルの指定 */
    INCLUDE("\"sh7750.h\"");
    INCLUDE("\"ostimer.h\"");
    INCLUDE("\"scif.h\"");
    
    /* OSタイマ(TMU0)用 */
    ATT_ISR({TA_HLNG, 0, SH4_INTNUM_TMU0_TUNI0, ostim_hdr});
    ATT_INI({TA_HLNG, 1000, ostim_init});
    
    /* SCIFの初期化 */
    ATT_INI({TA_HLNG, B57600, scif_open});
    
    /* 割り込みコントローラの初期化 */
    ATT_INI({TA_HLNG, 0, intc_int});
    

これは基本的にH4020630.lzhに対して行なった結果であり、ここに示す試行を 行なったディレクトリは、SH4 port追加パッケージ内に含まれている。

COM1:ITRON仕様共通規定のテスト手順 その1

それでは一発目。

あれれ、なんだこりゃ。

  1. kernel.hがインクルードパスに入っていて、
  2. 重複includeへの対策がしてあれば、
Cの処理系だったら(Warningはともかく)エラーが出る訳が無いではないか。

#include <kernel.h>
#include <kernel.h>
B   c;
main()
{
    B  a = 1, b = 2;

    c = a + b;
}

なるcom01.cを作成。

sh-hitachi-elf-gcc com01.c -ml -m4-single-only -I../../../../include -I.  -Wall -pipe -O2 -c
com01.c:5: warning: return-type defaults to `int'
com01.c: In function `main':
com01.c:9: warning: control reaches end of non-void function

案の定、暗黙にintになるのに返り値を持たない事を警告されている。しかし、 エラーは出ずにcom01.oは出来たのでOK。完了。


COM2:ITRON仕様共通規定のテスト手順 その2

今度はちょっと大きいぞ。

しかし、大きいと言っても大した事は無い。ここでテストしている事は、

  1. 優先度順にタスクが起動される。
  2. 優先度順に「優先度付きメールボックス」に対するメッセージの送受信が 行なわれる。
の2点だろう。そこでそのまま書いてみる。

#include <stdio.h>

#include <kernel.h>
#include <kernel_id.h>

#include "test_def.h"


void TASK1(VP_INT exinf)
{
  ER ercd;
  T_MSG_PRI msg1,msg8,msg16;


  printf("TASK1: Start\n");

  /* 優先度付きメッセージの所在番地を表示 */
  printf("&msg1  = 0x%08lx\n", (unsigned long)&msg1);
  printf("&msg8  = 0x%08lx\n", (unsigned long)&msg8);
  printf("&msg16 = 0x%08lx\n", (unsigned long)&msg16);

  msg16.msgpri = MSGPRI_16;
  ercd = snd_mbx( MBX_ID1, (T_MSG *)&msg16);
  printf("TASK1: [ 4] MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  msg8.msgpri = MSGPRI_8;
  ercd = snd_mbx( MBX_ID1, (T_MSG *)&msg8);
  printf("TASK1: [ 7] MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  msg1.msgpri = MSGPRI_1;
  ercd = snd_mbx( MBX_ID1, (T_MSG *)&msg1);
  printf("TASK1: [10] MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  printf("TASK1: End\n");
  ext_tsk();
}

void TASK2(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK3(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK4(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK5(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK6(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK7(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK8(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK9(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK10(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK11(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK12(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK13(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK14(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK15(VP_INT exinf)
{
  printf("TASK%d: Start\n", (int)exinf);
  printf("TASK%d: End\n", (int)exinf);
  ext_tsk();
}

void TASK16(VP_INT exinf)
{
  ER ercd;
  T_MSG *pk_msg;
  
  printf("TASK16: Start\n");

  ercd = prcv_mbx( MBX_ID1, &pk_msg);
  printf("TASK16: [27] MERCD(ercd) %s E_OK\n",MERCD(ercd) == E_OK ? "==": "!=");

  /* 受信メッセージの所在番地を表示 */
  printf("TASK16: [28] pk_msg = 0x%0lx\n", (unsigned long)pk_msg);

  ercd = prcv_mbx( MBX_ID1, &pk_msg);
  printf("TASK16: [30] MERCD(ercd) %s E_OK\n",MERCD(ercd) == E_OK ? "==": "!=");

  /* 受信メッセージの所在番地を表示 */
  printf("TASK16: [31] pk_msg = 0x%0lx\n", (unsigned long)pk_msg);

  ercd = prcv_mbx( MBX_ID1, &pk_msg);
  printf("TASK16: [33] MERCD(ercd) %s E_OK\n",MERCD(ercd) == E_OK ? "==": "!=");

  /* 受信メッセージの所在番地を表示 */
  printf("TASK16: [34] pk_msg = 0x%0lx\n", (unsigned long)pk_msg);

  printf("TASK16: End\n");

  ext_tsk();
}

TASK2〜TASK15は、exinf_N = Nなのでこんな風になった。実体は一つで済ませ られるのだが、書いてあるのだから仕方無い。

それではmakeして実行。

Test Start.
TASK1: Start
&msg1  = 0x8c01ae14
&msg8  = 0x8c01ae1c
&msg16 = 0x8c01ae24
TASK1: [ 4] MERCD(ercd) == E_OK
TASK1: [ 7] MERCD(ercd) == E_OK
TASK1: [10] MERCD(ercd) == E_OK
TASK1: End

あれれ、暴走してしまった。その訳は…スタックだ。共通仕様テストでは、タ スクに与えるスタックサイズ STKSZ を0x100バイトと規定している。しかし、 それっぽっちでは、printfの食欲を満たし切れなかったという訳だ。

kernel_cfg.cの中身を見れば分るが、TASK1に割り当てられるスタック領域が 溢れると、TASK2に割り当てられるスタック領域を侵食してしまう。すると当 然、そこに積まれている実行番地や実行パラメータも潰されてしまうのだ。 そして当たり前のように暴走。

うぅむ。取り得る手段は…printfを捨て、スタックを節約した出力手段を採用 するか、片目をつぶってスタックサイズを大きくするか…。

とりあえすSTKSZを0x1000にしてやってみた。

Test Start.
TASK1: Start
&msg1  = 0x8c029e14
&msg8  = 0x8c029e1c
&msg16 = 0x8c029e24
TASK1: [ 4] MERCD(ercd) == E_OK
TASK1: [ 7] MERCD(ercd) == E_OK
TASK1: [10] MERCD(ercd) == E_OK
TASK1: End
TASK2: Start
TASK2: End
TASK3: Start
TASK3: End
TASK4: Start
TASK4: End
TASK5: Start
TASK5: End
TASK6: Start
TASK6: End
TASK7: Start
TASK7: End
TASK8: Start
TASK8: End
TASK9: Start
TASK9: End
TASK10: Start
TASK10: End
TASK11: Start
TASK11: End
TASK12: Start
TASK12: End
TASK13: Start
TASK13: End
TASK14: Start
TASK14: End
TASK15: Start
TASK15: End
TASK16: Start
TASK16: [27] MERCD(ercd) == E_OK
TASK16: [28] pk_msg = 0x8c029e14
TASK16: [30] MERCD(ercd) == E_OK
TASK16: [31] pk_msg = 0x8c029e1c
TASK16: [33] MERCD(ercd) == E_OK
TASK16: [34] pk_msg = 0x8c029e24
TASK16: End

正しい順序でタスクが起動され、正しい順序でメッセージが受信されているこ とが確認できた。後の課題は「規定に従ったSTKSZでいかにやるか」だ。


COM3:ITRON仕様共通規定のテスト手順 その3

ここで確認される機能は、

  1. システムタイマ
  2. 実行状態タスクIDの参照が、不正な引数でメモリアクセス違反を返す(シ ステムにE_MACVエラーを検出できるERR_ADDRが無い場合、省略可能)
  3. 動的なタスクの起動
  4. タイマ設定/取得
  5. タイムアウト付きタスク起床待ち
  6. タスク遅延
となるだろうか。

これまた素直に書いていくだけだが、2点ほど注意点がある。まず第一に、HOS ではSYSTIMが構造体である点。次にHOSのget_tid()は引数をチェックして E_MACVを返す仕様にはなっていない点だ。

SYSTIMについては、この範囲においては単純に「.utime == 0 && .ltimeに関 してて比較」と読み替えるだけ。

E_MACVの検出については存在しない。というか調べてみた所、現在のHOSにお いてE_MACVを返す実装を持っている関数は一つも存在しない。ID = INTという ことで、4byte アライメントに反するものを弾く位は簡単だろうけど、あまり 意味が無いかな。

#include <stdio.h>
#include <kernel.h>
#include <kernel_id.h>
#include "test_def.h"

void TASK1(VP_INT exinf)
{
  ER     ercd;
  SYSTIM systim1,systim2;

  printf("TASK1: Start\n");

  /* E_MACVを検出する機構は無い */
#if 0
  ercd = get_tid( ERR_ADDR);
  printf("TASK1: MERCD(ercd) %s E_MACV\n", ercd == E_MACV ? "==": "!=");
#endif

  ercd = act_tsk( TASK_ID2);
  printf("TASK1: MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  systim1.utime = 0;
  systim1.ltime = SYSTIM_1000;
  ercd = set_tim( &systim1);
  printf("TASK1: MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  ercd = tslp_tsk(TMO_100);
  printf("TASK1: MERCD(ercd) %s E_TMOUT\n", ercd == E_TMOUT ? "==": "!=");

  ercd = get_tim( &systim2);
  printf("TASK1: MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  printf("TASK1: %s\n", systim2.utime == 0 && systim2.ltime < SYSTIM_1000 ? 
     "systim2 < SYSTIM_1000": "systim2 >= SYSTIM_1000\n" );


  printf("TASK1: End\n");

  ext_tsk();
}

void TASK2(VP_INT exinf)
{
  ER     ercd;
  SYSTIM systim1;

  printf("TASK2: Start\n");

  systim1.utime = 0;
  systim1.ltime = SYSTIM_0;
  ercd = set_tim( &systim1);
  printf("TASK2: MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");
  
  ercd = dly_tsk( DLYTIM_300);
  printf("TASK2: MERCD(ercd) %s E_OK\n", ercd == E_OK ? "==": "!=");

  printf("TASK2: End\n");
  ext_tsk();
}

さっくりmake&実行。

Test Start.
TASK1: Start
TASK1: [ 4] MERCD(ercd) == E_OK
TASK1: [ 7] MERCD(ercd) == E_OK
TASK2: Start
TASK2: [11] MERCD(ercd) == E_OK
TASK1: [13] MERCD(ercd) == E_TMOUT
TASK1: [15] MERCD(ercd) == E_OK
TASK1: [16] systim2 < SYSTIM_1000
TASK1: End
TASK2: [18] MERCD(ercd) == E_OK
TASK2: End

問題無いようだ。完了。そういえば、ここではSTKSZ = 0x100でもOKだ。


COM4:ITRON仕様共通規定のテスト手順 その4

今度はちょっと毛色が変わる。

ここではコンフィグレータの挙動が主なテスト対象だ。要するに、

/* COM4: ITRON仕様共通規定のテスト手順 その4 コンフィグレーションファイル */
INCLUDE("<kernel.h>");
INCLUDE("\"task1.h\"");
#define EXINF_1   0x00000001
#define ITSKPRI_1 0x0001
#define STKSZ     0x0100


CRE_TSK(TASK_ID1,{TA_HLNG|0x00,EXINF_1,TASK1,ITSKPRI_1,STKSZ,NULL});

というコンフィグレーションファイル system.cfg と

extern void     TASK1();

というヘッダファイル task1.hでコンフィグレーションを実行し、正常にコン パイル可能なカーネル構成・初期化ファイル(kernel_cfg.c)とkernl_id.hが生 成されることが確認できれば良いという事だろう。

cp system.cfg system.cfg.tmp.c
sh-hitachi-elf-gcc -c -ml -m4-single-only -pipe -O2 -Wall -I../../../../include -I. -E system.cfg.tmp.c -o - | tee system.cfg.tmp.i
# 1 "system.cfg.tmp.c"
 
INCLUDE("<kernel.h>");
INCLUDE("\"task1.h\"");





CRE_TSK(TASK_ID1,{TA_HLNG|0x00,0x00000001 ,TASK1,0x0001 ,0x0100 ,NULL});
../../../../config/hos4cfg system.cfg.tmp.i
cat kernel_id.h
/* ------------------------------------------------------------------------ */
/*  HOS-V4  kernel configuration                                            */
/*    kernel object ID definition                                           */
/*                                                                          */
/* ------------------------------------------------------------------------ */


#ifndef __HOS_V4__kernel_cfg_h__
#define __HOS_V4__kernel_cfg_h__



/* time tic */
#define TIC_NUME		1
#define TIC_DENO		1


/* task ID definetion */
#define TASK_ID1		1



#endif	/* __HOS_V4__kernel_cfg_h__ */


/* ------------------------------------------------------------------------ */
/*  End of file                                                             */
/* ------------------------------------------------------------------------ */
rm -f system.cfg.tmp.[ci]
sh-hitachi-elf-gcc -c -ml -m4-single-only -pipe -O2 -Wall -I../../../../include -I. kernel_cfg.c -o kernel_cfg.o

teeとかパイプを多用してしまったが、Winな開発環境ではこのスタイルは受け 入れられないだろうか?でも、とにかく完了。


COM5:ITRON仕様共通規定のテスト手順 その5

次もコンフィグレータ周り。

  1. API名称のチェック
  2. ()の対応チェック
  3. パラメータ数チェック
    これについては実装毎に拡張を許しているので厳密に行なう必要は無いのかも しれないが、現状で拡張機能の無いHOSでは無用の危険を避ける為にも必要と 思われる。
となる。

No.1〜4に対応するコンフィグファイルをsystem1.cfg〜system4.cfgとして作 成し、一気に実行。

frodo%(101)./test.sh 
cp system1.cfg system1.cfg.c
sh-hitachi-elf-gcc -c -ml -m4-single-only -pipe -O2 -Wall -I../../../../include -I. -E system1.cfg.c -o - | tee system1.cfg.i
# 1 "system1.cfg.c"
 
INCLUDE("<kernel.h>");
INCLUDE("\"task1.h\"");





ABC_DEF(TASK_ID1,{TA_HLNG,0x00000001 ,TASK1,0x0001 ,0x0100 ,NULL});
../../../../config/hos4cfg system1.cfg.i
system1.cfg.i line(10) : 
*** Error code 1

Stop in /usr/home/m-arai/work/HOSV4/h4020623/test/sh4gcc/com/5.
cp system2.cfg system2.cfg.c
sh-hitachi-elf-gcc -c -ml -m4-single-only -pipe -O2 -Wall -I../../../../include -I. -E system2.cfg.c -o - | tee system2.cfg.i
# 1 "system2.cfg.c"
 
INCLUDE("<kernel.h>");
INCLUDE("\"task1.h\"");





CRE_TSK(TASK_ID1,{TA_HLNG|0x00,0x00000001 ,TASK1,0x0001 ,0x0100 ,NULL};
../../../../config/hos4cfg system2.cfg.i
system2.cfg.i line(10) : syntax error.
*** Error code 1

Stop in /usr/home/m-arai/work/HOSV4/h4020623/test/sh4gcc/com/5.
cp system3.cfg system3.cfg.c
sh-hitachi-elf-gcc -c -ml -m4-single-only -pipe -O2 -Wall -I../../../../include -I. -E system3.cfg.c -o - | tee system3.cfg.i
# 1 "system3.cfg.c"
 
INCLUDE("<kernel.h>");
INCLUDE("\"task1.h\"");





CRE_TSK(TASK_ID1,{TA_HLNG,NULL});
../../../../config/hos4cfg system3.cfg.i
system3.cfg.i line(10) : illegal parameter
*** Error code 1

Stop in /usr/home/m-arai/work/HOSV4/h4020623/test/sh4gcc/com/5.
cp system4.cfg system4.cfg.c
sh-hitachi-elf-gcc -c -ml -m4-single-only -pipe -O2 -Wall -I../../../../include -I. -E system4.cfg.c -o - | tee system4.cfg.i
# 1 "system4.cfg.c"
 
INCLUDE("<kernel.h>");
INCLUDE("\"task1.h\"");




CRE_TSK(TASK_ID1,{TA_HLNG|0x00,0x00000001 ,TASK1,0x0001 ,0x0100 ,NULL,NULL});
../../../../config/hos4cfg system4.cfg.i
system4.cfg.i line(9) : illegal parameter
*** Error code 1

Stop in /usr/home/m-arai/work/HOSV4/h4020623/test/sh4gcc/com/5.
frodo%(102)exit

実行結果そのままだがどうだろう。エラー行番号表示が、元ファイルの行では なくプリプロセッサを通したものの行になっている点は今一な感があるが、そ の中間ファイルはコンフィグレーションが失敗した場合には残るので問題有る まい。

ということで完了。


COM6:ITRON仕様共通規定のテスト手順 その6

こ、これって…。

frodo%(101)sh-hitachi-elf-nm ../2/com02.out | grep -i _kernel_
8c0100a0 T _kernel_cfg_init
8c010100 T _kernel_cfg_start
8c019258 R _kernel_cyccb_cnt
8c02b3e0 B _kernel_cyccb_ram_tbl
8c019240 R _kernel_dtqcb_cnt
8c011860 T _kernel_end_int
8c01926c R _kernel_exccb_cnt
8c02a05c B _kernel_exccb_tbl
8c0118a0 T _kernel_exe_int
8c01923c R _kernel_flgcb_cnt
8c02a060 B _kernel_heap_mem
8c011180 T _kernel_ini_mem
8c011720 T _kernel_ini_tim
8c0111c0 T _kernel_ini_tsk
8c019708 D _kernel_int_cnt
8c01925c R _kernel_int_sp
8c02b404 B _kernel_int_ssp
8c02b060 B _kernel_int_stk
8c019260 R _kernel_intcb_cnt
8c029ebc B _kernel_intcb_tbl
8c019268 R _kernel_isrcb_cnt
8c019250 R _kernel_mbfcb_cnt
8c029e54 b _kernel_mbx1_mprihd
8c01924c R _kernel_mbxcb_cnt
8c02b3e4 B _kernel_mbxcb_ram
8c0196c8 D _kernel_mbxcb_ram_tbl
8c019244 R _kernel_mbxcb_rom
8c02b3f4 B _kernel_mem_base
8c02b3f8 B _kernel_mem_szie
8c019270 R _kernel_min_excno
8c019264 R _kernel_min_intno
8c019254 R _kernel_mpfcb_cnt
8c019238 R _kernel_semcb_cnt
8c011840 T _kernel_sta_int
8c02b3fc B _kernel_systim
8c011240 T _kernel_task_entry
8c019234 R _kernel_tcb_cnt
8c02b160 B _kernel_tcb_ram
8c019688 D _kernel_tcb_ram_tbl
8c0190b4 R _kernel_tcb_rom
8c011f60 T _kernel_tex_entry
8c019704 D _kernel_tic_cnt
8c0190a0 R _kernel_tic_deno
8c0190a4 R _kernel_tic_div
8c0190a8 R _kernel_tic_mod
8c022e54 b _kernel_tsk10_stk
8c023e54 b _kernel_tsk11_stk
8c024e54 b _kernel_tsk12_stk
8c025e54 b _kernel_tsk13_stk
8c026e54 b _kernel_tsk14_stk
8c027e54 b _kernel_tsk15_stk
8c028e54 b _kernel_tsk16_stk
8c019e54 b _kernel_tsk1_stk
8c01ae54 b _kernel_tsk2_stk
8c01be54 b _kernel_tsk3_stk
8c01ce54 b _kernel_tsk4_stk
8c01de54 b _kernel_tsk5_stk
8c01ee54 b _kernel_tsk6_stk
8c01fe54 b _kernel_tsk7_stk
8c020e54 b _kernel_tsk8_stk
8c021e54 b _kernel_tsk9_stk
frodo%(102)exit

これでどうだ!

完了。


COM7:ITRON仕様共通規定のテスト手順 その7

これは、変数型の定義が正しく規定に沿っているかをプログラムで確認する目 的のようだ。

これってタスクにする意味があるのだろうか…。

#include <stdio.h>
#include "kernel.h"
#include "test_def.h"

/* 変数定義  スタック圧迫を避ける為に静的に確保 */
B b1;
UB ub1;
H h1;
UH uh1;
W w1;
UW uw1;
INT int1;
UINT uint1;
BOOL bool1;
FN fn1;
ER er1;
ID id1;
ATR atr1;
STAT stat1;
MODE mode1;
PRI pri1;
SIZE size1;
TMO tmo1;
RELTIM reltim1;
SYSTIM systim1;
VP_INT vp_int1;
ER_BOOL er_bool1;
ER_ID er_id1;
ER_UINT er_uint1;

void TASK1(VP_INT exinf)
{


  puts("TASK1: Start");

  puts(  1 == sizeof(B) ? " 1 == sizeof(B)": " 1 != sizeof(B)");
  b1 = -1;
  puts( b1 < 0 ? " b1 < 0:": " b1 > 0");
  puts(  1 == sizeof(UB) ? " 1 == sizeof(UB)": " 1 != sizeof(UB)");
  ub1 = -1;
  puts( ub1 > 0 ? " ub1 > 0:": " ub1 < 0");

  puts(  2 == sizeof(H) ? " 2 == sizeof(H)": " 2 != sizeof(H)");
  h1 = -1;
  puts( h1 < 0 ? " h1 < 0:": " h1 > 0");
  puts(  2 == sizeof(UH) ? " 2 == sizeof(UH)": " 2 != sizeof(UH)");
  uh1 = -1;
  puts( uh1 > 0 ? " uh1 > 0:": "uh1 < 0");

  puts(  4 == sizeof(W) ? " 4 == sizeof(W)": " 4 != sizeof(W)");
  w1 = -1;
  puts( w1 < 0 ? " w1 < 0:": " w1 > 0");
  puts(  4 == sizeof(UW) ? " 4 == sizeof(UW)": " 4 != sizeof(UH)");
  uw1 = -1;
  puts( uw1 > 0 ? " uw1 > 0:": " uw1 < 0");

  printf( " %d == sizeof(VB)\n", sizeof(VB));
  printf( " %d == sizeof(VH)\n", sizeof(VH));
  printf( " %d == sizeof(VW)\n", sizeof(VW));

  printf(" sizeof(void *) %c= sizeof(VP)\n",
	 sizeof(void *) == sizeof(VP) ? '=': '!');
  printf(" sizeof(void *) %c= sizeof(FP)\n",
	 sizeof(void *) == sizeof(FP) ? '=': '!');
 
  printf(" 2 %s sizeof(INT)\n", 2 <= sizeof(INT) ? "<=": ">");
  int1 = -1;
  puts( int1 < 0 ? " int1 < 0": " int1 >= 0");

  printf(" 2 %s sizeof(UINT)\n", 2 <= sizeof(UINT) ? "<=": ">");
  uint1 = -1;
  puts( uint1 > 0 ? " uint1 > 0": " uint1 <= 0");

  bool1 = TRUE;
  printf(" bool1 %c= TRUE\n", bool1 == TRUE ? '=': '!');
  bool1 = FALSE;
  printf(" bool1 %c= FALSE\n", bool1 == FALSE ? '=': '!');
 

  printf(" 2 %s sizeof(FN)\n", 2 <= sizeof(FN) ? "<=": ">");
  fn1 = -1;
  printf(" fn1 %s 0\n", fn1 <0 ? "<": ">=");

  printf(" 1 %s sizeof(ER)\n", 1 <= sizeof(ER) ? "<=": ">");
  er1 = -1;
  printf(" er1 %s 0\n", er1 <0 ? "<": ">=");

  printf(" 2 %s sizeof(ID)\n", 2 <= sizeof(ID) ? "<=": ">");
  id1 = -1;
  printf(" id1 %s 0\n", id1 <0 ? "<": ">=");

  printf(" 1 %s sizeof(ATR)\n", 1 <= sizeof(ATR) ? "<=": ">");
  atr1 = -1;
  printf(" atr1 %s 0\n", atr1 > 0 ? ">": "<=");
  
  printf(" 2 %s sizeof(STAT)\n", 2 <= sizeof(STAT) ? "<=": ">");
  stat1 = -1;
  printf(" stat1 %s 0\n", stat1 > 0 ? ">": "<=");

  printf(" 1 %s sizeof(MODE)\n", 1 <= sizeof(MODE) ? "<=": ">");
  mode1 = -1;
  printf(" mode1 %s 0\n", mode1 > 0 ? ">": "<=");

  printf(" 2 %s sizeof(PRI)\n", 2 <= sizeof(PRI) ? "<=": ">");
  pri1 = -1;
  printf(" pri1 %s 0\n", pri1 < 0 ? "<": ">=");

  printf(" sizeof(SIZE) %c= sizeof(void *)\n",
	 sizeof(SIZE) == sizeof(void *) ? '=': '!');
  size1 = -1;
  printf(" size1 %s 0\n", size1 > 0 ? ">": "<=");

  printf(" 2 %s sizeof(TMO)\n", 2 <= sizeof(TMO) ? "<=": ">");
  tmo1 = -1;
  printf(" tmo1 %s 0\n", tmo1 < 0 ? "<": ">=");

  printf(" 2 %s sizeof(RELTIM)\n", 2 <= sizeof(RELTIM) ? "<=": ">");
  reltim1 = -1;
  printf(" reltim1 %s 0\n", reltim1 > 0 ? ">": "<=");

  printf(" 2 %s sizeof(SYSTIM)\n", 2 <= sizeof(SYSTIM) ? "<=": ">");
  systim1.utime = -1;
  systim1.ltime = -1;
  printf(" systim1.utime %s 0\n", systim1.utime > 0 ? ">": "<=");
  printf(" systim1.ltime %s 0\n", systim1.ltime > 0 ? ">": "<=");

  printf(" sizeof(VP_INT) %s  sizeof(INT)  && sizeof(VP_INT) %s sizeof(VP)\n",
	 sizeof(VP_INT) >= sizeof(INT) ? ">=": "<",
	 sizeof(VP_INT) >= sizeof(VP)  ? ">=": "<");
  vp_int1 = -1;
  printf(" vp_int1 %s 0\n", vp_int1 < 0 ? "<": ">=");

  printf(" 1 %s sizeof(ER_BOOL)\n", 1 <= sizeof(ER_BOOL) ? "<=": ">");
  er_bool1 = TRUE;
  printf(" er_bool1 %c= TRUE\n", er_bool1 == TRUE ? '=': '!');
  er_bool1 = FALSE;
  printf(" er_bool1 %c= FALSE\n", er_bool1 == FALSE ? '=': '!');
  er_bool1 = -1;
  printf(" er_bool1 %s 0\n", er_bool1 < 0 ? "<": ">=");

  printf(" 2 %s sizeof(ER_ID)\n", 2 <= sizeof(ER_ID) ? "<=": ">");
  er_id1 = -1;
  printf(" er_id1 %s 0\n", er_id1 < 0 ? "<": ">=");

  printf(" 2 %s sizeof(ER_UINT)\n", 2 <= sizeof(ER_UINT) ? "<=": ">");
  er_uint1 = -1;
  printf(" er_uint1 %s 0\n", er_uint1 < 0 ? "<": ">=");

  puts("TASK1: End");
  ext_tsk();
}

恥ずかしいばかりにそのまんまである。

そして実行結果。

Test start.
TASK1: Start
 1 == sizeof(B)
 b1 < 0:
 1 == sizeof(UB)
 ub1 > 0:
 2 == sizeof(H)
 h1 < 0:
 2 == sizeof(UH)
 uh1 > 0:
 4 == sizeof(W)
 w1 < 0:
 4 == sizeof(UW)
 uw1 > 0:
 1 == sizeof(VB)
 2 == sizeof(VH)
 4 == sizeof(VW)
 sizeof(void *) == sizeof(VP)
 sizeof(void *) == sizeof(FP)
 2 <= sizeof(INT)
 int1 < 0
 2 <= sizeof(UINT)
 uint1 > 0
 bool1 == TRUE
 bool1 == FALSE
 2 <= sizeof(FN)
 fn1 < 0
 1 <= sizeof(ER)
 er1 < 0
 2 <= sizeof(ID)
 id1 < 0
 1 <= sizeof(ATR)
 atr1 > 0
 2 <= sizeof(STAT)
 stat1 > 0
 1 <= sizeof(MODE)
 mode1 > 0
 2 <= sizeof(PRI)
 pri1 < 0
 sizeof(SIZE) == sizeof(void *)
 size1 > 0
 2 <= sizeof(TMO)
 tmo1 < 0
 2 <= sizeof(RELTIM)
 reltim1 > 0
 2 <= sizeof(SYSTIM)
 systim1.utime > 0
 systim1.ltime > 0
 sizeof(VP_INT) >=  sizeof(INT)  && sizeof(VP_INT) >= sizeof(VP)
 vp_int1 < 0
 1 <= sizeof(ER_BOOL)
 er_bool1 == TRUE
 er_bool1 == FALSE
 er_bool1 < 0
 2 <= sizeof(ER_ID)
 er_id1 < 0
 2 <= sizeof(ER_UINT)
 er_uint1 < 0
TASK1: End

問題無く完了。


COM8:ITRON仕様共通規定のテスト手順 その8

pol_sem()が正しくE_TMOUTを返している事と、エラー関連のマクロMERCD()/SERCD() が正しく定義されていることの確認か。

何の芸もなくそのまま。

#include <stdio.h>
#include <kernel.h>
#include "kernel_id.h"
#include "test_def.h"

void TASK1( VP_INT exinf)
{
  ER ercd;

  printf("TASK1: Start\n");

  ercd = pol_sem(SEM_ID1);
  printf("TASK1: (ER)(B)ercd %c= E_TMOUT\n", (ER)(B)ercd == E_TMOUT ? '=': '!');

  printf("TASK1:  ercd >> 8 %s 0\n", ercd >> 8 < 0 ? "<": ">=");

  printf("TASK1: MERCD(ercd) %c= (ER)(B)ercd\n",
	 MERCD(ercd) == (ER)(B)ercd ? '=': '!');

  printf("TASK1: SERCD(ercd) %c= ercd >> 8\n", SERCD(ercd) == ercd >> 8 ? '=': '!');

  printf("TASK1: End\n");
  ext_tsk();
}

で、実行結果。

test start
TASK1: Start
TASK1: (ER)(B)ercd == E_TMOUT
TASK1:  ercd >> 8 < 0
TASK1: MERCD(ercd) == (ER)(B)ercd
TASK1: SERCD(ercd) == ercd >> 8
TASK1: End

完了。

この項終り


リスト

実行結果