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

ISR causes error L121 improper fixup

Hi Folks,

I have a very simple piece of C code which calls an interrupt. This is compiled and linked using the uVision tool set (V2.40) (C51 v7.10, BL51 v5.03). This code works with a memory model small and code ROM size compact. When I try to run this with memory model small and code ROM size small (my preferred option) I get the infamous error L121 "improper fixup" error.
When I look at the memory map it is as below
TYPE BASE LENGTH RELOCATION SEGMENT NAME
-----------------------------------------------------

* * * * * * * D A T A M E M O R Y * * * * * * *
REG 0000H 0008H ABSOLUTE "REG BANK 0"
IDATA 0008H 0001H UNIT ?STACK

* * * * * * * C O D E M E M O R Y * * * * * * *
CODE 0000H 0003H ABSOLUTE
CODE 0003H 0002H ABSOLUTE
0005H 07FBH *** GAP ***
CODE 0800H 000CH UNIT ?C_C51STARTUP
CODE 080CH 000AH INBLOCK ?PR?INIT?EX1C
CODE 0816H 0004H INBLOCK ?PR?INTERRUPTSERVICE?EX1C
CODE 081AH 0004H INBLOCK ?PR?MAIN?EX1C

I 'think' that the failure is because the interrupt vector for INT0 jumps to 0003H, but the interrupt service routine has been placed at 0816H, which is an address jump greater than 8 bits from the interrupt vector location. But being a newbie I am not sure. Is this the problem? If so how can I locate the C code ISR in the 8 byte location from 0003H which is to where the interrupt vector jumps?
Thanks for your help folks!

  • You are using the evaluation tools (which locate programs at 0x800). The ROM(SMALL) option says to use ACALL and AJMP instructions. The error is caused by the AJMP at the interrupt vector to the interrupt service routine.

    The full, licensed tools do not have this limitation.

    Jon