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

ERROR L121: IMPROPER FIXUP ???

How to solve this problem and how did I got into this problem ?

I have used Silabs F930 and Silabs IDE for projects, and Linker gives me this error and it has to do something about the memory mapping and space. How to dig into the source of this problem ? Internet is full of instructions and examples but nothing is clear to me what is happening and how this can be solved. This happens now when code size had increased over a certain point. What kind of settings I should change or command options to solve the problem ?
The error message comes in this form:
xxxx.obj
>> SEGMENT: ABSOLUTE OFFSET: 0023H

Program Size: data=20.0 xdata=0 code=2397
LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 1 ERROR(S)
Download cancelled.

Linker BL51.EXE and Compiler C51.EXE

Compiler options are: DB OE BR INCDIR(C:\SiLabs\MCU\Inc) LC ROM(Small)
Linker options are: RS(256) PL(68) PW(78) CO(7000)

Thanks.

Parents
  • I'm aware of previous cases like this:
    www.keil.com/.../

    " The improper fixup error occurs because his code is using more than 256 bytes of data. Overlaying data space reduces data space usage and corrects the bug."

    What does the above mean in practise, 256 bytes of data !?!?

    "Tells me that this is either an assembler routine or that it is the vector for an interrupt service routine (because the segment is ABSOLUTE). "

    In my case it is Interrupt to UART0 which is causing this problem.

    " The offset of 0023H tells me that the problem happens at the interrupt vector location. The only thing that would cause this problem there is an AJMP to an ISR that is too far away."

    Why this would happen in the first place, why there is a jump distance limitation ?

    "It you are using C, this problem should not occur."

    I do not use assembler, I only use C.

    -Thx

Reply
  • I'm aware of previous cases like this:
    www.keil.com/.../

    " The improper fixup error occurs because his code is using more than 256 bytes of data. Overlaying data space reduces data space usage and corrects the bug."

    What does the above mean in practise, 256 bytes of data !?!?

    "Tells me that this is either an assembler routine or that it is the vector for an interrupt service routine (because the segment is ABSOLUTE). "

    In my case it is Interrupt to UART0 which is causing this problem.

    " The offset of 0023H tells me that the problem happens at the interrupt vector location. The only thing that would cause this problem there is an AJMP to an ISR that is too far away."

    Why this would happen in the first place, why there is a jump distance limitation ?

    "It you are using C, this problem should not occur."

    I do not use assembler, I only use C.

    -Thx

Children