vxworks 신호량의 의문점

19799 단어
오늘 신호량의 프로그램을 실행할 때 결과가 매우 이상하다고 느꼈다. 프로그램은 다음과 같다.
/* include files */
 
 #include "vxWorks.h"
 #include "wdLib.h"
 #include "stdio.h"
 #include "semLib.h"
 #include "taskLib.h"
 #include "usrLib.h"
 #include "sysLib.h"
 
 /* defines */
 
 #define TASK_PRIORITY 101
 #define TASK_STACK_SIZE 5000
 #define TIME_BETWEEN_INTERRUPTS 1 /* 1 tick */
 #define TASK_WORK_TIME 2 /* 2 ticks */
 #define NUM_OF_GIVES 30 
 
 /* globals */
 
 /* counting or binary semaphore ID */
 LOCAL SEM_ID semId = NULL; 
 
 /* watchdog ID */
 LOCAL WDOG_ID wdId = NULL; 
 
 /* tid of syncTask */
 LOCAL int syncTaskTid = 0; 
 
 /* Number of times semGive is called */
 LOCAL int numToGive = NUM_OF_GIVES;
 
 /* forward declaratiuon */
 void syncISR(int);/* ISR to unblock syncTask */
 void cleanUp (); /* cleanup routine */
 void syncTask (); /* task that needs to be synchronized
 * with external events */ 
 
 /******************************************
 * countingSemDemo - demonstrates
 task synchronization using counting
 * semaphores. User can also select to
 use binary semaphore instead of
 * counting semaphore in this demonstration,
 for comparision between the two
 * semaphores.
 *
 * RETURNS: OK or ERROR
 *
 */
 
 STATUS countingSemDemo (
	 char semType /* counting semaphore type
	 'c' or binary semaphore
 	* type 'b'
 	*/)
 {
 switch (semType)
 {
 	case 'c':
 	case 'C':
 		if ((semId = semCCreate(SEM_Q_PRIORITY,0)) == NULL)
 		{
 			perror ("semCCreate");
 			return (ERROR);
 		}
 		break;
 
	 case 'b':
	 case 'B':
		 if ((semId = semBCreate(SEM_Q_PRIORITY,SEM_EMPTY)) == NULL)
 		 {
 			perror ("semBCreate");
 			return (ERROR);
 		 }
 		 break;
 
	 default:
		 printf ("Unknown semType-- must be 'c' or 'b'
"); return (ERROR); } if ((wdId = wdCreate()) == NULL) { perror ("wdCreate"); cleanUp (); return (ERROR); } if ((syncTaskTid = taskSpawn ("tsyncTask", TASK_PRIORITY,0,TASK_STACK_SIZE,(FUNCPTR) syncTask,0,0,0,0,0,0,0,0,0,0)) == ERROR) { perror ("taskSpawn"); cleanUp(); return (ERROR); } /* watchdog simulates hardware interrupts */ if (wdStart (wdId, TIME_BETWEEN_INTERRUPTS,(FUNCPTR) syncISR, numToGive)== ERROR) { perror ("wdStart"); cleanUp (); return (ERROR); } /* arbitrary delay to allow program to complete before clean up */ taskDelay (sysClkRateGet() +((TASK_WORK_TIME + 2) * numToGive)); cleanUp(); return (OK); } /************************************************* * syncTask - synchronizes with interrupts using * counting or binarysemaphores. */ void syncTask (void) { int eventCount = 0; FOREVER { if (semTake (semId, WAIT_FOREVER) == ERROR) { perror ("syncTask semTake"); return; } /* Do "work" */ taskDelay (TASK_WORK_TIME); semShow (semId,1); eventCount++; printf ("semaphore taken %d times
", eventCount); } } /************************************************ * syncISR - simulates a hardware device which generates interrupts very * quickly and synchronizes with syncTask using semaphores. */ void syncISR(int times) { semGive (semId); times--; if (times > 0) wdStart (wdId, TIME_BETWEEN_INTERRUPTS,(FUNCPTR) syncISR, times); } /******************************************** * cleanUP - deletes the syncTask, deletes the * semaphore and the watchdog timer previously created * by countingSemDemo.*/ void cleanUp () { if (syncTaskTid) taskDelete (syncTaskTid); if (semId) semDelete (semId); if (wdId) wdDelete (wdId); }

실행 결과:
->sp countingSemDemo,'c'

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 2         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 1 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 3         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 2 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 4         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 3 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 5         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 4 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 6         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 5 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 7         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 6 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 8         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 7 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 9         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 8 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 10        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 9 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 11        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 10 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 12        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 11 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 13        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 12 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 14        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 13 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 15        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 14 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 15        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 15 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 14        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 16 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 13        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 17 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 12        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 18 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 11        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 19 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 10        
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 20 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 9         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 21 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 8         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 22 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 7         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 23 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 6         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 24 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 5         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 25 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 4         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 26 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 3         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 27 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 2         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 28 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 1         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 29 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : COUNTING  
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
Count               : 0         
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 30 times
->sp countingCountDemo ‘b’
Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 1 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 2 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 3 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 4 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 5 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 6 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 7 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 8 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 9 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 10 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 11 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 12 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 13 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 14 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : FULL      
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 15 times

Semaphore Id        : 0x23ce9d0   
Semaphore Type      : BINARY    
Task Queuing        : PRIORITY  
Pended Tasks        : 0         
State               : EMPTY     
Options             : 0x1	SEM_Q_PRIORITY

VxWorks Events
--------------
Registered Task     : NONE
Event(s) to Send    : N/A
Options             : N/A

semaphore taken 16 times

이 문제는 잠시 여기에 두었다가 나중에 천천히 연구해 보자. 만약 어떤 고수가 조언을 해 줄 수 있다면 대단히 고맙지 않을 것이다.

좋은 웹페이지 즐겨찾기