From: Andy G. <and...@ox...> - 2009-01-27 16:01:19
|
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?!) Thanks in advance, Andy > > Message: 4 > Date: Fri, 23 Jan 2009 20:28:49 +0100 > From: "Maarten Brock" <sou...@ds...> > Subject: Re: [Sdcc-user] Help with code-banking > To: sdc...@li... > Message-ID: <497...@so...> > Content-Type: text/plain; charset=US-ASCII > > Andy, > > SDCC generates a so-called extended intel-hex file. This > also contains records to indicate the start of a new > segment/bank. If your bootloader or whatever you use to > program the chip(s) does not understand extended hex- > files you can use srecord to split the file into several > hex-files for the banks. > > HTH, > Maarten > > > I'm evaluating SDCC for a project, which needs code-banking > (we estimate > > code size >64k). Are there any examples of how to do code-banking? I > > have seen and followed the instructions (see below), but I > think there > > is one thing I still need to know. > > > > On our hardware, the common area is 0x4000-0x7fff, with banks from > > 0x8000-0xFFFF. > > > > The keil compiler outputs a separate .ihx file for each > bank. However I > > can't find how to do that with SDCC. I can build an image using the > > script below, and the .map file shows everything at the right place > > (BANK1 and BANK2 look correctly overlaid). However I don't see how a > > single .ihx file can work. Is there a way to produce many > .ihx files, or > > some way to produce an output that describes >64k code? > > > > Can someone help me in the right direction? > > Thanks, > > Andy > > > > > > > > COMPILE:- > > sdcc -c main.c > > sdcc -c bank1stuff.c (this contains pragma codeseg BANK1) > > sdcc -c bank2stuff.c (this contains pragma codeseg BANK2) > > asx8051 mytrampoline.asm > > > > LINK:- > > sdcc --code-loc 0x4000 -Wl-bBANK1=0x18000 -Wl-bBANK2=0x28000 -Wl-r > > $(OBJS) > > > > |
From: Maarten B. <sou...@ds...> - 2009-01-28 19:40:32
|
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?!) > > Thanks in advance, > Andy > > > > > > > > Message: 4 > > Date: Fri, 23 Jan 2009 20:28:49 +0100 > > From: "Maarten Brock" <sou...@ds...> > > Subject: Re: [Sdcc-user] Help with code-banking > > To: sdc...@li... > > Message-ID: <497...@so...> > > Content-Type: text/plain; charset=US-ASCII > > > > Andy, > > > > SDCC generates a so-called extended intel-hex file. This > > also contains records to indicate the start of a new > > segment/bank. If your bootloader or whatever you use to > > program the chip(s) does not understand extended hex- > > files you can use srecord to split the file into several > > hex-files for the banks. > > > > HTH, > > Maarten > > > > > I'm evaluating SDCC for a project, which needs code-banking > > (we estimate > > > code size >64k). Are there any examples of how to do code-banking? I > > > have seen and followed the instructions (see below), but I > > think there > > > is one thing I still need to know. > > > > > > On our hardware, the common area is 0x4000-0x7fff, with banks from > > > 0x8000-0xFFFF. > > > > > > The keil compiler outputs a separate .ihx file for each > > bank. However I > > > can't find how to do that with SDCC. I can build an image using the > > > script below, and the .map file shows everything at the right place > > > (BANK1 and BANK2 look correctly overlaid). However I don't see how a > > > single .ihx file can work. Is there a way to produce many > > .ihx files, or > > > some way to produce an output that describes >64k code? > > > > > > Can someone help me in the right direction? > > > Thanks, > > > Andy > > > > > > > > > > > > COMPILE:- > > > sdcc -c main.c > > > sdcc -c bank1stuff.c (this contains pragma codeseg BANK1) > > > sdcc -c bank2stuff.c (this contains pragma codeseg BANK2) > > > asx8051 mytrampoline.asm > > > > > > LINK:- > > > sdcc --code-loc 0x4000 -Wl-bBANK1=0x18000 -Wl-bBANK2=0x28000 -Wl-r > > > $(OBJS) > > > > > > > > ------------------------------------------------------------------------------ > 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 > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > |
From: Andy G. <and...@ox...> - 2009-02-06 15:59:28
|
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" <sou...@ds...> > 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?!) > > |
From: Maarten B. <sou...@ds...> - 2009-02-06 17:12:08
|
Deja Vu Andy, Didn't you post this already some time ago? And didn't I reply that you could send me the code offline? Greets, 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 > > > >> >> Date: Wed, 28 Jan 2009 20:40:22 +0100 >> From: "Maarten Brock" <sou...@ds...> >> 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 > Sdc...@li... > https://lists.sourceforge.net/lists/listinfo/sdcc-user > > |
From: Mark S. <mark.swayne@q.com> - 2009-01-27 20:13:16
|
Andy, The records you posted are extended linear address records. Each one specifies the upper 16 bits of the address, creating a full 32 bit address. Each address prefix will last until a new prefix is declared. :020000040000FA :02 - Bytes in record 0000 - address field - always 0 for this type of record. 04 - Record type Extended Linear Address 0000 - Upper 16 bits of the address FA - Checksum All following records prepend 0000 to their address values: 248F becomes 0000248F :020000040001F9 :02 - Bytes in record 0000 - address field - always 0 for this type of record. 04 - Record type Extended Linear Address 0001 - Upper 16 bits of the address FA - Checksum All following records prepend 0001 to their address values: address 248F becomes 0001248F Keil has a nice page with good descriptions of Intel hex files. http://www.keil.com/support/docs/1584.htm I hope this helps. --Mark Andy Green wrote: > 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?!) > > Thanks in advance, > Andy > > |