Hi Andy,
Please send me the files to reproduce this error. I'll
see if I can do something about it.
Maarten
> 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
>
>
>
>
> >
> > 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?!)
> > >
>
> ------------------------------------------------------------------------------
> This SF.net email is sponsored by:
> SourcForge Community
> SourceForge wants to tell your story.
> http://p.sf.net/sfu/sf-spreadtheword
> _______________________________________________
> Sdcc-user mailing list
> Sdcc-user@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/sdcc-user
>
------------------------------------------------------------------------------ This SF.net email is sponsored by: SourcForge Community SourceForge wants to tell your story. http://p.sf.net/sfu/sf-spreadtheword
_______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user