特に問題は無い筈だが、なるだけ単純化する為に。
/* --------------------------------------------------------- */ /* 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の開始だけ。
/* ターゲット(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});
![]() |
あれれ、なんだこりゃ。
#include <kernel.h> #include <kernel.h> B c; main() { B a = 1, b = 2; c = a + b; } |
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。完了。
![]() |
しかし、大きいと言っても大した事は無い。ここでテストしている事は、
#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でいかにやるか」だ。
![]() |
ここで確認される機能は、
これまた素直に書いていくだけだが、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 コンフィグレーションファイル */ 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な開発環境ではこのスタイルは受け 入れられないだろうか?でも、とにかく完了。
![]() |
これについては実装毎に拡張を許しているので厳密に行なう必要は無いのかも しれないが、現状で拡張機能の無い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 |
実行結果そのままだがどうだろう。エラー行番号表示が、元ファイルの行では なくプリプロセッサを通したものの行になっている点は今一な感があるが、そ の中間ファイルはコンフィグレーションが失敗した場合には残るので問題有る まい。
ということで完了。
![]() |
こ、これって…。
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 |
これでどうだ!
完了。
![]() |
これってタスクにする意味があるのだろうか…。
#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 |
問題無く完了。
![]() |
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 |
完了。
この項終り