void thread_3_and_4_entry(ULONG thread_input) { UINT status; /* This function is executed from thread 3 and thread 4. As the loop below shows, these function compete for ownership of semaphore_0. */ while(1) { /* Increment the thread counter. */ if (thread_input == 3) thread_3_counter++; else thread_4_counter++; /* Get the semaphore with suspension. */ status = tx_semaphore_get(&semaphore_0, TX_WAIT_FOREVER); /* Check status. */ if (status != TX_SUCCESS) break; /* Sleep for 2 ticks to hold the semaphore. */ tx_thread_sleep(2); /* Release the semaphore. */ status = tx_semaphore_put(&semaphore_0); /* Check status. */ if (status != TX_SUCCESS) break; } }
/** * Sets a semaphore * * If any threads are waiting on the semaphore, the first thread is resumed * Else increment semaphore. * * Can be called from interrupt context, so must be able to handle resuming other * threads from interrupt context. * * @param semaphore : Pointer to variable which will receive handle of created semaphore * @param called_from_ISR : Value of WICED_TRUE indicates calling from interrupt context * Value of WICED_FALSE indicates calling from normal thread context * * @return wwd_result_t : WWD_SUCCESS if semaphore was successfully set * : WICED_ERROR if an error occurred * */ wwd_result_t host_rtos_set_semaphore( host_semaphore_type_t* semaphore, wiced_bool_t called_from_ISR ) { UNUSED_PARAMETER( called_from_ISR ); return ( tx_semaphore_put( semaphore ) == TX_SUCCESS )? WWD_SUCCESS : WWD_SEMAPHORE_ERROR; }