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

Multiple call to segment warning

I am seeing this warning when I try to compile my code

Warning L15: multiple call to segment
segment: ?pr?_nvmwrit?nvmem_cc
caller1: ?pr?spicommisr?spi_com_cc
caller2: ?c_c51startup

I looked through my code, I don't call nvmwrite in spicommisr routine. And what is this c51startup file?

thanks,
DG

Parents Reply Children
  • I don't quite understand that example, but this time I tried to exclude one segment from overlaying analysis and it worked!
    thank you!
    And last question: how to disable multiple segments from overlaying analysis?
    My warnings are:

    *** WARNING L15: MULTIPLE CALL TO SEGMENT
        SEGMENT: ?PR?SSPIPSE?SPIHANDLERS_CC
        CALLER1: ?PR?SPICOMMISR?SPI_COM_CC
        CALLER2: ?C_C51STARTUP
    *** WARNING L15: MULTIPLE CALL TO SEGMENT
        SEGMENT: ?PR?_NVMWRITE?NVMEM_CC
        CALLER1: ?PR?SPICOMMISR?SPI_COM_CC
        CALLER2: ?C_C51STARTUP
    

  • I finally figure it out. Thanks all for the help.
    From the link Jon provide, it says:
    "automatic overlay analysis cannot be successfully accomplished when references are made via pointers to functions. "

    I do have function call via pointer, although I use exactly same method to handle my UART command and the compiler never has any problem with that...

    Anyway, once I specific exclude segment from overlaying analysis, the warnings are all gone.

    Thanks,

  • Anyway, once I specific exclude segment from overlaying analysis, the warnings are all gone.

    With the scarce resources of the '51 overlaying analysis is almost mandatory for any project greater than blinky. Get rid of the function pointer instead. You may get by without overlaying analysis for now, but some day you may see "data space overflow" and at that time a restructuring, that should be easy now, may be a 'project'.

    Erik

  • Or...

    Simply add the function called via pointer into the call tree where it belongs.

    Jon

  • Simply add the function called via pointer into the call tree where it belongs.

    What do you mean by that? Is that also through linker settings in Keil?

    what I have in my code is this, I define typedef struct:

    typedef struct {
            UINT8 Num_Input_Byte;
            void (*cmdFunc)(void);
    } cSpiInputStruct_T;
    

    After I receive information from SPI, I check the header then in my super loop, I have this:

    void SPIProcess(void)
    {
            if (SpiCmdReady)
            {
                    cSpiInputTbl[SpiCmdIdx].cmdFunc();
                    SpiCmdReady = FALSE;
            }
    }
    

    I am using similar method to handle UART command too and never have any problem there.

  • What do you mean by that? Is that also through linker settings in Keil?

    Yes. Take a look at the linker manual. There is an entire chapter devoted to this topic.

    www.keil.com/.../bl51_ol_manipulations.htm

    Jon