51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
								 | 
							
								#include "cmsis_os2.h"                          // CMSIS RTOS header file
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								/*----------------------------------------------------------------------------
							 | 
						||
| 
								 | 
							
								 *      Semaphore creation & usage
							 | 
						||
| 
								 | 
							
								 *---------------------------------------------------------------------------*/
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								osSemaphoreId_t sid_Semaphore;                  // semaphore id
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								osThreadId_t tid_Thread_Semaphore;              // thread id
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								void Thread_Semaphore (void *argument);         // thread function
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								int Init_Semaphore (void) {
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  sid_Semaphore = osSemaphoreNew(2U, 2U, NULL);
							 | 
						||
| 
								 | 
							
								  if (sid_Semaphore == NULL) {
							 | 
						||
| 
								 | 
							
								    ; // Semaphore object not created, handle failure
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  tid_Thread_Semaphore = osThreadNew(Thread_Semaphore, NULL, NULL);
							 | 
						||
| 
								 | 
							
								  if (tid_Thread_Semaphore == NULL) {
							 | 
						||
| 
								 | 
							
								    return(-1);
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  return(0);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								void Thread_Semaphore (void *argument) {
							 | 
						||
| 
								 | 
							
								  int32_t val;
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								  while (1) {
							 | 
						||
| 
								 | 
							
								    ; // Insert thread code here...
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    val = osSemaphoreAcquire(sid_Semaphore, 10U);       // wait 10 mSec
							 | 
						||
| 
								 | 
							
								    switch (val) {
							 | 
						||
| 
								 | 
							
								      case osOK:
							 | 
						||
| 
								 | 
							
								        ; // Use protected code here...
							 | 
						||
| 
								 | 
							
								        osSemaphoreRelease(sid_Semaphore);              // return a token back to a semaphore
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      case osErrorResource:
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      case osErrorParameter:
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								      default:
							 | 
						||
| 
								 | 
							
								        break;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								 
							 | 
						||
| 
								 | 
							
								    osThreadYield();                                    // suspend thread
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								}
							 |