📄 drv_api.c
字号:
CYG_REPORT_RETURN(); } //--------------------------------------------------------------------------// Initialized a condition variable.externC void cyg_drv_cond_init( cyg_drv_cond_t *cond, cyg_drv_mutex_t *mutex ){ CYG_REPORT_FUNCTION(); cond->wait = 0; cond->mutex = mutex; CYG_REPORT_RETURN(); } //--------------------------------------------------------------------------// Destroy a condition variable.externC void cyg_drv_cond_destroy( cyg_drv_cond_t *cond ){ CYG_REPORT_FUNCTION(); cond->wait = -1; cond->mutex = NULL; CYG_REPORT_RETURN(); } // -------------------------------------------------------------------------// Wait for a condition variable to be signalled. We simply busy wait// polling the condition variable's wait member until a DSR sets it to// 0. Note that the semantics of condition variables means that the// wakeup only happens if there is a thread actually waiting on the CV// when the signal is sent.externC void cyg_drv_cond_wait( cyg_drv_cond_t *cond ){ CYG_REPORT_FUNCTION(); CYG_ASSERT( cond->mutex != NULL, "Uninitialized condition variable"); CYG_ASSERT( cond->mutex->lock, "Mutex not locked"); cyg_drv_dsr_lock(); cond->wait = 1; while( cond->wait == 1 ) { // While looping we call call_dsrs() to service any DSRs that // get posted. One of these will make the call to cond_signal // to break us out of this loop. If we do not have the DSR // lock claimed, then a race condition could occur and keep us // stuck here forever. call_dsrs(); } cyg_drv_dsr_unlock(); CYG_REPORT_RETURN(); }//--------------------------------------------------------------------------// Signal a condition variable. This sets the wait member to zero, which// has no effect when there is no waiter, but will wake up any waiting// thread.externC void cyg_drv_cond_signal( cyg_drv_cond_t *cond ){ CYG_REPORT_FUNCTION(); cond->wait = 0; CYG_REPORT_RETURN(); } //--------------------------------------------------------------------------// Broadcast to condition variable. This is exactly the same a signal since// there can only be one waiter.externC void cyg_drv_cond_broadcast( cyg_drv_cond_t *cond ){ CYG_REPORT_FUNCTION(); cond->wait = 0; CYG_REPORT_RETURN(); } //--------------------------------------------------------------------------// Create an interrupt object.externC void cyg_drv_interrupt_create( cyg_vector_t vector, cyg_priority_t priority, cyg_addrword_t data, cyg_ISR_t *isr, cyg_DSR_t *dsr, cyg_handle_t *handle, cyg_interrupt *intr ){ CYG_REPORT_FUNCTION(); intr->vector = vector; intr->priority = priority; intr->isr = isr; intr->dsr = dsr; intr->data = data; intr->next_dsr = NULL; intr->dsr_count = 0;#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN intr->next = NULL; #endif *handle = (cyg_handle_t)intr; CYG_REPORT_RETURN();}//--------------------------------------------------------------------------// Delete an interrupt object. This merely ensures that it is detached from// the vector.externC void cyg_drv_interrupt_delete( cyg_handle_t interrupt ){ CYG_REPORT_FUNCTION(); cyg_drv_interrupt_detach( interrupt ); CYG_REPORT_RETURN(); }//--------------------------------------------------------------------------// externC void cyg_drv_interrupt_attach( cyg_handle_t interrupt ){ cyg_interrupt *intr = (cyg_interrupt *)interrupt; CYG_REPORT_FUNCTION(); CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); HAL_INTERRUPT_SET_LEVEL( intr->vector, intr->priority ); #ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN CYG_ASSERT( intr->next == NULL , "cyg_interrupt already on a list"); cyg_uint32 index; HAL_TRANSLATE_VECTOR( intr->vector, index ); if( chain_list[index] == NULL ) { // First Interrupt on this chain, just assign it and register // the chain_isr with the HAL. chain_list[index] = intr; HAL_INTERRUPT_ATTACH( intr->vector, chain_isr, &chain_list[index], NULL ); } else { // There are already interrupts chained, add this one into the // chain in priority order. Cyg_Interrupt **p = &chain_list[index]; while( *p != NULL ) { cyg_interrupt *n = *p; if( n->priority < intr->priority ) break; p = &n->next; } next = *p; *p = intr; } #else HAL_INTERRUPT_ATTACH( intr->vector, intr->isr, intr->data, intr );#endif CYG_REPORT_RETURN(); } //--------------------------------------------------------------------------// Detach an interrupt from its vector.externC void cyg_drv_interrupt_detach( cyg_handle_t interrupt ){ cyg_interrupt *intr = (cyg_interrupt *)interrupt; CYG_REPORT_FUNCTION(); CYG_ASSERT( intr->vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( intr->vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector");#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_CHAIN // Remove the interrupt object from the vector chain. cyg_uint32 index; HAL_TRANSLATE_VECTOR( vector, index ); cyg_interrupt **p = &chain_list[index]; while( *p != NULL ) { cyg_interrupt *n = *p; if( n == intr ) { *p = intr->next; break; } p = &n->next; } // If this was the last one, detach the vector. if( chain_list[index] == NULL ) HAL_INTERRUPT_DETACH( intr->vector, chain_isr ); #else HAL_INTERRUPT_DETACH( intr->vector, intr->isr );#endif CYG_REPORT_RETURN(); } //--------------------------------------------------------------------------// Mask delivery of an interrupt at the interrupt controller.externC void cyg_drv_interrupt_mask( cyg_vector_t vector ){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG1("vector=%d", vector); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); HAL_INTERRUPT_MASK( vector ); CYG_REPORT_RETURN();}//--------------------------------------------------------------------------// Unmask delivery of an interrupt at the interrupt controller.externC void cyg_drv_interrupt_unmask( cyg_vector_t vector ){ CYG_REPORT_FUNCTION(); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); HAL_INTERRUPT_UNMASK( vector ); CYG_REPORT_RETURN();}//--------------------------------------------------------------------------// Acknowledge an interrupt at the controller to allow another interrupt// to be delivered.externC void cyg_drv_interrupt_acknowledge( cyg_vector_t vector ){// CYG_REPORT_FUNCTION(); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); HAL_INTERRUPT_ACKNOWLEDGE( vector );// CYG_REPORT_RETURN(); }//--------------------------------------------------------------------------// Configure interrupt detection parameters.externC void cyg_drv_interrupt_configure( cyg_vector_t vector, cyg_bool_t level, cyg_bool_t up ){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG3("vector = %d, level = %d, up = %d", vector, level, up); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); HAL_INTERRUPT_CONFIGURE( vector, level, up ); CYG_REPORT_RETURN();}//--------------------------------------------------------------------------// Configure interrupt priority level.externC void cyg_drv_interrupt_level( cyg_vector_t vector, cyg_priority_t level ){ CYG_REPORT_FUNCTION(); CYG_REPORT_FUNCARG2("vector = %d, level = %d", vector, level); CYG_ASSERT( vector >= CYGNUM_HAL_ISR_MIN, "Invalid vector"); CYG_ASSERT( vector <= CYGNUM_HAL_ISR_MAX, "Invalid vector"); HAL_INTERRUPT_SET_LEVEL( vector, level ); CYG_REPORT_RETURN();}// -------------------------------------------------------------------------// Exception delivery function called from the HAL as a result of a// hardware exception being raised.externC void cyg_hal_deliver_exception( CYG_WORD code, CYG_ADDRWORD data ){ CYG_FAIL(" !!! Exception !!! ");}#endif//--------------------------------------------------------------------------// EOF drv_api.c
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -