Maarten,

Many thanks for the excellent response so far.
Please bear with the following lengthy explanation....


It _IS_ a small app: the .map file shows all the code:-

        Area                               Addr   Size   Decimal Bytes
(Attributes)
        --------------------------------   ----   ----   ------- -----
------------
        CSEG                               407A   0CE8 =   3304. bytes
(REL,CON,CODE)

        Value  Global
           --------  --------------------------------
          0C:407A    _app_entry
          0C:40F7    _main
          0C:40FD    _Timer_Init
          0C:4169    _Timer_Allocate
          0C:4228    _Timer_AllocateTimeout
          0C:4232    _Timer_Deallocate
          0C:4270    _Timer_HasExpired
          0C:42D4    _Timer_ISR0Guts
          0C:43A9    _Timer_DelayUS
          0C:43ED    _Timer_DelayMS
          0C:4419    _UART_Init
          0C:4427    _UART_TxCh
          0C:4431    _UART_RxAvailable
          0C:4438    _UART_RxCh
          0C:448D    _UART_RxHexU08
          0C:44B1    _UART_RxHexU16
          0C:44D4    _UART_TxHexU08
          0C:44EE    _Console_PollOnce
          0C:4673    _strlen
          0C:4697    _putchar
          0C:469A    _HexToDec
          0C:46D5    _DecToHex
          0C:46F3    ___printf_no_irq
          0C:4727    _do_stuff1
          0C:473D    _do_stuff0
          0C:475E    _vprintf
          0C:4777    _printf
          0C:4837    __print_format
          0C:4D25    __mulint
          0C:4D25    __mulint_dummy
          0C:4D42    __gptrget
          0C:4D5E    __sdcc_external_startup

However the .ihx output has inserted a spurious extended address record.

        <snippet>
        :0E4EB900616420524F4D2F434F4445206164E9
        :0E4EC7006472657373203078585858580A0A80
        :014ED50000DC
        :0E4ED6004F69202D2057617463682077686152
        :0E4EE4007420796F7527726520646F696E67A0
        :0E4EF200206661742066696E676572730A003F
        :020000040001F9                                         ;
spurious!
        :08467300AA82AB83ACF07D00CC                             ;
_strlen not in high segment
        :0E467B008A828B838CF0124D42FEA3AA82AB82
        :0746890083EE60030D80EBDE
        </snippet>


I've done some more work on this, and I'm pretty sure it's a linker bug.

as/link/mcs51/lkihx.c reads as follows:-

        VOID
        hexRecord(unsigned addr, int rtvalIndex)
        {
            Addr_T chksum;
            int i, overrun, bytes;
        
            for (i = rtvalIndex, chksum = 0; i < rtcnt; i++) {
                if (rtflg[i]) {
                    if (addr + ++chksum > 0xffff)
                        break;
                }
            }
            if (chksum == 0)
                return;         // nothing to output
        
            if ( (lastHexAddr > addr) && (rflag) ) {         /* <==
BUG?? */
                overrun = hexPageOverrun + 1;
                ihxExtendedLinearAddress(lastExtendedAddress + overrun);
                hexPageOverrun = overrun;
                hexRecord(addr, rtvalIndex);
                return;
            }
          ... etc.
        }


I think the line I've marked assumes that the output is always
ascending, therefore if (lastHexAddr > addr) it must have wrapped around
into a different bank. However, look at the .ihx output above: the
addresses are rising (E4ED, E4EE, E4EF) then the next address is 4673 -
still in the common area, but less than the previous address, so it
inserts the extended record.

I've tried a replacement as follows. This 'fixes' the problem for this
case, but is not extendable to >2 banks (and obviously I don't know the
code that well, so I may break something else...) Can you confirm I'm on
the right lines, or suggest a better way?

            unsigned masked1, masked2;
            masked1 = lastHexAddr & ~0xFFFFUL;
            masked2 = addr & ~0xFFFFUL;

            /* Is this record in the same bank as previous? */ 
            if ( (masked1 != masked2) && (rflag) ) {
          overrun = hexPageOverrun + 1;
                ihxExtendedLinearAddress(lastExtendedAddress + overrun);
                hexPageOverrun = overrun;
                hexRecord(addr, rtvalIndex);
                return;
            }

I've tried to compress the app even further, to get something small
enough to submit as a how-to-reproduce sample. However the problem goes
away if I get it any smaller. So, I'm stuck with 8 compilation units and
makefile. I can send you this off-list if you need it.

Regards,
Andy



> 
> Date: Wed, 28 Jan 2009 20:40:22 +0100
> From: "Maarten Brock" <sourceforge.br...@dse.nl>
> Subject: Re: [Sdcc-user] Help with code-banking
> 
> Andy,
> 
> If you still have code above 0x00010000 as indicated by 
> the second record you mention, you either have placed 
> code above that address yourself with a option for the 
> linker or your program is not "a small app".
> 
> Maarten
> 
> > Thanks a lot Maarten,
> > 
> > I've made sense of the extended address record. However one 
> thing still
> > confuses me. If I build a small app that all fits in the 
> common area,
> > the output.ihx still contains two extended address records, 
> along the
> > lines of:-
> > 
> > :020000040000FA     // I guess this means bank0?
> > ..
> >   <some data records>
> > ..
> > :020000040001F9     // I guess this means bank1?
> > ..
> >   <more data records>
> > ..
> > :0400000500000000F7
> > :00000001FF
> > 
> > I guess the linker must think the banked area starts at a 
> lower address.
> > How do I set the banked area? 
> > (or have I misunderstood completely?!)
> > 



------------------------------------------------------------------------------
Create and Deploy Rich Internet Apps outside the browser with Adobe(R)AIR(TM)
software. With Adobe AIR, Ajax developers can use existing skills and code to
build responsive, highly engaging applications that combine the power of local
resources and data with the reach of the web. Download the Adobe AIR SDK and
Ajax docs to start building applications today-http://p.sf.net/sfu/adobe-com
_______________________________________________
Sdcc-user mailing list
Sdcc-user@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sdcc-user

Reply via email to