OSDN Git Service

modify cortex_m3
[hos/hos-v4a.git] / sample / arm / stm32f103 / 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-2006 by Project HOS
8  * http://sourceforge.jp/projects/hos/
9  */
10
11 #include <stdlib.h>
12 #include <string.h>
13 #include "kernel.h"
14 #include "kernel_id.h"
15 #include "uart.h"
16
17
18 #define LEFT(num)       ((num) <= 1 ? 5 : (num) - 1)
19 #define RIGHT(num)      ((num) >= 5 ? 1 : (num) + 1)
20
21
22 ID mbxid;
23 ID mpfid;
24
25
26 /** %jp{メッセージ構造体} */
27 typedef struct t_print_msg
28 {
29         T_MSG msg;
30         char  text[32];
31 } T_PRINT_MSG;
32
33
34 /** %jp{初期化ハンドラ} */
35 void Sample_Initialize(VP_INT exinf)
36 {
37         T_CMPF cmpf;
38         T_CMBX cmbx;
39         
40         /* %jp{UART初期化} */
41         Uart_Initialize();
42         
43         /* %jp{固定長メモリプール生成} */
44         cmpf.mpfatr = TA_TFIFO;                                 
45         cmpf.blkcnt = 3;                                                
46         cmpf.blksz  = sizeof(T_PRINT_MSG);              
47         cmpf.mpf    = NULL;                                             
48         mpfid = acre_mpf(&cmpf);
49
50         /* %jp{メールボックス生成} */
51         cmbx.mbxatr  = TA_TFIFO | TA_TFIFO;             
52         cmbx.maxmpri = 1;                                               
53         cmbx.mprihd  = NULL;                                    
54         mbxid = acre_mbx(&cmbx);
55
56         /* %jp{タスク起動} */
57         act_tsk(TSKID_PRINT);
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);
63 }
64
65
66 /** %jp{適当な時間待つ} */
67 void rand_wait(void)
68 {
69         int r;
70
71         wai_sem(SEMID_RAND);
72         r = rand();
73         sig_sem(SEMID_RAND);
74
75         dly_tsk((r % 100) + 10);
76 }
77
78
79 /** %jp{状態表示} */
80 void print_state(int num, char *text)
81 {
82         T_PRINT_MSG *msg;
83         VP  mem;
84         
85         /* %jp{メモリ取得} */
86         get_mpf(mpfid, &mem);
87         msg = (T_PRINT_MSG *)mem;
88
89         /* %jp{文字列生成} */
90         msg->text[0] = '0' + num;
91         msg->text[1] = ' ';
92         msg->text[2] = ':';
93         msg->text[3] = ' ';
94         strcpy(&msg->text[4], text);
95         strcat(msg->text, "\n");
96         
97         /* %jp{表示タスクに送信} */
98         snd_mbx(mbxid, (T_MSG *)msg);
99 }
100
101
102 /** %jp{サンプルタスク} */
103 void Sample_Task(VP_INT exinf)
104 {
105         int num;
106         
107         num = (int)exinf;
108         
109         /* %jp{いわゆる哲学者の食事の問題} */
110         for ( ; ; )
111         {
112                 /* %jp{適当な時間考える} */
113                 print_state(num, "thinking");
114                 rand_wait();
115                 
116                 /* %jp{左右のフォークを取るまでループ} */
117                 for ( ; ; )
118                 {
119                         /* %jp{左から順に取る} */
120                         wai_sem(LEFT(num));
121                         if ( pol_sem(RIGHT(num)) == E_OK )
122                         {
123                                 break;  /* %jp{両方取れた} */
124                         }
125                         sig_sem(LEFT(num));     /* %jp{取れなければ離す} */
126                         
127                         /* %jp{適当な時間待つ} */
128                         print_state(num, "hungry");
129                         rand_wait();
130
131                         /* %jp{右から順に取る} */
132                         wai_sem(RIGHT(num));
133                         if ( pol_sem(LEFT(num)) == E_OK )
134                         {
135                                 break;  /* %jp{両方取れた} */
136                         }
137                         sig_sem(RIGHT(num));    /* %jp{取れなければ離す} */
138
139                         /* %jp{適当な時間待つ} */
140                         print_state(num, "hungry");
141                         rand_wait();
142                 }
143                 
144                 /* %jp{適当な時間、食べる} */
145                 print_state(num, "eating");
146                 rand_wait();
147                 
148                 /* %jp{フォークを置く} */
149                 sig_sem(LEFT(num));
150                 sig_sem(RIGHT(num));
151         }
152 }
153
154
155 /** %jp{表示タスク} */
156 void Sample_Print(VP_INT exinf)
157 {
158         T_PRINT_MSG *msg;
159         
160         for ( ; ; )
161         {
162                 rcv_mbx(mbxid, (T_MSG **)&msg);
163                 Uart_PutString(msg->text);
164                 rel_mpf(mpfid, msg);
165         }
166 }
167
168
169
170 /* end of file */