📄 kapi.cxx
字号:
Cyg_Scheduler::unlock();
return result;
}
/*---------------------------------------------------------------------------*/
/* Per-thread data */
#ifdef CYGVAR_KERNEL_THREADS_DATA
externC cyg_ucount32 cyg_thread_new_data_index() __THROW
{
Cyg_Thread::cyg_data_index index = Cyg_Thread::new_data_index();
CYG_ASSERT(index >= 0, "failed to allocate data index" );
return index;
}
externC void cyg_thread_free_data_index(cyg_ucount32 index) __THROW
{
Cyg_Thread::free_data_index(index);
}
externC CYG_ADDRWORD cyg_thread_get_data(cyg_ucount32 index) __THROW
{
return Cyg_Thread::get_data(index);
}
externC CYG_ADDRWORD *cyg_thread_get_data_ptr(cyg_ucount32 index) __THROW
{
return Cyg_Thread::get_data_ptr(index);
}
externC void cyg_thread_set_data(cyg_ucount32 index, CYG_ADDRWORD
data) __THROW
{
Cyg_Thread::self()->set_data(index, data);
}
#endif
/*---------------------------------------------------------------------------*/
/* Thread destructors */
#ifdef CYGPKG_KERNEL_THREADS_DESTRUCTORS
__externC cyg_bool_t
cyg_thread_add_destructor( cyg_thread_destructor_fn fn,
cyg_addrword_t data ) __THROW
{
return Cyg_Thread::self()->add_destructor( fn, data );
}
__externC cyg_bool_t
cyg_thread_rem_destructor( cyg_thread_destructor_fn fn,
cyg_addrword_t data ) __THROW
{
return Cyg_Thread::self()->rem_destructor( fn, data );
}
#endif
/*---------------------------------------------------------------------------*/
/* Exception handling. */
#ifdef CYGPKG_KERNEL_EXCEPTIONS
externC void cyg_exception_set_handler(
cyg_code_t exception_number,
cyg_exception_handler_t *new_handler,
cyg_addrword_t new_data,
cyg_exception_handler_t **old_handler,
cyg_addrword_t *old_data
) __THROW
{
Cyg_Thread::register_exception(
exception_number,
(cyg_exception_handler *)new_handler,
(CYG_ADDRWORD)new_data,
(cyg_exception_handler **)old_handler,
(CYG_ADDRWORD *)old_data
);
}
/* Clear exception handler to default */
externC void cyg_exception_clear_handler(
cyg_code_t exception_number
) __THROW
{
Cyg_Thread::deregister_exception( exception_number );
}
/* Invoke exception handler */
externC void cyg_exception_call_handler(
cyg_handle_t thread,
cyg_code_t exception_number,
cyg_addrword_t error_code
) __THROW
{
Cyg_Thread *t = (Cyg_Thread *)thread;
t->deliver_exception( exception_number, error_code );
}
#endif
/*---------------------------------------------------------------------------*/
/* Interrupt handling */
externC void cyg_interrupt_create(
cyg_vector_t vector, /* Vector to attach to */
cyg_priority_t priority, /* Queue priority */
cyg_addrword_t data, /* Data pointer */
cyg_ISR_t *isr, /* Interrupt Service Routine */
cyg_DSR_t *dsr, /* Deferred Service Routine */
cyg_handle_t *handle, /* returned handle */
cyg_interrupt *intr /* put interrupt here */
) __THROW
{
CYG_ASSERT_SIZES( cyg_interrupt, Cyg_Interrupt );
Cyg_Interrupt *t = new((void *)intr) Cyg_Interrupt (
(cyg_vector)vector,
(cyg_priority)priority,
(CYG_ADDRWORD)data,
(cyg_ISR *)isr,
(cyg_DSR *)dsr );
t=t;
CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
*handle = (cyg_handle_t)intr;
}
externC void cyg_interrupt_delete( cyg_handle_t interrupt) __THROW
{
((Cyg_Interrupt *)interrupt)->~Cyg_Interrupt();
}
void cyg_interrupt_attach( cyg_handle_t interrupt ) __THROW
{
((Cyg_Interrupt *)interrupt)->attach();
}
void cyg_interrupt_detach( cyg_handle_t interrupt ) __THROW
{
((Cyg_Interrupt *)interrupt)->detach();
}
/* VSR manipulation */
externC void cyg_interrupt_get_vsr(
cyg_vector_t vector, /* vector to get */
cyg_VSR_t **vsr /* vsr got */
) __THROW
{
Cyg_Interrupt::get_vsr( (cyg_vector)vector, (cyg_VSR **)vsr);
}
externC void cyg_interrupt_set_vsr(
cyg_vector_t vector, /* vector to set */
cyg_VSR_t *vsr /* vsr to set */
) __THROW
{
Cyg_Interrupt::set_vsr( (cyg_vector)vector, (cyg_VSR *)vsr);
}
/* CPU level interrupt mask */
externC void cyg_interrupt_disable() __THROW
{
Cyg_Interrupt::disable_interrupts();
}
externC void cyg_interrupt_enable() __THROW
{
Cyg_Interrupt::enable_interrupts();
}
/* Interrupt controller access */
externC void cyg_interrupt_mask(cyg_vector_t vector) __THROW
{
Cyg_Interrupt::mask_interrupt( (cyg_vector)vector);
}
externC void cyg_interrupt_mask_intunsafe(cyg_vector_t vector) __THROW
{
Cyg_Interrupt::mask_interrupt_intunsafe( (cyg_vector)vector);
}
externC void cyg_interrupt_unmask(cyg_vector_t vector) __THROW
{
Cyg_Interrupt::unmask_interrupt( (cyg_vector)vector);
}
externC void cyg_interrupt_unmask_intunsafe(cyg_vector_t vector) __THROW
{
Cyg_Interrupt::unmask_interrupt_intunsafe( (cyg_vector)vector);
}
externC void cyg_interrupt_acknowledge(cyg_vector_t vector) __THROW
{
Cyg_Interrupt::acknowledge_interrupt( (cyg_vector)vector);
}
externC void cyg_interrupt_configure(
cyg_vector_t vector, /* vector to configure */
cyg_bool_t level, /* level or edge triggered */
cyg_bool_t up /* rising/faling edge, high/low level*/
) __THROW
{
Cyg_Interrupt::configure_interrupt( (cyg_vector)vector, level, up );
}
externC void cyg_interrupt_set_cpu(
cyg_vector_t vector, /* vector to control */
cyg_cpu_t cpu /* CPU to set */
) __THROW
{
#ifdef CYGPKG_KERNEL_SMP_SUPPORT
Cyg_Interrupt::set_cpu( vector, cpu );
#endif
}
externC cyg_cpu_t cyg_interrupt_get_cpu(
cyg_vector_t vector /* vector to control */
) __THROW
{
#ifdef CYGPKG_KERNEL_SMP_SUPPORT
return Cyg_Interrupt::get_cpu( vector );
#else
return CYG_KERNEL_CPU_THIS();
#endif
}
/*---------------------------------------------------------------------------*/
/* Counters, Clocks and Alarms */
externC void cyg_counter_create(
cyg_handle_t *handle, /* returned counter handle */
cyg_counter *counter /* put counter here */
) __THROW
{
CYG_ASSERT_SIZES( cyg_counter, Cyg_Counter );
Cyg_Counter *t = new((void *)counter) Cyg_Counter ();
t=t;
CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
*handle = (cyg_handle_t)counter;
}
externC void cyg_counter_delete(cyg_handle_t counter) __THROW
{
((Cyg_Counter *)counter)->~Cyg_Counter();
}
/* Return current value of counter */
externC cyg_tick_count_t cyg_counter_current_value(cyg_handle_t counter) __THROW
{
return ((Cyg_Counter *)counter)->current_value();
}
/* Set new current value */
externC void cyg_counter_set_value(
cyg_handle_t counter,
cyg_tick_count_t new_value
) __THROW
{
((Cyg_Counter *)counter)->set_value( new_value );
}
/* Advance counter by one tick */
externC void cyg_counter_tick(cyg_handle_t counter) __THROW
{
((Cyg_Counter *)counter)->tick();
}
/* Advance counter by multiple ticks */
externC void cyg_counter_multi_tick(cyg_handle_t counter, cyg_tick_count_t ticks) __THROW
{
((Cyg_Counter *)counter)->tick(ticks);
}
/* Create a clock object */
externC void cyg_clock_create(
cyg_resolution_t resolution, /* Initial resolution */
cyg_handle_t *handle, /* Returned clock handle */
cyg_clock *clock /* put clock here */
) __THROW
{
CYG_ASSERT_SIZES( cyg_clock, Cyg_Clock );
Cyg_Clock::cyg_resolution res;
res.dividend = resolution.dividend;
res.divisor = resolution.divisor;
Cyg_Clock *t = new((void *)clock) Cyg_Clock ( res );
t=t;
CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
*handle = (cyg_handle_t)clock;
}
externC void cyg_clock_delete(cyg_handle_t clock) __THROW
{
((Cyg_Clock *)clock)->~Cyg_Clock();
}
/* convert a clock handle to a counter handle so we can use the */
/* counter API on it. */
externC void cyg_clock_to_counter(
cyg_handle_t clock,
cyg_handle_t *counter
) __THROW
{
CYG_CHECK_DATA_PTR( counter, "Bad counter handle pointer" );
*counter = (cyg_handle_t)(Cyg_Counter *)clock;
}
externC void cyg_clock_set_resolution(
cyg_handle_t clock,
cyg_resolution_t resolution /* New resolution */
) __THROW
{
Cyg_Clock::cyg_resolution res;
res.dividend = resolution.dividend;
res.divisor = resolution.divisor;
((Cyg_Clock *)clock)->set_resolution( res );
}
externC cyg_resolution_t cyg_clock_get_resolution(cyg_handle_t clock) __THROW
{
Cyg_Clock::cyg_resolution res =
((Cyg_Clock *)clock)->get_resolution();
cyg_resolution_t resolution;
resolution.dividend = res.dividend;
resolution.divisor = res.divisor;
return resolution;
}
#ifdef CYGVAR_KERNEL_COUNTERS_CLOCK
externC cyg_handle_t cyg_real_time_clock(void) __THROW
{
return (cyg_handle_t)Cyg_Clock::real_time_clock;
}
externC cyg_tick_count_t cyg_current_time(void) __THROW
{
return Cyg_Clock::real_time_clock->current_value();
}
#endif
externC void cyg_alarm_create(
cyg_handle_t counter, /* Attached to this counter */
cyg_alarm_t *alarmfn, /* Call-back function */
cyg_addrword_t data, /* Call-back data */
cyg_handle_t *handle, /* Returned alarm object */
cyg_alarm *alarm /* put alarm here */
) __THROW
{
CYG_ASSERT_SIZES( cyg_alarm, Cyg_Alarm );
Cyg_Alarm *t = new((void *)alarm) Cyg_Alarm (
(Cyg_Counter *)counter,
(cyg_alarm_fn *)alarmfn,
(CYG_ADDRWORD)data
);
t=t;
CYG_CHECK_DATA_PTR( handle, "Bad handle pointer" );
*handle = (cyg_handle_t)alarm;
}
/* Disable alarm, detach from counter and invalidate handles */
externC void cyg_alarm_delete( cyg_handle_t alarm) __THROW
{
((Cyg_Alarm *)alarm)->~Cyg_Alarm();
}
externC void cyg_alarm_initialize(
cyg_handle_t alarm,
cyg_tick_count_t trigger, /* Absolute trigger time */
cyg_tick_count_t interval /* Relative retrigger interval */
) __THROW
{
((Cyg_Alarm *)alarm)->initialize(
(cyg_tick_count)trigger,
(cyg_tick_count)interval);
}
externC void cyg_alarm_get_times(
cyg_handle_t alarm,
cyg_tick_count_t *trigger, /* Next trigger time */
cyg_tick_count_t *interval /* Current interval */
) __THROW
{
((Cyg_Alarm *)alarm)->get_times(
(cyg_tick_count*)trigger,
(cyg_tick_count*)interval);
}
externC void cyg_alarm_enable( cyg_handle_t alarm ) __THROW
{
((Cyg_Alarm *)alarm)->enable();
}
externC void cyg_alarm_disable( cyg_handle_t alarm ) __THROW
{
((Cyg_Alarm *)alarm)->disable();
}
/*---------------------------------------------------------------------------*/
/* Mail boxes */
externC void cyg_mbox_create(
cyg_handle_t *handle,
cyg_mbox *mbox
) __THROW
{
CYG_ASSERT_SIZES( cyg_mbox, Cyg_Mbox );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -