OSDN Git Service

add Simple Microblaze Microcontroler sample
[hos/hos-v4a.git] / sample / mb / smm / sample.c
1 /** 
2  *  Sample program for Hyper Operating System V4 Advance
3  *
4  * @file  sample.c
5  * @brief %jp{サンプルプログラム}%en{Sample program}
6  *
7  * Copyright (C) 1998-2009 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11
12 #include <stdlib.h>
13 #include <string.h>
14 #include "kernel.h"
15 #include "kernel_id.h"
16 #include "uart.h"
17
18
19 #define LEFT(num)       ((num) <= 1 ? 5 : (num) - 1)
20 #define RIGHT(num)      ((num) >= 5 ? 1 : (num) + 1)
21
22
23 /** %jp{初期化ハンドラ} */
24 void Sample_Initialize(VP_INT exinf)
25 {
26         /* %jp{UART初期化} */
27         Uart_Initialize();
28         
29         /* %jp{タスク起動} */
30         act_tsk(TSKID_SAMPLE1);
31         act_tsk(TSKID_SAMPLE2);
32         act_tsk(TSKID_SAMPLE3);
33         act_tsk(TSKID_SAMPLE4);
34         act_tsk(TSKID_SAMPLE5);
35 }
36
37
38 /** %jp{適当な時間待つ} */
39 void Sample_RandWait(void)
40 {
41         static unsigned long seed = 12345;
42         unsigned long r;
43         
44         wai_sem(SEMID_RAND);
45         seed = seed * 22695477UL + 1;
46         r = seed;
47         sig_sem(SEMID_RAND);
48         
49         dly_tsk((r % 1000) + 100);
50 }
51
52
53 /** %jp{状態表示} */
54 void Sample_PrintSatet(int num, const char *text)
55 {
56         int     i;
57         
58         wai_sem(SEMID_UART);
59         
60         /* %jp{文字列出力} */
61         Uart_PutChar('0' + num);
62         Uart_PutChar(' ');
63         Uart_PutChar(':');
64         Uart_PutChar(' ');
65         for ( i = 0; text[i] != '\0'; i++ )
66         {
67                 Uart_PutChar(text[i]);
68         }
69         Uart_PutChar('\r');
70         Uart_PutChar('\n');
71         
72         sig_sem(SEMID_UART);
73 }
74
75
76
77 /** %jp{サンプルタスク} */
78 void Sample_Task(VP_INT exinf)
79 {
80         int num;
81         
82         num = (int)exinf;
83         
84         /* %jp{いわゆる哲学者の食事の問題} */
85         for ( ; ; )
86         {
87                 /* %jp{適当な時間考える} */
88                 Sample_PrintSatet(num, "thinking");
89                 Sample_RandWait();
90                 
91                 /* %jp{左右のフォークを取るまでループ} */
92                 for ( ; ; )
93                 {
94                         /* %jp{左から順に取る} */
95                         wai_sem(LEFT(num));
96                         if ( pol_sem(RIGHT(num)) == E_OK )
97                         {
98                                 break;  /* %jp{両方取れた} */
99                         }
100                         sig_sem(LEFT(num));     /* %jp{取れなければ離す} */
101                         
102                         /* %jp{適当な時間待つ} */
103                         Sample_PrintSatet(num, "hungry");
104                         Sample_RandWait();
105                         
106                         /* %jp{右から順に取る} */
107                         wai_sem(RIGHT(num));
108                         if ( pol_sem(LEFT(num)) == E_OK )
109                         {
110                                 break;  /* %jp{両方取れた} */
111                         }
112                         sig_sem(RIGHT(num));    /* %jp{取れなければ離す} */
113                         
114                         /* %jp{適当な時間待つ} */
115                         Sample_PrintSatet(num, "hungry");
116                         Sample_RandWait();
117                 }
118                 
119                 /* %jp{適当な時間、食べる} */
120                 Sample_PrintSatet(num, "eating");
121                 Sample_RandWait();
122                 
123                 /* %jp{フォークを置く} */
124                 sig_sem(LEFT(num));
125                 sig_sem(RIGHT(num));
126         }
127 }
128
129
130 /* end of file */