Hi, I was looking at the stack roll-over capability of the Aduc842, and I thing you can take great advantage of it! This is from the datasheet:
"By default, the stack operates exactly like an 8052 in that it rolls over from FFH to 00H in the general-purpose RAM. On the parts, however, it is possible (by setting CFG841.7 or CFG842.7) to enable the 11-bit extended stack pointer. In this case, the stack rolls over from FFH in RAM to 0100H in XRAM. The 11-bit stack pointer is visible in the SP and SPH SFRs. The SP SFR is located at 81H as with a standard 8052. The SPH SFR is located at B7H. The 3 LSBs of this SFR contain the 3 extra bits necessary to extend the 8-bit stack pointer into an 11-bit stack pointer." I never tried this before, but according to the datasheet, it would be very easy to activate in sdcc. In _sdcc_external_startup or the top of your main function (I don't remember where the stack is initialized) add: CFG842|=0x80; // Enable 11-bit stack SPH=0x7 // Locate stack at 0x700 SP=0; If that doesn't work, try not changing SPH and SP, and link with --xram-loc 0x200, as the stack would roll over from data 0xff to xram 0x100. Then, by making some of your new functions reentrant, you should be able to free some data memory. Or you can go to the extreme of making all reentrant (using stack-auto) and free lots of data memory. Jesús At 05:58 AM 10/3/2006, you wrote: >Maarten Brock wrote: > > Hello Karl, > > > > Yes, you ran out of 'data' memory. Especially when > > accessing xdata (--model-large) the compiler uses many > > temporaries which are stored in registers and then in > > data memory. It tries to overlay them but is not very > > good at that. The result: high usage of the limited data > > memory resource. As you can see in the .mem file all is > > used. It has no point putting temporaries in xdata as > > xdata access (only indirect) was the issue in the first > > place. > > > > Am I saying all hope is lost? No, not all. You can try > > to use --stack-auto to put all temporaries on the stack. > > The stack uses idata which can be about twice as big as > > data memory, but it also might introduce extra > > temporaries. Also on the stack overlaying happens by > > definition in it's most efficient way. But I cannot > > guarantee this will solve your problems, it might even > > create more as stack pressure rises and stack overflows > > can happen. > > > > Greets, > > Maarten > > > > > >Thanks for the info. I'm thinking though that --stack-auto will cause >more problems with potential stack overflows. > >Any near term improvements coming the the compiler to help improve it's >usage of these temporaries? > >Are there things i can do with my code, that will make the compiler work >better to help improve things? > >What i have in mind: >* remove reentrant function (i have 1 now) I would think that this only >reduces stack usage though. >* break functions into smaller pieces >* reduce function depth (reduce stack usage) >* I have 2 register banks for high priority interrupts allocated, I may >try not "using x" register bank, trade off on performance, but will add >a few bytes of "data" space. >* This processor (analog devices ADUC842) supports a 11 bit stack >pointer (SP and SPH) that would allow me to use --stack-auto and now >worry about overflows. However I don't know how to make SDCC do this, >or if it's supported. > > >I'm trying these now... > >Thanks > >-- >Karl Hiramoto http://karl.hiramoto.org/ > > > >> Hi all, > >> > >> My code was compiling/linking/running fine, I added a few functions, > >> and now when linking i get: > >> > >> ?ASlink-Error-Could not get 4 consecutive bytes in internal RAM for area > >> OSEG. > >> > >> sdcc -v > >> SDCC : mcs51/gbz80/z80/avr/ds390/pic16/pic14/TININative/xa51/ds400/hc08 > >> 2.6.1 #4398 (Oct 2 2006) (UNIX) > >> > >> I also had the same with the 2.6.0 release. > >> > >> > >> I compile/link with args like: > >> > >> sdcc -c --iram-size 256 --model-large --xram-size 2048 --code-size > >> 63487 --opt-code-size --profile -I/usr/local/sdcc/share/sdcc/include > >> -L/usr/local/sdcc/share/sdcc/lib/large SD_MMC.c > >> /usr/local/sdcc/share/sdcc/include/malloc.h:46: warning 187: ISO C90 > >> does not support flexible array members > >> sdcc --iram-size 256 --model-large --xram-size 2048 --code-size 63487 > >> --opt-code-size --profile -I/usr/local/sdcc/share/sdcc/include > >> -L/usr/local/sdcc/share/sdcc/lib/large main.rel adc.rel alarms.rel > >> bluetooth.rel dac.rel interrupt.rel timer.rel uart.rel eeprom.rel > >> temperature.rel lookup_table.rel motor.rel lonworks-compat.rel > >> velocity.rel vfd_lcd_led.rel vel_to_vol.rel pressure.rel humidity.rel > >> FAT_format_disk.rel FAT_File_System.rel String_Util.rel > >> flash_sect_serv.rel SD_MMC.rel > >> ?ASlink-Error-Could not get 4 consecutive bytes in internal RAM for area > >> OSEG. > >> ?ASlink-Error-Could not get 4 consecutive bytes in internal RAM for area > >> OSEG. > >> > >> > >> $ cat main.mem > >> Internal RAM layout: > >> 0 1 2 3 4 5 6 7 8 9 A B C D E F > >> 0x00:|0|0|0|0|0|0|0|0|1|1|1|1|1|1|1|1| > >> 0x10:|2|2|2|2|2|2|2|2|a|a|a|a|b|b|b|b| > >> 0x20:|B|B|B|B|c|c|c|c|d|d|e|e|e|e|f|f| > >> 0x30:|f|f|g|g|g|g|g|g|g|g|h|h|h|h|h|h| > >> 0x40:|h|h|h|h|h|h|i|i|i|i|i|i|i|i|j|j| > >> 0x50:|j|j|k|k|k|k|l|l|l|l|l|l|l|l|l|l| > >> 0x60:|l|l|m|m|n|n|n|n|o|o|o|o|o|p|p|q| > >> 0x70:|q|q|q|q|q|q|q|r|s|s|s|s|s|t|Q|S| > >> 0x80:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0x90:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0xa0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0xb0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0xc0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0xd0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0xe0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0xf0:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > >> 0-3:Reg Banks, T:Bit regs, a-z:Data, B:Bits, Q:Overlay, I:iData, > >> S:Stack, A:Absolute > >> > >> ERROR: Couldn't get 4 bytes allocated in internal RAM for area OSEG. > >> Stack starts at: 0x7f (sp set to 0x7e) with 129 bytes available. > >> > >> Other memory: > >> Name Start End Size Max > >> ---------------- -------- -------- -------- -------- > >> PAGED EXT. RAM 0 256 > >> EXTERNAL RAM 0x0000 0x0593 1428 2048 > >> ROM/EPROM/FLASH 0x0000 0xbdf8 48633 63487 > >> > >> > >> > >> If interested, i can post .map, .mem, .sym, .lnk. > >> > >> Am I reading the error message correctly?: There is no more overlay > >> space? I have plenty of xram where I would think variables could be > >> allocated. > >> > >> > >> Should I be using different compile/link flags? My target processor is > >> analog devices ADUC842. > >> > >> Thanks.. > >> > >> -- > >> Karl Hiramoto http://karl.hiramoto.org/ > >------------------------------------------------------------------------- >Take Surveys. Earn Cash. Influence the Future of IT >Join SourceForge.net's Techsay panel and you'll get the chance to share your >opinions on IT & business topics through brief surveys -- and earn cash >http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV >_______________________________________________ >Sdcc-user mailing list >Sdcc-user@lists.sourceforge.net >https://lists.sourceforge.net/lists/listinfo/sdcc-user ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys -- and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user