Example of Message Buffer APIs-Extended Synchronization and Communication functions

  1 /*
  2  *        main.c 
  3  *        To demonstrate APIs related to mbf
  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 mbf_id = -1;
 17 
 18 /*****************************************************************************
 19 task1
 20 ******************************************************************************/
 21 IMPORT void
 22 task1 (INT stacd, VP exinf)
 23 {
 24   ER ercd = 0;
 25   T_RMBF mbf;
 26   UINT Msg;
 27 
 28   printf ("This is task %d waiting for mbf\n", taskid1);
 29 
 30   ercd = tk_ref_mbf (mbf_id, &mbf);
 31   if (ercd < 0)
 32     {
 33       printf ("ref mbf error %x\n", ercd);
 34       tk_del_mbf (mbf_id);
 35       goto exit;
 36     }
 37   printf ("msg sz = %d free size = %d\n", mbf.msgsz, mbf.frbufsz);
 38   printf ("wait for msg buf %d\n\n", mbf_id);
 39   ercd = tk_rcv_mbf (mbf_id, (VP) & Msg, TMO_FEVR);
 40   if (ercd < 0)
 41     {
 42       printf ("rcv mbf error %x\n", ercd);
 43       tk_del_mbf (mbf_id);
 44       goto exit;
 45     }
 46   printf ("data rcv = %x\n", Msg);
 47   ercd = tk_del_mbf (mbf_id);
 48   if (ercd < 0)
 49     printf ("del mbf error %x\n", ercd);
 50 exit:
 51   printf ("task 1 exit and del task, msg buf now\n");
 52   taskid1 = -1;
 53   mbf_id = -1;
 54   tk_exd_tsk ();
 55 }
 56 
 57 
 58 /******************************************************************************
 59 task2
 60  *****************************************************************************/
 61 IMPORT void
 62 task2 (INT stacd, VP exinf)
 63 {
 64   UW buf = 0;
 65   ER ercd = 0;
 66 
 67   buf = 0xAA55AA55;
 68   printf ("\ttask %d snd msg buf %d, data = %x\n", taskid2, mbf_id, buf);
 69   ercd = tk_snd_mbf (mbf_id, (VP) & buf, 4, TMO_FEVR);
 70   if (ercd < 0)
 71     {
 72       printf ("\tsnd mbf fails error %x\n", ercd);
 73       tk_del_mbf (mbf_id);
 74     }
 75   printf ("\ttask 2 exit and del task now\n");
 76   taskid2 = -1;
 77   tk_exd_tsk ();
 78 }
 79 
 80 
 81 /******************************************************************************
 82 main
 83 ******************************************************************************/
 84 EXPORT ER
 85 main (INT ac, UB * av[])
 86 {
 87   T_CTSK ctsk;
 88   T_CMBF _mbf;
 89 
 90 #ifdef DEBUG
 91   tm_monitor ();
 92 #endif
 93   printf ("main: (ac = %d)\n", ac);
 94 
 95   if (ac < 0)
 96     {
 97       if (taskid1 >= 0)
 98         {
 99           tk_ter_tsk (taskid1);
100           tk_del_tsk (taskid1);
101         }
102       if (taskid2 >= 0)
103         {
104           tk_ter_tsk (taskid2);
105           tk_del_tsk (taskid2);
106         }
107       goto ext;
108     }
109   _mbf.exinf = (VP) 0x00000000;
110   _mbf.mbfatr = TA_TFIFO;
111   _mbf.bufsz = 0;
112   _mbf.maxmsz = sizeof (UW);
113   mbf_id = tk_cre_mbf (&_mbf);
114   printf ("tk_cre_mbf: (mbf id = %d)\n", mbf_id);
115   if (mbf_id < E_OK)
116     {
117       printf ("cre mbx fails = %x\n", mbf_id);
118       goto ext;
119     }
120 
121   ctsk.exinf = (VP) 0x74736574;
122   ctsk.tskatr = TA_HLNG | TA_RNG0;
123   ctsk.task = task1;
124   ctsk.itskpri = 80;
125   ctsk.stksz = 1024 * 4;
126   taskid1 = tk_cre_tsk (&ctsk);
127   printf ("tk_cre_tsk: (task1id = %d)\n", taskid1);
128   if (taskid1 < E_OK)
129     {
130       tk_del_mbf (mbf_id);
131       printf ("cre tsk 1 fails = %x\n", taskid1);
132       goto ext;
133     }
134 
135   ctsk.exinf = (VP) 0x74736574;
136   ctsk.tskatr = TA_HLNG | TA_RNG0;
137   ctsk.task = task2;
138   ctsk.itskpri = 80;
139   ctsk.stksz = 1024 * 4;
140   taskid2 = tk_cre_tsk (&ctsk);
141   printf ("tk_cre_tsk: (task2id = %d)\n", taskid2);
142   if (taskid2 < E_OK)
143     {
144       tk_del_mbf (mbf_id);
145       tk_del_tsk (taskid1);
146       printf ("cre tsk 2 fails = %x\n", taskid2);
147       goto ext;
148     }
149 
150   printf ("start tasks now\n");
151   tk_sta_tsk (taskid1, 0);
152 
153   tk_sta_tsk (taskid2, 0);
154 
155   tk_dly_tsk (4000);
156   /*end */
157 ext:
158   printf ("main ended\n\n");
159   return 0;
160 }

Comments

Click here to Post a Comment