close Warning: Can't use blame annotator:
No changeset 2 in the repository

source: svn/newcon3bcm2_21bu/dst/dhl/src/test/OSSemTest.c

Last change on this file was 76, checked in by megakiss, 10 years ago

1W 대기전력을 만족시키기 위하여 POWEROFF시 튜너를 Standby 상태로 함

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