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
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...?