hallo, people, I am a beginner on Xilkernel running on PPC405-Virtex 4. I just want to get interrupt generated from the OPB peripheral and the have the interrupt handler routine serviced. It seems there is a bug I can not find. The Xilkernel has no interaction with the interrupt handler routine. I have taken the example project from Xilinx website, which generates a periodic interrupts from a timer. The piece of codes is as following: #include "xmk.h" #include <os_config.h> #include <stdio.h> #include <xparameters.h> #include <xtmrctr_l.h> #include <xstatus.h> #include <pthread.h> #include <semaphore.h> #include <sys/intr.h> #define TIMER_COUNTER_ID 0 volatile unsigned int mins, hrs, secs, tot_secs = 0; unsigned int addr=XPAR_TIMER_2_BASEADDR; int_id_t intTimerID = XPAR_INTC_TIMER_2_INTERRUPT_INTR; void interval_timer_initialize () { print ("CLOCK: Configuring extra timer to generate one interrupt per second..\r\n"); XTmrCtr_mWriteReg (addr, TIMER_COUNTER_ID, XTC_TLR_OFFSET, SYSTMR_CLK_FREQ); // reset the timers, and clear interrupts XTmrCtr_mSetControlStatusReg (addr, TIMER_COUNTER_ID, XTC_CSR_INT_OCCURED_MASK | XTC_CSR_LOAD_MASK ); // start the timer XTmrCtr_mSetControlStatusReg (addr, 0, XTC_CSR_ENABLE_TMR_MASK | XTC_CSR_ENABLE_INT_MASK | XTC_CSR_AUTO_RELOAD_MASK | XTC_CSR_DOWN_COUNT_MASK ); } void extra_timer_int_handler () { unsigned int control_reg; control_reg = XTimerCtr_mReadReg (addr, TIMER_COUNTER_ID, XTC_TCSR_OFFSET); XTmrCtr_mWriteReg (addr, TIMER_COUNTER_ID, XTC_TCSR_OFFSET, XTC_CSR_LOAD_MASK | XTC_CSR_INT_OCCURED_MASK); // remove the reset condition such that the timer counter starts running // with the value loaded from the compare register XTmrCtr_mWriteReg (addr, TIMER_COUNTER_ID, XTC_TCSR_OFFSET, control_reg | XTC_CSR_ENABLE_TMR_MASK); } void* my_main (void *arg) { int a = 0; XStatus status; if ((status = register_int_handler(intTimerID, extra_timer_int_handler, NULL)) != XST_SUCCESS) { xil_printf ("CLOCK: Unable to register handler. Error code: %d.\r\n", status); goto err; } else print ("CLOCK: Successfully registered a handler for extra timer interrupts.\r\n"); interval_timer_initialize (); print ("CLOCK: Enabling the interval timer interrupt...\r\n"); enable_interrupt (intTimerID); while (1) { } err: xil_printf ("CLOCK: Clock functions unavailable...\r\n"); return NULL; } int main(){ xil_printf("main\r\n"); xilkernel_main(); return 0; } I think the magic functions with Xilkernal are just the "register_int_handler" and "enable_interrupt". I have initialized the timer properly and read the control status register while running. The timer generates the interrupt bit correctly but THE INTERRUPT HANDLER JUST KEEPS SILENCE. I have checked everything I can. With Standalone, the board just runs perfectly. Could anyone give me a hint or help? I am blocked here for the simple project for several days and quasi-mad. Thanks in advance zl
interrupt handler on the Xilkernel PPC405
Started by ●April 25, 2007