This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

COM ISR not being linked

Good afternoon,

I'm trying to register a serial (com-0) interrupt using uVision 3 on the Cypress FX2LP. The code compiles fine, but the linker warns:

WARNING L16: UNCALLED SEGMENT, IGNORED OVERLAY PROCESS
SEGMENT: ?PR?COM_ISR?MAIN

My ISR looks like this:

static void com_isr (void) interrupt 4 {
        char c;

        if (RI) {
                c = SBUF0;    // read character
                RI = 0;       // clear interrupt request flag
                if (istart + ILEN != iend) {
                inbuf[iend++ & (ILEN-1)] = c;
                }
        }

        if (TI != 0) {
        TI = 0;                  // clear interrupt request flag
        if (ostart != oend) {    // if characters in buffer and
                SBUF0 = outbuf[ostart++ & (OLEN-1)];        // transmit character
                sendfull = 0;
        }
                else {  // if all characters transmitted
                        sendactive = 0;                 // clear 'sendactive'
                }
        }
}

This code is pretty much copy and pasted from the Keil Help section on Serial Transmission.

This ISR is not being called, even with IE=0x80 (to enable global interrupts) and ES0 = 1 (to enable serial 0 interrupts). Does anyone have any suggestions?

Thanks,

Montana

Parents Reply Children
  • I'm sure I have seen it done with 'static' !

    It kinda makes sense, as you're not allowed to call an ISR - so you might as well "hide" it...?

  • I belive this might apply to this situation:

    "Normally, when several relocatable object files are processed, the linker disallows multiple definitions of global symbols with the same name. However, the linker allows a weak definition in the presence of a global symbol with the same name; the weak definition is ignored. Another difference between a global and a weak symbol lies in whether the linker searches archive libraries. To resolve undefined global symbols, the linker searches archive libraries and extracts members that contain definitions; it does not do this to resolve undefined weak symbols.

    The following restrictions and limitations apply to weak symbols:

    Weak symbols may not have static storage duration.
    Multiple definitions for a weak symbol cannot be provided in the same translation unit.

    When multiple definitions are present, the linker uses the first weak definition encountered."

    I tried static on an ISR within a Cortex device and received a warning that the ISR was not being referenced.

  • That's not relevant here, as interrupts work entirely differently in C51.

    In C51, it's the interrupt keyword that tells the compiler
    1. to generate the ISR entry & exit code, and
    2. to insert an entry at the specified location in the vector table.

    This does, however, make it stange that there should be an "uncalled function" warning - since the interrupt keyword should be telling the compiler to create the "call" itself!

    You haven't set the option to disable vector table generation, have you...?