
#include <cmsis_os.h>                                           // CMSIS RTOS header file

/*----------------------------------------------------------------------------
 *      Semaphore creation & usage
 *---------------------------------------------------------------------------*/
 
void Thread_Semaphore (void const *argument);                   // thread function
osThreadId tid_Thread_Semaphore;                                // thread id
osThreadDef (Thread_Semaphore, osPriorityNormal, 1, 0);         // thread object

osSemaphoreId sid_Thread_Semaphore;                             // semaphore id
osSemaphoreDef (SampleSemaphore);                               // semaphore object


int Init_Semaphore (void) {

  sid_Thread_Semaphore = osSemaphoreCreate(osSemaphore(SampleSemaphore), 1);
  if (!sid_Thread_Semaphore)  {
    ; // Semaphore object not created, handle failure
  }
  
  tid_Thread_Semaphore  = osThreadCreate (osThread(Thread_Semaphore), NULL);
  if(!tid_Thread_Semaphore) return(-1);
  
  return(0);
}

void Thread_Semaphore(void const *argument) {
  int32_t val;

  while(1) {
    ; // Insert thread code here...

    val = osSemaphoreWait (sid_Thread_Semaphore, 10);           // wait 10 mSec
    switch (val) {
      case osOK:
        ; // Use protected code here...
        osSemaphoreRelease (sid_Thread_Semaphore);              // Return a token back to a semaphore
        break;
      case osErrorResource:
        break;
      case osErrorParameter:
        break;
      default:
        break;
    }

    osThreadYield();        // suspend thread
  }
}
