boolean MACNET_install_isr( ENET_CONTEXT_STRUCT_PTR enet_ptr, uint_32 int_num, uint_32 int_index, INT_ISR_FPTR isr, uint_32 level, uint_32 sublevel ) { uint_32 vector = MACNET_get_vector(enet_ptr->PARAM_PTR->ENET_IF->MAC_NUMBER, int_index); #if BSPCFG_ENET_RESTORE MACNET_CONTEXT_STRUCT_PTR macnet_context_ptr = (MACNET_CONTEXT_STRUCT_PTR) enet_ptr->MAC_CONTEXT_PTR; /* Save old ISR and data */ macnet_context_ptr->OLDISR_PTR[int_num] = _int_get_isr(vector); macnet_context_ptr->OLDISR_DATA[int_num] = _int_get_isr_data(vector); #endif if (_int_install_isr(vector, isr, (pointer)enet_ptr)==NULL) { return FALSE; } /* Initialize interrupt priority and level */ _bsp_int_init((PSP_INTERRUPT_TABLE_INDEX)vector, level, sublevel, TRUE); return TRUE; }
static boolean MCF5XXX_FEC_install_isr( ENET_CONTEXT_STRUCT_PTR enet_ptr, uint_32 int_num, uint_32 int_index, void _CODE_PTR_ isr, uint_32 level, uint_32 sublevel ) { uint_32 vector = MCF5XXX_FEC_get_vector(enet_ptr->PARAM_PTR->ENET_IF->MAC_NUMBER, int_index); typedef void(*ISR_PTR)(pointer); #if BSPCFG_ENET_RESTORE MCF5XXX_FEC_CONTEXT_STRUCT_PTR fec_context_ptr = (MCF5XXX_FEC_CONTEXT_STRUCT_PTR) enet_ptr->MAC_CONTEXT_PTR; // Save old ISR and data fec_context_ptr->OLDISR_PTR[int_num] = (void *)_int_get_isr(vector); fec_context_ptr->OLDISR_DATA[int_num] = _int_get_isr_data(vector); #endif if (_int_install_isr(vector, (ISR_PTR)isr, (pointer)enet_ptr)==NULL) { return FALSE; } // Initialize interrupt priority and level _psp_set_int_prio_and_level((PSP_INTERRUPT_TABLE_INDEX)vector, level, sublevel, TRUE); return TRUE; }
void _klog_isr_start_internal ( _mqx_uint vector_number ) { /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; _GET_KERNEL_DATA(kernel_data); if (kernel_data->KERNEL_COMPONENTS[KERNEL_LWLOG]) { if (kernel_data->LOG_CONTROL & KLOG_INTERRUPTS_ENABLED) { if (!(kernel_data->LOG_CONTROL & KLOG_SYSTEM_CLOCK_INT_ENABLED)) { /* Check to see if the vector number is to be ignored */ if (vector_number == kernel_data->SYSTEM_CLOCK_INT_NUMBER) { return; } /* Endif */ } /* Endif */ _lwlog_write_internal(LOG_KERNEL_LOG_NUMBER, (_mqx_max_type)KLOG_INTERRUPT, (_mqx_max_type)vector_number, (_mqx_max_type)_int_get_isr(vector_number), (_mqx_max_type)_int_get_isr_data(vector_number), (_mqx_max_type)0, (_mqx_max_type)0, (_mqx_max_type)0); } /* Endif */ } /* Endif */ } /* Endbody */
void main_task ( uint32_t initial_data ) { MY_ISR_STRUCT_PTR isr_ptr; uint32_t result; /* Create the lightweight semaphore */ result = _lwsem_create(&lwsem, 0); if (result != MQX_OK) { printf("\nCreating sem failed: 0x%X", result); _task_block(); } isr_ptr = _mem_alloc_zero((_mem_size)sizeof(MY_ISR_STRUCT)); isr_ptr->TICK_COUNT = 0; isr_ptr->OLD_ISR_DATA = _int_get_isr_data(BSP_TIMER_INTERRUPT_VECTOR); isr_ptr->OLD_ISR = _int_get_isr(BSP_TIMER_INTERRUPT_VECTOR); /* Native MQX interrupt handling method, ISR is installed into the interrupt vector table in kernel */ if(! _int_install_isr(BSP_TIMER_INTERRUPT_VECTOR, new_tick_isr, isr_ptr)) { printf("Install interrupt handler to interrupt vector table of MQX kernel failed.\n"); _task_block(); } #ifndef DEMO_ENABLE_KERNEL_ISR _time_delay_ticks(200); printf("\nTick count = %d\n", isr_ptr->TICK_COUNT); _task_block(); #else printf("\n====================== ISR Example =======================\n"); printf("Press the SW1 to blink LED1, press it again to turn it off\n"); while(1) { _lwsem_wait(&lwsem); num_tick = isr_ptr->TICK_COUNT; } #endif /* DEMO_ENABLE_KERNEL_ISR */ }
_mqx_int _io_pcb_shm_ioctl ( /* [IN] the file handle for the device */ FILE_DEVICE_STRUCT_PTR fd_ptr, /* [IN] the ioctl command */ _mqx_uint cmd, /* [IN] the ioctl parameters */ pointer param_ptr ) { IO_PCB_SHM_INFO_STRUCT_PTR info_ptr; IO_PCB_STRUCT_PTR pcb_ptr; _mqx_uint result = MQX_OK; _psp_code_addr old_value; _psp_code_addr_ptr pc_ptr = (_psp_code_addr_ptr)param_ptr; _psp_data_addr_ptr pd_ptr = (_psp_data_addr_ptr)param_ptr; boolean _PTR_ bool_param_ptr; IO_PCB_SHM_INIT_STRUCT_PTR init_ptr; info_ptr = (IO_PCB_SHM_INFO_STRUCT_PTR)fd_ptr->DEV_DATA_PTR; init_ptr = &info_ptr->INIT; switch (cmd) { case IO_PCB_IOCTL_ENQUEUE_READQ: pcb_ptr = (IO_PCB_STRUCT_PTR)*pd_ptr; _queue_enqueue((QUEUE_STRUCT_PTR)&info_ptr->READ_QUEUE, (QUEUE_ELEMENT_STRUCT_PTR)&pcb_ptr->QUEUE); _lwsem_post(&info_ptr->READ_LWSEM); break; case IO_PCB_IOCTL_READ_CALLBACK_SET: old_value = (_psp_code_addr)info_ptr->READ_CALLBACK_FUNCTION; info_ptr->READ_CALLBACK_FUNCTION = (void (_CODE_PTR_)( FILE_DEVICE_STRUCT_PTR, IO_PCB_STRUCT_PTR))*pc_ptr; *pc_ptr = old_value; break; case IO_PCB_IOCTL_SET_INPUT_POOL: old_value = (_psp_code_addr)info_ptr->READ_PCB_POOL; info_ptr->READ_PCB_POOL = (_io_pcb_pool_id)*pc_ptr; *pc_ptr = old_value; info_ptr->FD = fd_ptr; break; case IO_PCB_IOCTL_START: info_ptr->RX_OLDISR_PTR = _int_get_isr( init_ptr->RX_VECTOR); info_ptr->RX_OLDISR_DATA = _int_get_isr_data(init_ptr->RX_VECTOR); info_ptr->TX_OLDISR_PTR = _int_get_isr( init_ptr->TX_VECTOR); info_ptr->TX_OLDISR_DATA = _int_get_isr_data(init_ptr->TX_VECTOR); #if BSPCFG_IO_PCB_SHM_SUPPORT if (_bsp_io_pcb_shm_int_install(init_ptr,info_ptr)!=MQX_OK) { _mem_free(info_ptr); return MQX_IO_PCB_SHM_INSTALL_ISR_FAILLED; } #else /* Install rx ISR */ if (!_int_install_isr(init_ptr->RX_VECTOR, _io_pcb_shm_rx_isr, info_ptr)) { _mem_free(info_ptr); return MQX_IO_PCB_SHM_INSTALL_ISR_FAILLED; } /* Install the tx finished ISR */ if (!_int_install_isr(init_ptr->TX_VECTOR, _io_pcb_shm_tx_isr, info_ptr)) { _mem_free(info_ptr); return MQX_IO_PCB_SHM_INSTALL_ISR_FAILLED; } #endif break; case IO_PCB_IOCTL_UNPACKED_ONLY: bool_param_ptr = (boolean _PTR_)param_ptr; *bool_param_ptr = TRUE; break; default: /* result = _io_ioctl(info_ptr->FD, cmd, param_ptr); */ break; } return result; }