source: svn/trunk/newcon3bcm2_21bu/dst/dhl/api/test/OSSemTest.c @ 2

Last change on this file since 2 was 2, checked in by jglee, 11 years ago

first commit

  • Property svn:executable set to *
File size: 13.2 KB
Line 
1/*
2        OSSemTest.c
3
4*/
5
6
7#include "DHL_OSAL.h"
8
9#include "string.h"
10#include "stdio.h"
11
12
13#if COMMENT
14____SemTest____(){}
15#endif
16
17
18
19static DHL_OS_SEMA_ID lcsem, lmsem, lbsem;
20static int sem_task_state;
21
22void sem_test(int type, int value)
23{
24        int r;
25        DHL_OS_TASK_INFO tInfo;
26
27        DHL_OS_Printf("====> before test: csem 0x%x, msem 0x%x, bsem 0x%x\n", lcsem, lmsem, lbsem);     
28
29        DHL_OS_GetTaskInfo(0, &tInfo);
30        DHL_OS_Printf("Task id = 0x%x, priority = %d, name = %s\n", tInfo.tid, tInfo.priority, tInfo.name);
31
32        switch (type)
33        {
34        case 0:
35                DHL_OS_Printf("sem: delete test\n");
36                if (lcsem) {
37                        DHL_OS_DeleteSemaphore(lcsem);
38                        lcsem = 0;
39                }
40                break;
41
42        case 1:
43                DHL_OS_Printf("sem: create test\n");
44                lcsem = DHL_OS_CreateCountingSemaphore("", 0, 0);
45                break;
46        case 2:
47                DHL_OS_Printf("sem: take test, lcsem %x, timeout %d, tick %d\n", lcsem, value, DHL_OS_GetMsCount());
48                r = DHL_OS_TakeSemaphore(lcsem, value);
49                DHL_OS_Printf("sem taken, return %d, at %d\n", r, DHL_OS_GetMsCount());
50                break;
51        case 3:
52                DHL_OS_Printf("sem: give test, lcsem %x, tick %d\n", lcsem, DHL_OS_GetMsCount());
53                r = DHL_OS_GiveSemaphore(lcsem);
54                DHL_OS_Printf("sem given, return %d at %d\n", r, DHL_OS_GetMsCount());
55                break;
56
57        /*
58                Shell> OS_SemTest 1           // check csem id
59                Shell> OS_SemTest 2 1000       // check if timeout occur.
60                Shell> OS_SemTest 2 20000 &   // this will be blocked.
61                Shell> OS_SemTest 3           // sem give and released.
62        */
63        case 10:
64                DHL_OS_Printf("mtx: delete\n");
65                if (lmsem) {
66                        DHL_OS_DeleteSemaphore(lmsem);
67                        lmsem = 0;
68                }
69                break;
70        case 11:
71                DHL_OS_Printf("mtx: create\n");
72                lmsem = DHL_OS_CreateMutexSemaphore("");
73                break;
74        case 12:
75                DHL_OS_Printf("mtx: take test, lmsem %x, timeout %d, tick %d\n", lmsem, value, DHL_OS_GetMsCount());
76                r = DHL_OS_TakeSemaphore(lmsem, value);
77                DHL_OS_Printf("mtx taken, err %d, at %d\n", r, DHL_OS_GetMsCount());
78                break;
79        case 13:
80                DHL_OS_Printf("mtx: give test, lmsem %x, tick %d\n", lmsem, DHL_OS_GetMsCount());
81                DHL_OS_GiveSemaphore(lmsem);
82                DHL_OS_Printf("mtx given tick %d\n", DHL_OS_GetMsCount());
83                break;
84        /*     
85        test1.
86                Shell> OS_SemTest 11         // mutex create
87                Shell> OS_SemTest 12 200     // mutex lock
88                Shell> OS_SemTest 13         // mutex unlock ok.
89                Shell> OS_SemTest 12 200     // mutex lock
90                Shell> OS_SemTest 12 200 &   // mutex lock in task 2. fail with timeout.
91                ..
92                Shell> OS_SemTest 13         // mutex unlock here. ok.
93        test2.
94                Shell> OS_SemTest 12 200 &
95                Shell> OS_SemTest 12 200     // lock again. this will fail with timeout.
96               
97                Shell> OS_SemTest 12 200
98                Shell> OS_SemTest 12 0x7fffffff &   // wait forever
99                Shell> OS_SemTest 13
100        */
101        case 20:
102                DHL_OS_Printf("bsem: delete\n");
103                if (lbsem) {
104                        DHL_OS_DeleteSemaphore(lbsem);
105                        lbsem = 0;
106                }
107                break;
108        case 21:
109                DHL_OS_Printf("bsem: create\n");
110                lbsem = DHL_OS_CreateBinarySemaphore("", 0, 0); // initial empty state
111                break;
112        case 22:
113                DHL_OS_Printf("bsem: take test, timeout %d, tick %d\n", value, DHL_OS_GetMsCount());
114                r = DHL_OS_TakeSemaphore(lbsem, value);
115                DHL_OS_Printf("bsem taken, err %d, at %d\n", r, DHL_OS_GetMsCount());
116                break;
117        case 23:
118                DHL_OS_Printf("bsem: give test, tick %d\n", DHL_OS_GetMsCount());
119                DHL_OS_GiveSemaphore(lbsem);
120                DHL_OS_Printf("bsem given tick %d\n", DHL_OS_GetMsCount());
121                break;
122               
123        /*
124                Shell> OS_SemTest 21      // create
125
126                Shell> OS_SemTest 22 200  // take.. fail with timeout.
127                Shell> OS_SemTest 23      // give
128                Shell> OS_SemTest 22 0    // take.. ok
129               
130                Shell> OS_SemTest 23      // give
131                Shell> OS_SemTest 23      // give again. still the count should be one.
132                Shell> OS_SemTest 22 0    // take.. ok
133                Shell> OS_SemTest 22 0    // take.. fail.
134        */
135
136       
137        }
138        DHL_OS_Printf("====> after test: csem 0x%x, msem 0x%x, bsem 0x%x\n\n", lcsem, lmsem, lbsem);
139
140
141}
142
143typedef struct {
144        int type;
145        int value;
146} tSemTaskArg;
147
148static void sem_task(UINT32 arg)
149{
150        while (sem_task_state != 0)
151                DHL_OS_Delay(100);
152       
153        sem_test(2, 20000);     // this task should be blocked for 5 sec
154        sem_test(3, 0);
155
156        while (sem_task_state != 1)
157                DHL_OS_Delay(100);
158
159        sem_test(12, 20000);    // mutex block test, this task should be blocked for 5 sec
160        sem_test(13, 0);
161
162        while (sem_task_state != 2)
163                DHL_OS_Delay(100);
164
165        sem_test(12, 20000);    // recursive mutex test, this task should be resumed after 2nd unlock
166        sem_test(13, 0);
167}
168
169static void sem_task2(UINT32 arg)
170{
171
172        /*
173                ¼¼¸¶Æ÷¾î Å×½ºÆ® ½ÃÀÛ
174        */
175        DHL_OS_Printf("\n**** Semaphore test is started..\n\n");
176
177
178
179        /*
180                1. timeout Å×½ºÆ® & block Å×½ºÆ®
181        */
182        sem_test(1, 0); // create semaphore
183        sem_test(2, 1000);      // check if timeout occur
184        sem_task_state = 0;     
185        DHL_OS_Delay(5000); 
186        sem_test(3, 0); // sem give and released
187
188        DHL_OS_Delay(1000);
189        sem_test(0, 0);
190
191
192        /*
193                2. ¹ÂÅØ½º Å×½ºÆ®
194        */
195        sem_test(11, 0);        // mutex create
196        sem_test(12, 0);        // mutex lock
197        sem_test(13, 0);        // mutex unlock. ok.
198
199        sem_test(12, 0);        // mutex lock
200        sem_task_state = 1;
201        DHL_OS_Delay(5000);
202        sem_test(13, 0);        // mutex unlock here. ok.
203
204        DHL_OS_Delay(1000);
205       
206
207        /*
208                3. ¹ÂÅØ½º Àç±Í Á¢±Ù Å×½ºÆ®             
209        */
210        sem_test(12, 0);        // mutex lock
211        sem_test(12, 0);        // mutex 2nd lock
212        sem_task_state = 2;
213        DHL_OS_Delay(5000);
214        sem_test(13, 0);
215        sem_test(13, 0);        // mutex 2nd unlock here. ok.
216
217        DHL_OS_Delay(1000);
218        sem_test(10, 0);
219       
220
221        /*
222                4. ¹ÙÀ̳ʸ® ¼¼¸¶Æ÷¾î Å×½ºÆ®     
223        */
224        sem_test(21, 0);
225        sem_test(22, 200);      // take should be failed with timeout
226        sem_test(23, 0);        // give
227        sem_test(22, 0);        // take ok
228
229        sem_test(23, 0);        // give
230        sem_test(23, 0);        // give again. still the count should be one
231        sem_test(22, 0);        // take ok
232        sem_test(22, 0);        // take should be failed
233       
234        DHL_OS_Delay(1000);
235        sem_test(20, 0);
236       
237        /*
238                ¼¼¸¶Æ÷¾î Å×½ºÆ® Á¾·á
239        */
240        DHL_OS_Printf("**** Semaphore test is completed\n\n");
241
242}
243
244/*
245       
246*/
247void OS_SemTest()
248{
249        sem_task_state = -1;
250        DHL_OS_CreateTask(sem_task,"", 50, 8192, 0);   
251
252//yhkim, NEO HAL ÀÇ °æ¿ì mutex take ½Ã task ÆÇº°À» ID °¡ ¾Æ´Ñ priority ·Î Çϴµ¥
253//ÁöÁ¤µÈ task °¡ ¾Æ´Ñ main task ¿¡¼­ take ¸¦ ÇÒ °æ¿ì take ÀÇ default owner priority ¿Í
254//main task ÀÇ priority °¡ °°À» °æ¿ì°¡ ¹ß»ýÇÏ¿© take ¸¦ ÇÏÁö ¸øÇÏ´Â °æ¿ì ¹ß»ý.
255//Test ½Ã main task ¿¡¼­ ÇÏÁö ¸»°í º°µµÀÇ task ¸¦ »ý¼ºÇÏ¿© Test.
256#if 1
257        DHL_OS_CreateTask(sem_task2,"", 51, 8192, 0);
258#else
259        /*
260                ¼¼¸¶Æ÷¾î Å×½ºÆ® ½ÃÀÛ
261        */
262        DHL_OS_Printf("\n**** Semaphore test is started..\n\n");
263
264
265
266        /*
267                1. timeout Å×½ºÆ® & block Å×½ºÆ®
268        */
269        sem_test(1, 0); // create semaphore
270        sem_test(2, 1000);      // check if timeout occur
271        sem_task_state = 0;     
272        DHL_OS_Delay(5000); 
273        sem_test(3, 0); // sem give and released
274
275        DHL_OS_Delay(1000);
276        sem_test(0, 0);
277
278
279        /*
280                2. ¹ÂÅØ½º Å×½ºÆ®
281        */
282        sem_test(11, 0);        // mutex create
283        sem_test(12, 0);        // mutex lock
284        sem_test(13, 0);        // mutex unlock. ok.
285
286        sem_test(12, 0);        // mutex lock
287        sem_task_state = 1;
288        DHL_OS_Delay(5000);
289        sem_test(13, 0);        // mutex unlock here. ok.
290
291        DHL_OS_Delay(1000);
292       
293
294        /*
295                3. ¹ÂÅØ½º Àç±Í Á¢±Ù Å×½ºÆ®             
296        */
297        sem_test(12, 0);        // mutex lock
298        sem_test(12, 0);        // mutex 2nd lock
299        sem_task_state = 2;
300        DHL_OS_Delay(5000);
301        sem_test(13, 0);
302        sem_test(13, 0);        // mutex 2nd unlock here. ok.
303
304        DHL_OS_Delay(1000);
305        sem_test(10, 0);
306       
307
308        /*
309                4. ¹ÙÀ̳ʸ® ¼¼¸¶Æ÷¾î Å×½ºÆ®     
310        */
311        sem_test(21, 0);
312        sem_test(22, 200);      // take should be failed with timeout
313        sem_test(23, 0);        // give
314        sem_test(22, 0);        // take ok
315
316        sem_test(23, 0);        // give
317        sem_test(23, 0);        // give again. still the count should be one
318        sem_test(22, 0);        // take ok
319        sem_test(22, 0);        // take should be failed
320       
321        DHL_OS_Delay(1000);
322        sem_test(20, 0);
323       
324        /*
325                ¼¼¸¶Æ÷¾î Å×½ºÆ® Á¾·á
326        */
327        DHL_OS_Printf("**** Semaphore test is completed\n\n");
328#endif 
329}
330
331
332#if COMMENT
333____MsgQTest____(){}
334#endif
335
336
337static DHL_OS_MSGQ_ID s_testmsgq;
338static int msgq_task_state;
339
340void msgq_test(int type, int value, int value2)
341{
342        int err, i;
343        UINT8 msg[20]; // length of message
344
345        DHL_OS_Printf("====> before test: msgq 0x%x\n", s_testmsgq);
346        if (type == 0) {
347                DHL_OS_Printf("MsgQ delete test\n");
348                if (s_testmsgq) {
349                        DHL_OS_DeleteMessageQueue(s_testmsgq);
350                        s_testmsgq = 0;
351                }
352        }
353        if (type == 1) {
354                DHL_OS_Printf("MsgQ create test. %d x msg size %d bytes\n", 10, sizeof(msg));
355                if (s_testmsgq)
356                        DHL_OS_Printf("already created. recreate..\n");
357                s_testmsgq = DHL_OS_CreateMessageQueue("Test", 0, 10, sizeof(msg));
358                DHL_OS_Printf("MsgQ created: 0x%x\n", s_testmsgq);
359        }
360        else if (type == 2) {
361                DHL_OS_Printf("MsgQ send test. send 1 msg (full size), at %d\n", DHL_OS_GetMsCount());
362                for (i=0; i<sizeof(msg); i++)
363                        msg[i] = i;
364                err = DHL_OS_SendMessage(s_testmsgq, msg, sizeof(msg));
365                DHL_OS_Printf("MsgQ send result 0x%x\n", err);
366        }
367        else if (type == 3) {
368                DHL_OS_Printf("MsgQ send test. send 1 msg (small size %d)\n", 5);
369                msg[0] = msg[1] = msg[2] = msg[3] = msg[4] = 0x33;
370                err = DHL_OS_SendMessage(s_testmsgq, msg, sizeof(msg));
371                DHL_OS_Printf("MsgQ send result 0x%x, at %d\n", err, DHL_OS_GetMsCount());
372        }
373        else if (type == 4) {
374                value2 = !value2 ? sizeof(msg) : value2;  // receive buffer size. if 0, enough buffer is used.
375                DHL_OS_Printf("MsgQ recv with timeout %u tick, rx buf size %d\n", value, value2);
376                memset(msg, 0, sizeof(msg));
377
378                err = DHL_OS_ReceiveMessage(s_testmsgq, msg, value);
379                if (err != DHL_OK)
380                        DHL_OS_Printf("!! msg rx err %d, at %d\n", err, DHL_OS_GetMsCount());
381                else
382                {
383                        DHL_OS_Printf("msg received at %d. : %d %d %d %d %d %d %d %d %d %d\n", 
384                                DHL_OS_GetMsCount(), msg[0], msg[1], msg[2], msg[3], msg[4], 
385                                msg[5], msg[6], msg[7], msg[8], msg[9]);
386                        DHL_OS_Printf("                %d %d %d %d %d %d %d %d %d %d\n", 
387                                msg[10], msg[11], msg[12], msg[13], msg[14], 
388                                msg[15], msg[16], msg[17], msg[18], msg[19]); 
389                }
390        }
391        /*
392                OS_MsgTest 0   // delete
393                OS_MsgTest 1   // create
394                OS_MsgTest 4 0 // rx no wait. this fails with timeout.
395
396                OS_MsgTest 2   // send full msg
397                OS_MsgTest 4 0 // rx no wait
398
399                OS_MsgTest 3   // send partial msg
400                OS_MsgTest 4 0 // ok.
401                OS_MsgTest 4 0 // error
402
403                OS_MsgTest 2 & // send from other task.
404                OS_MsgTest 4 0 // ok.
405                OS_MsgTest 4 0 // error
406
407                OS_MsgTest 4 200     // error after some time.
408                OS_MsgTest 4 2000 &  // pending..
409                OS_MsgTest 2         // ok. wake up             
410               
411        */
412        DHL_OS_Printf("====> after test: msgq 0x%x\n\n", s_testmsgq);
413}
414
415static void msgq_task(UINT32 arg)
416{
417        while (msgq_task_state != 0)
418                DHL_OS_Delay(100);
419       
420        msgq_test(2, 0, 0);     // send full msg
421
422        while (msgq_task_state != 1)
423                DHL_OS_Delay(100);
424
425        msgq_test(4, 2000, 0); 
426}
427
428void OS_MsgQTest(void)
429{
430        msgq_task_state = -1;   
431
432        DHL_OS_CreateTask(msgq_task, "", 50, 8192, 0);
433
434        /*
435                ¸Þ½ÃÁö Å¥ Å×½ºÆ® ½ÃÀÛ
436        */
437        DHL_OS_Printf("\n**** MsgQ test is started..\n\n");
438       
439        /*
440                1. delete, create, timeout Å×½ºÆ®
441        */
442        msgq_test(0, 0, 0);     // delete
443        msgq_test(1, 0, 0);     // create
444        msgq_test(4, 0, 0);     // rx no wait. this fails with timeout.
445        DHL_OS_Delay(1000);
446       
447        /*
448                2. send, receive Å×½ºÆ®
449        */
450        msgq_test(2, 0, 0);     // send full msg
451        msgq_test(4, 0, 0);     // rx no wait
452        DHL_OS_Delay(1000);
453
454        /*
455                3. send, receive Å×½ºÆ® 2
456        */
457        msgq_test(3, 0, 0);     // send partial msg
458        msgq_test(4, 0, 0);     // ok.
459        msgq_test(4, 0, 0);     // error
460        DHL_OS_Delay(1000);
461       
462        /*
463                4. ¼­·Î ´Ù¸¥ task¿¡¼­ send, receive Å×½ºÆ®
464        */
465        msgq_task_state = 0;    // send from other task.       
466        DHL_OS_Delay(100);     
467        msgq_test(4, 0, 0);     // ok.
468        msgq_test(4, 0, 0);     // error
469        DHL_OS_Delay(1000);
470       
471        /*
472                5. ¼­·Î ´Ù¸¥ task¿¡¼­ send, receive Å×½ºÆ® 2
473        */
474        msgq_test(4, 1000, 0);  // error after some time.
475        msgq_task_state = 1;    // pending..
476        DHL_OS_Delay(1000);
477        msgq_test(2, 0, 0);     // ok. wake up 
478
479        DHL_OS_Delay(1000);
480        msgq_test(0, 0, 0); // delete
481       
482        /*
483                ¸Þ½ÃÁö Å¥ Å×½ºÆ® Á¾·á
484        */
485        DHL_OS_Printf("**** MsgQ test is completed\n\n");
486}
487
488 
489#if COMMENT
490____MessangerTest____(){}
491#endif
492
493#if 1
494DHL_OS_MSGQ_ID s_msgq;
495
496void OS_MsgListenerTask(void)
497{
498        char buf[200];
499        int r;
500       
501        if (!s_msgq) {
502                s_msgq = DHL_OS_CreateMessageQueue("", 0, 2, 200);
503                DHL_OS_Printf("==> create msgq 0x%x..\n", s_msgq);
504        }
505       
506        DHL_OS_Printf("==> start to listen..\n");
507        while (1)
508        {
509                r = DHL_OS_ReceiveMessage(s_msgq, buf, DHL_TIMEOUT_FOREVER);
510                if (r) {
511                        DHL_OS_Printf("!! msg rx err %d\n", r);
512                        break;
513                }
514
515                DHL_OS_Printf("==> msg len(%d), '%s'\n", strlen(buf), buf);
516                if (strcmp("stop", buf) == 0)
517                        break;
518        }
519        DHL_OS_Printf("==> msg listener end.\n");
520
521}
522
523void OS_MsgSenderTest(const char *msg)
524{
525        int r;
526        if (!s_msgq) {
527                DHL_OS_Printf("!! msg listener not ready..\n");
528                return;
529        }
530        if (!msg || !msg[0]) msg = "<null>";
531        r = DHL_OS_SendMessage(s_msgq, (void *)msg, sizeof(msg));
532        if (r)
533                DHL_OS_Printf("==> msg send err %d\n", r);
534}
535
536/*
537        Shell> OS_MsgSenderTest   // err if not created.
538        Shell> OS_MsgListenerTask &
539       
540        Shell> OS_MsgSenderTest "hello world"
541        Shell> OS_MsgSenderTest "this is test msg"
542
543*/
544#endif
545
546
547#include "DHL_DBG.h"
548
549static DHL_SymbolTable OSSemTestSymbols[] =
550{
551        //---- functions
552       
553        DHL_FNC_SYM_ENTRY(sem_test),
554        DHL_FNC_SYM_ENTRY(OS_SemTest),
555        DHL_FNC_SYM_ENTRY(msgq_test),
556        DHL_FNC_SYM_ENTRY(OS_MsgQTest),
557        DHL_FNC_SYM_ENTRY(OS_MsgListenerTask),
558        DHL_FNC_SYM_ENTRY(OS_MsgSenderTest)
559};
560
561void OSSemTestInit()
562{
563        DHL_DBG_RegisterSymbols(OSSemTestSymbols, DHL_NUMSYMBOLS(OSSemTestSymbols));
564
565
566}
567
Note: See TracBrowser for help on using the repository browser.