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

Reply via email to