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; } }
/** * Gets a semaphore * * If value of semaphore is larger than zero, then the semaphore is decremented and function returns * Else If value of semaphore is zero, then current thread is suspended until semaphore is set. * Value of semaphore should never be below zero * * Must not be called from interrupt context, since it could block, and since an interrupt is not a * normal thread, so could cause RTOS problems if it tries to suspend it. * * @param semaphore : Pointer to variable which will receive handle of created semaphore * @param timeout_ms : Maximum period to block for. Can be passed NEVER_TIMEOUT to request no timeout * @param will_set_in_isr : True if the semaphore will be set in an ISR. Currently only used for NoOS/NoNS * */ wwd_result_t host_rtos_get_semaphore( host_semaphore_type_t* semaphore, uint32_t timeout_ms, wiced_bool_t will_set_in_isr ) { UINT result; UNUSED_PARAMETER( will_set_in_isr ); result = tx_semaphore_get( semaphore, ( timeout_ms == NEVER_TIMEOUT ) ? TX_WAIT_FOREVER : (ULONG) ( timeout_ms * SYSTICK_FREQUENCY / 1000 ) ); if ( result == TX_SUCCESS ) { return WWD_SUCCESS; } else if ( result == TX_NO_INSTANCE ) { return WWD_TIMEOUT; } else if ( result == TX_WAIT_ABORTED ) { return WWD_WAIT_ABORTED; } else { wiced_assert( "semaphore error ", 0 ); return WWD_SEMAPHORE_ERROR; } }