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)
43 /* %jp{固定長メモリプール生成} */
44 cmpf.mpfatr = TA_TFIFO;
46 cmpf.blksz = sizeof(T_PRINT_MSG);
48 mpfid = acre_mpf(&cmpf);
51 cmbx.mbxatr = TA_TFIFO | TA_TFIFO;
54 mbxid = acre_mbx(&cmbx);
58 act_tsk(TSKID_SAMPLE1);
59 act_tsk(TSKID_SAMPLE2);
60 act_tsk(TSKID_SAMPLE3);
61 act_tsk(TSKID_SAMPLE4);
62 act_tsk(TSKID_SAMPLE5);
75 dly_tsk((r % 100) + 10);
80 void print_state(int num, char *text)
87 msg = (T_PRINT_MSG *)mem;
90 msg->text[0] = '0' + num;
94 strcpy(&msg->text[4], text);
95 strcat(msg->text, "\n");
98 snd_mbx(mbxid, (T_MSG *)msg);
103 void Sample_Task(VP_INT exinf)
109 /* %jp{いわゆる哲学者の食事の問題} */
113 print_state(num, "thinking");
116 /* %jp{左右のフォークを取るまでループ} */
121 if ( pol_sem(RIGHT(num)) == E_OK )
123 break; /* %jp{両方取れた} */
125 sig_sem(LEFT(num)); /* %jp{取れなければ離す} */
128 print_state(num, "hungry");
133 if ( pol_sem(LEFT(num)) == E_OK )
135 break; /* %jp{両方取れた} */
137 sig_sem(RIGHT(num)); /* %jp{取れなければ離す} */
140 print_state(num, "hungry");
145 print_state(num, "eating");
156 void Sample_Print(VP_INT exinf)
162 rcv_mbx(mbxid, (T_MSG **)&msg);
163 Uart_PutString(msg->text);