Example of MailBox APIs-Synchronization and Communication functions

  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