2 * Sample program for Hyper Operating System V4 Advance
5 * @brief %jp{サンプルプログラム}%en{Sample program}
7 * Copyright (C) 1998-2006 by Project HOS
8 * http://sourceforge.jp/projects/hos/
14 #include "kernel_id.h"
18 #define LEFT(num) ((num) <= 1 ? 5 : (num) - 1)
19 #define RIGHT(num) ((num) >= 5 ? 1 : (num) + 1)
27 typedef struct t_print_msg
35 void Sample_Initialize(VP_INT exinf)
40 /* %jp{固定長メモリプール生成} */
41 cmpf.mpfatr = TA_TFIFO;
43 cmpf.blksz = sizeof(T_PRINT_MSG);
45 mpfid = acre_mpf(&cmpf);
48 cmbx.mbxatr = TA_TFIFO | TA_TFIFO;
51 mbxid = acre_mbx(&cmbx);
55 act_tsk(TSKID_SAMPLE1);
56 act_tsk(TSKID_SAMPLE2);
57 act_tsk(TSKID_SAMPLE3);
58 act_tsk(TSKID_SAMPLE4);
59 act_tsk(TSKID_SAMPLE5);
66 dly_tsk(rand() % 1000 + 1);
71 void print_state(int num, char *text)
78 msg = (T_PRINT_MSG *)mem;
81 msg->text[0] = '0' + num;
85 strcpy(&msg->text[4], text);
86 strcat(msg->text, "\n");
89 snd_mbx(mbxid, (T_MSG *)msg);
94 void Sample_Task(VP_INT exinf)
100 /* %jp{いわゆる哲学者の食事の問題} */
104 print_state(num, "thinking");
107 /* %jp{左右のフォークを取るまでループ} */
112 if ( pol_sem(RIGHT(num)) == E_OK )
114 break; /* %jp{両方取れた} */
116 sig_sem(LEFT(num)); /* %jp{取れなければ離す} */
119 print_state(num, "hungry");
124 if ( pol_sem(LEFT(num)) == E_OK )
126 break; /* %jp{両方取れた} */
128 sig_sem(RIGHT(num)); /* %jp{取れなければ離す} */
131 print_state(num, "hungry");
136 print_state(num, "eating");
147 void Sample_Print(VP_INT exinf)
153 rcv_mbx(mbxid, (T_MSG **)&msg);
154 Sci1_PutString(msg->text);