1 /*
2 * main.c
3 * To demonstrate the APIs related to mailbox
4 */
5
6 #include <basic.h>
7 #include <tk/tkernel.h>
8 #include <stdio.h>
9 #ifdef DEBUG
10 #include <util/tmonitor.h>
11 #endif
12
13 IMPORT void task1 (INT, VP);
14 ID taskid1 = -1;
15 ID taskid2 = -1;
16 ID mbx_id = -1;
17 ID mem_id = -1;
18 VP buf = 0;
19
20 /******************************************************************************
21 task1
22 ******************************************************************************/
23 IMPORT void
24 task1 (INT stacd, VP exinf)
25 {
26 ER ercd = 0;
27 T_MSG *p_Msg;
28 VP *p;
29
30 printf ("This is task %d waiting for mbx\n", taskid1);
31
32 printf ("wait for mailbox %d\n\n", mbx_id);
33 ercd = tk_rcv_mbx (mbx_id, (T_MSG **) & p_Msg, TMO_FEVR);
34 if (ercd < 0)
35 {
36 printf ("rcv mbx error %x\n", ercd);
37 goto exit;
38 }
39 // printf("addr rcv_mbx %x %x %x\n", *p_Msg, p_Msg, &p_Msg);
40 p = *((VP *) p_Msg);
41 printf ("task %d rcv mbx data = %x\n\n", taskid1, *((UW *) p));
42 ercd = tk_rel_mpl (mem_id, *((VP *) p_Msg));
43 if (ercd < 0)
44 {
45 printf ("rel mpl error %x\n", ercd);
46 tk_del_mbx (mbx_id);
47 tk_del_mpl (mem_id);
48 goto exit;
49 }
50 ercd = tk_del_mpl (mem_id);
51 if (ercd < 0)
52 {
53 printf ("del mpl error %x\n", ercd);
54 tk_del_mbx (mbx_id);
55 goto exit;
56 }
57 ercd = tk_del_mbx (mbx_id);
58 if (ercd < 0)
59 printf ("del mbx error %x\n", ercd);
60 exit:
61 printf ("task 1 exit and del task, mbx, mpl now\n");
62 mem_id = -1;
63 taskid1 = -1;
64 mbx_id = -1;
65 tk_exd_tsk ();
66 }
67
68
69
70 /******************************************************************************
71 task2
72 *****************************************************************************/
73 IMPORT void
74 task2 (INT stacd, VP exinf)
75 {
76 T_CMPL mempool;
77 ER ercd = 0;
78
79 mempool.exinf = (VP) 0x00000000;
80 mempool.mplatr = TA_TFIFO | TA_RNG0;
81 mempool.mplsz = (INT) 4;
82 mem_id = tk_cre_mpl (&mempool);
83 if (mem_id < 0)
84 {
85 printf ("\tcre var mem pool fails error %x\n", mem_id);
86 goto exit;
87 }
88 ercd = tk_get_mpl (mem_id, mempool.mplsz, (VP *) & buf, TMO_FEVR);
89 if (ercd < 0)
90 {
91 printf ("\tget var mem pool fails error %x\n", ercd);
92 tk_del_mpl (mem_id);
93 goto exit;
94 }
95 printf ("\taddr = %x\n", buf);
96 *((UW *) buf) = 0xAA55AA55;
97 printf ("\ttask %d snd mbx, data = %x\n", taskid2, *((UW *) buf));
98 ercd = tk_snd_mbx (mbx_id, (T_MSG *) & buf);
99 if (ercd < 0)
100 {
101 printf ("\tsnd mbx fails error %x\n", ercd);
102 tk_rel_mpl (mem_id, (VP) & buf);
103 tk_del_mpl (mem_id);
104 tk_del_mbx (mbx_id);
105 }
106 exit:
107 printf ("\ttask 2 exit and del task now\n");
108 taskid2 = -1;
109 tk_exd_tsk ();
110 }
111
112
113 /******************************************************************************
114 main
115 ******************************************************************************/
116 EXPORT ER
117 main (INT ac, UB * av[])
118 {
119 T_CTSK ctsk;
120 T_CMBX mbx;
121
122 #ifdef DEBUG
123 tm_monitor ();
124 #endif
125 printf ("main: (ac = %d)\n", ac);
126
127 if (ac < 0)
128 {
129 if (taskid1 >= 0)
130 {
131 tk_ter_tsk (taskid1);
132 tk_del_tsk (taskid1);
133 }
134 if (taskid2 >= 0)
135 {
136 tk_ter_tsk (taskid2);
137 tk_del_tsk (taskid2);
138 }
139 goto ext;
140 }
141 mbx.exinf = (VP) 0x00000000;
142 mbx.mbxatr = TA_TFIFO | TA_MFIFO;
143 mbx_id = tk_cre_mbx (&mbx);
144 printf ("tk_cre_mbx: (mbx id = %d)\n", mbx_id);
145 if (mbx_id < E_OK)
146 {
147 printf ("cre mbx fails = %x\n", mbx_id);
148 goto ext;
149 }
150
151 ctsk.exinf = (VP) 0x74736574;
152 ctsk.tskatr = TA_HLNG | TA_RNG0;
153 ctsk.task = task1;
154 ctsk.itskpri = 80;
155 ctsk.stksz = 1024 * 4;
156 taskid1 = tk_cre_tsk (&ctsk);
157 printf ("tk_cre_tsk: (task1id = %d)\n", taskid1);
158 if (taskid1 < E_OK)
159 {
160 tk_del_mbx (mbx_id);
161 printf ("cre tsk 1 fails = %x\n", taskid1);
162 goto ext;
163 }
164
165 ctsk.exinf = (VP) 0x74736574;
166 ctsk.tskatr = TA_HLNG | TA_RNG0;
167 ctsk.task = task2;
168 ctsk.itskpri = 80;
169 ctsk.stksz = 1024 * 4;
170 taskid2 = tk_cre_tsk (&ctsk);
171 printf ("tk_cre_tsk: (task2id = %d)\n", taskid2);
172 if (taskid2 < E_OK)
173 {
174 tk_del_mbx (mbx_id);
175 tk_del_tsk (taskid1);
176 printf ("cre tsk 2 fails = %x\n", taskid2);
177 goto ext;
178 }
179
180 printf ("start tasks now\n");
181 tk_sta_tsk (taskid1, 0);
182 tk_dly_tsk (500);
183 tk_sta_tsk (taskid2, 0);
184
185 /*end */
186 ext:
187 printf ("main ended\n\n");
188 return 0;
189 }
Comments
Click here to Post a Comment