1 /*
2 * main.c
3 *
4 * To demonstrate the use of mutex APIs
5 */
6
7 #include <basic.h>
8 #include <tk/tkernel.h>
9 #include <stdio.h>
10 #ifdef DEBUG
11 #include <util/tmonitor.h>
12 #endif
13
14 IMPORT void task1 (INT, VP);
15 ID taskid1 = -1;
16 ID taskid2 = -1;
17 ID mtx_id = -1;
18 ID flg_id = -1;
19
20 /*****************************************************************
21 task1 and task 2 trying to acquire resource
22 ****************************************************************/
23 IMPORT void
24 task1 (INT stacd, VP exinf)
25 {
26 int cnt = 0;
27 ER ercd = 0;
28 T_RTSK tsk_info;
29
30 printf ("This is task %d, going for 3 loop\n", taskid1);
31 while (cnt < 3)
32 {
33 printf ("task %d try lock mtx\n", taskid1);
34 ercd = tk_loc_mtx (mtx_id, TMO_FEVR);
35 if (ercd < 0 && ercd != E_ILUSE)
36 {
37 printf ("loc mtx fails %x\n", ercd);
38 tk_dly_tsk (100);
39 continue;
40 }
41 printf ("enter critical section task %d: cnt = %d\n", taskid1, cnt++);
42 tk_dly_tsk (2000);
43 tk_ref_tsk (taskid1, &tsk_info);
44 printf ("task id = %d pri = %d base pri = %d\n",
45 taskid1, tsk_info.tskpri, tsk_info.tskbpri);
46 tk_ref_tsk (taskid2, &tsk_info);
47 printf ("task id = %d pri = %d base pri = %d\n",
48 taskid2, tsk_info.tskpri, tsk_info.tskbpri);
49 printf ("delay task 1 over leave critical section\n");
50 tk_unl_mtx (mtx_id);
51 }
52 tk_del_mtx (mtx_id);
53
54 printf ("task 1 exit and del task, mutex now\n");
55 taskid1 = -1;
56 mtx_id = -1;
57
58 tk_exd_tsk ();
59 }
60
61
62 /*****************************************************************
63 task1 and task 2 trying to acquire resource
64 ****************************************************************/
65 IMPORT void
66 task2 (INT stacd, VP exinf)
67 {
68 int cnt = 0;
69 ER ercd = 0;
70 T_RTSK tsk_info;
71
72 printf ("\tThis is task %d, going for 3 loop\n", taskid2);
73 while (cnt < 3)
74 {
75 printf ("\ttask %d try loc mtx\n", taskid2);
76 ercd = tk_loc_mtx (mtx_id, TMO_FEVR);
77 if (ercd < 0 && ercd != E_ILUSE)
78 {
79 printf ("\tloc mtx fails %x\n", ercd);
80 tk_dly_tsk (150);
81 continue;
82 }
83 printf ("\tenter critical section task %d: cnt = %d\n", taskid2, cnt++);
84 tk_dly_tsk (2000);
85 tk_ref_tsk (taskid1, &tsk_info);
86 printf ("\ttask id = %d pri = %d base pri = %d\n",
87 taskid1, tsk_info.tskpri, tsk_info.tskbpri);
88 tk_ref_tsk (taskid2, &tsk_info);
89 printf ("\ttask id = %d pri = %d base pri = %d\n",
90 taskid2, tsk_info.tskpri, tsk_info.tskbpri);
91 printf ("\tdelay task 2 over leave critical section\n");
92 tk_unl_mtx (mtx_id);
93 }
94
95 if (ercd < 0)
96 {
97 printf ("\tset flag error %x", ercd);
98 }
99 printf ("\ttask 2 exit and del task now\n");
100 taskid2 = -1;
101 tk_exd_tsk ();
102 }
103
104
105 /******************************************************************************
106 main
107 ******************************************************************************/
108 EXPORT ER
109 main (INT ac, UB * av[])
110 {
111 T_CTSK ctsk;
112 T_CMTX mtx;
113
114 #ifdef DEBUG
115 tm_monitor ();
116 #endif
117 printf ("main: (ac=%d)\n", ac);
118
119 if (ac < 0)
120 {
121 if (taskid1 >= 0)
122 {
123 tk_ter_tsk (taskid1);
124 tk_del_tsk (taskid1);
125 }
126 if (taskid2 >= 0)
127 {
128 tk_ter_tsk (taskid2);
129 tk_del_tsk (taskid2);
130 }
131 goto ext;
132 }
133 mtx.exinf = (VP) 0x00000000;
134 #if 0
135 mtx.mtxatr = TA_TFIFO | TA_CEILING;
136 #else
137 mtx.mtxatr = TA_TFIFO | TA_INHERIT;
138 #endif
139 mtx.ceilpri = 70;
140 mtx_id = tk_cre_mtx (&mtx);
141 printf ("tk_cre_mtx: (mtx id = %d)\n", mtx_id);
142 if (mtx_id < E_OK)
143 goto ext;
144
145 ctsk.exinf = (VP) 0x74736574;
146 ctsk.tskatr = TA_HLNG | TA_RNG0;
147 ctsk.task = task1;
148 ctsk.itskpri = 81;
149 ctsk.stksz = 1024 * 4;
150 taskid1 = tk_cre_tsk (&ctsk);
151 printf ("tk_cre_tsk: (task1id = %d)\n", taskid1);
152 if (taskid1 < E_OK)
153 {
154 tk_del_mtx (mtx_id);
155 goto ext;
156 }
157
158 ctsk.exinf = (VP) 0x74736574;
159 ctsk.tskatr = TA_HLNG | TA_RNG0;
160 ctsk.task = task2;
161 ctsk.itskpri = 80;
162 ctsk.stksz = 1024 * 4;
163 taskid2 = tk_cre_tsk (&ctsk);
164 printf ("tk_cre_tsk: (task2id = %d)\n", taskid2);
165 if (taskid2 < E_OK)
166 {
167 tk_del_mtx (mtx_id);
168 tk_del_tsk (taskid1);
169 goto ext;
170 }
171
172 printf ("start tasks now\n");
173 tk_sta_tsk (taskid1, 0);
174
175 tk_sta_tsk (taskid2, 0);
176
177 tk_dly_tsk (15000);
178 /*end */
179 ext:
180 printf ("main ended\n\n");
181 return 0;
182 }
Comments
Click here to Post a Comment