<html><body><div style="color:#000; background-color:#fff; font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:10pt"><div class="" role="main" style=""><div id="yiv3370076218"><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:10pt;"><div class="" style=""><div id="yiv3370076218"><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:10pt;"><div class=""> <div class="" style=""><div id="yiv3370076218"><div><div style="color:#000;background-color:#fff;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;font-size:10pt;">Hi,
 I am newbie in RTEMS and I am trying to install an interrupt into the 
interrupt controller to be capable of using an APBUART peripheral within
 a LEON3 based embedded processor. I configure the system so driver 
manager configures at BSP Start the console and the timer. I do have two
 APBUART configured in the system and my intention is to use the first 
one with console/termios driver and the second one with my own driver. 
Here is a copy the output of "info sys" command:<br><br><br><div><<</div><div>grmon2> info sys<br>          cpu0          Aeroflex Gaisler  LEON3 SPARC V8 Processor    <br>                  AHB Master
 0<br>          ahbjtag0  Aeroflex Gaisler  JTAG Debug Link    <br>                      AHB Master 1<br>          mctrl0    European Space Agency  LEON2 Memory Controller    <br>                      AHB: 00000000 - 20000000<br>                      AHB: 20000000 - 40000000<br>                      AHB: 40000000 - 80000000<br>                      APB: 80000000 -
 80000100<br>                      32-bit prom @ 0x00000000<br>                      32-bit static ram: 2 * 512 kbyte @ 0x40000000<br>          apbmst0   Aeroflex Gaisler  AHB/APB Bridge    <br>                  AHB: 80000000 - 80100000<br>          dsu0      Aeroflex Gaisler  LEON3 Debug Support Unit    <br>                   AHB: 90000000 - A0000000<br>          CPU0:  win 8, hwbp 2, V8 mul/div, lddel 1, GRFPU-lite<br>   
               stack pointer 0x400ffff0<br>                          icache 1 * 4 kB, 32 B/line <br>                  dcache 1 * 4 kB, 32 B/line <br>          uart0        Aeroflex Gaisler  Generic UART    <br>                  APB: 80000100 - 80000200<br>                  IRQ: 2<br>                  Baudrate 38343<br>          irqmp0    Aeroflex Gaisler  Multi-processor
 Interrupt Ctrl.    <br>                  APB: 80000200 - 80000300<br>          gptimer0  Aeroflex Gaisler  Modular Timer Unit    <br>                  APB: 80000300 - 80000400<br>                  IRQ: 8<br>                  8-bit scalar, 2 * 32-bit timers, divisor 50<br>          uart1     Aeroflex Gaisler  Generic UART    <br>                  APB: 80000900 - 80000A00<br>                 
 IRQ: 3<br>                  Baudrate 38343<br>          gpio0     Aeroflex Gaisler  General Purpose I/O port    <br>                  APB: 80000B00 - 80000C00</div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">>><br></div><div><br></div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">I
 have wrote a testing app to check if both UARTs work and also to try to
 install a handler for RX on the second UART. Here is my code:</div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;"><br></div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;"><<</div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">#include <rtems.h><br><br>rtems_task Init( rtems_task_argument argument);    /* forward declaration needed */<br><br>/* configuration information */<br>#define CONFIGURE_INIT<br>#include <bsp.h> /* for device driver prototypes */<br><br><br>#define
 CONFIGURE_RTEMS_INIT_TASKS_TABLE<br>#define
 CONFIGURE_MAXIMUM_TASKS             4<br>#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER<br>#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER<br>#include <rtems/confdefs.h><br><br>#include <stdio.h><br>#include <stdlib.h><br><br>#include <sys/types.h><br>#include <sys/stat.h><br>#include <unistd.h><br>#include <errno.h><br>#include <apbuart.h><br><br>// Global Variable to check if Interrupt has been signaled.<br>unsigned char uc_intr_flag;<br><br>// Interrupt handler for APBUART peripheral <br>void UARTInterruptHandler ()<br>{<br>    uc_intr_flag = 1;<br>}<br><br>rtems_task Init (rtems_task_argument ignored)<br>{<br><br>    int i;<br>    rtems_status_code ret_status;<br>    rtems_isr_entry old_handler;<br>    volatile int *apbuart1 =
 (int*)0x80000900;<br>    volatile int aux;<br><br>    // Reset Interrupt Flag<br>    uc_intr_flag = 0;<br><br>    printf("APB UART TEST with Interrupts\n");<br><br>    aux = apbuart1[1];<br>    printf("APBUART1 STATUS: 0x%08X\n", aux);<br>    aux = apbuart1[2];<br>    printf("APBUART1 CONTROL: 0x%08X\n", aux);<br>    <br>    // Install UARTInterruptHandler at vector number 3 <br>    ret_status = rtems_interrupt_catch(<br>            (rtems_isr_entry)UARTInterruptHandler,<br>            (rtems_vector_number)3,<br>            &old_handler);<br>    switch (ret_status)<br>    {<br>   
        case RTEMS_SUCCESSFUL :<br>              printf("rtems_interrupt_catch: OK. New Interrupt installed for IRQ 3 - APBUART 2.\n");<br>          break ;<br><br>           case RTEMS_INVALID_NUMBER :<br>              printf("rtems_interrupt_catch: RTEMS_INVALID_NUMBER.\n");<br>              break ;<br><br>           case RTEMS_INVALID_ADDRESS :<br>               printf("rtems_interrupt_catch: RTEMS_INVALID_ADDRESS.\n");<br>               break ;<br><br>        default
 :<br>              printf("rtems_interrupt_catch: Unknown error.\n");<br>              break ;<br>    }<br><br>    // Tell uart hardware to initialize directly<br>    /* Enable receiver (with interrupts) & Transmitter */<br>    apbuart1[2] = APBUART_CTRL_RE | APBUART_CTRL_TE | APBUART_CTRL_RI;<br>    aux = apbuart1[1];<br>    printf("UART1 STATUS: 0x%02X\n", aux);<br>    aux = apbuart1[2];<br>    printf("UART1 CONTROL: 0x%08X\n", aux);<br><br>    // Write a character though APBUART1 to test it<br>    apbuart1[0] = 0xD8;<br><br>    while (1)<br>    {       // Perform some active wait time<br>        for (i
 = 2000000; i > 0; i--);<br><br>        printf("Hello World\n");<br>        apbuart1[0] = 0xD8;<br>        // If interrupt received, read from APBUART<br>        if (uc_intr_flag == 1)<br>        {<br>            uc_intr_flag = 0;<br>            aux = apbuart1[0];<br>            printf("Interrupt received from UART: data = %X\n", aux);<br>        }<br>    }<br><br>    exit (0);<br>}<br>>></div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;"><br></div><div
 style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">First
 UART (ie. debug UART) works fine and output data through STDOUT 
properly. Data sent through second UART is received also by another 
external terminal, and in other test I have been capable of receiving 
too. However UARTInterruptHandler is never signaled, thus I guess I am 
missing something with the interrupt instalation. <br></div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;"><br></div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">Could any one see anything missing in this code? I
 would very much appreciate some help. Any clue on how to properly use interrupts will help me a lot!</div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;"><br></div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">Thanks!</div><div style="color:rgb(0, 0, 0);font-size:13.3333px;font-family:HelveticaNeue, Helvetica Neue, Helvetica, Arial, Lucida Grande, sans-serif;background-color:transparent;font-style:normal;">Alberto.<br></div></div></div></div></div>   </div> 
 </div></div></div></div></div></div></div></div><div><br></div></div></body></html>