MegaJohn (08.10.2013 22:48 - 22:53, просмотров: 72) ответил Илюxa на Friend функция написанная на C.
доступ из вектора в метода класса можно сделать так хедер класса
static void irq_func_( void* in_arg );
void irq_func( void );
cpp класса
//------------------------------------------------------------------------------
void Cuart::irq_func_( void* in_arg )
{
((Cuart*)in_arg)->irq_func();
}
//------------------------------------------------------------------------------
void Cuart::irq_func( void )
{
u32 int_id = ((LPC_UART_TypeDef*)reg)->IIR;
и обработка
}
//------------------------------------------------------------------------------
void Cuart::init( void )
{
set_new_vector_int( this, irq_func_, UART0_IRQn );
}
вызов из вектора
//------------------------------------------------------------------------------
void UART0_IRQHandler(void)
{
callback_irq_arr[ UART0_IRQn ].callback_func( callback_irq_arr[ UART0_IRQn ].cls_p );
#ifdef TNKERNEL
tn_int_exit();
#endif
}
где
typedef struct{
func_ptr_param_pvoid callback_func;
void* cls_p;
}Scallback_irq;
#define VECT_INT_QNTY ((u32)EEPROM_IRQn+1)
Scallback_irq callback_irq_arr[ VECT_INT_QNTY ] = { 0 };
//------------------------------------------------------------------------------
void set_new_vector_int( void* in_cls, func_ptr_param_pvoid in_func, u32 in_bit_pos )
{
IRQn_Type irq_id = (IRQn_Type)in_bit_pos;
ASSERT( irq_id >= WDT_IRQn );
ASSERT( irq_id <= VECT_INT_QNTY );
ASSERT( in_func );
ASSERT( callback_irq_arr[ in_bit_pos ].callback_func == NULL );
callback_irq_arr[ in_bit_pos ].callback_func = in_func;
callback_irq_arr[ in_bit_pos ].cls_p = in_cls;
if( irq_id == ENET_IRQn )
NVIC_SetPriority( ENET_IRQn, 0 );
else
NVIC_SetPriority( irq_id, 1 );
NVIC_EnableIRQ( irq_id );
}