Thank you Maarten and Jesus.

Maarten Brock wrote:
> Some comments,
>
> 1) Analog Devices has no datasheet for this thing on 
> their website ?!
>   
http://www.analog.com/en/prod/0%2C2877%2CADUC842%2C00.html
http://www.analog.com/UploadedFiles/Data_Sheets/ADUC841_842_843.pdf


> 2) Keil has a datasheet rev.0 from 2003 ?!
> 3) It seems that when you enable the 11-bit stack push, 
> pop, call & ret will work just fine. But when accessing 
> parameters, local variables & temporaries on stack SDCC 
> uses @Ri indexing. So when stack has rolled over into 
> xram, it will access the wrong data! I do not recommend 
> to use this option unless you're willing to adapt SDCC 
> itself at several places!
>   
Thanks for the insight.

> 4) If you're really afraid the 8 bit stack will overflow 
> (have you checked how much it uses now?) you can even go 
> to --xstack. This will build a software stack in pdata 
> (movX @Ri) for parameters and local variables. The 
> hardware stack will only be used for push, pop, call & 
> ret and for temporaries.
>   
An 8 bit xstack sounds good.   I just tried recompiling my project with
--model-large  --opt-code-size --stack-auto --xstack and my
ROM/EPROM/FLASH went from 45K to  65K (more than my target has)  and i
still have a lot of code i need to try and fit in the target.

> 5) There are no near term improvements to be expected on 
> the use or location of temporaries.
> 6) Breaking up large function into smaller ones might 
> help.
> 7) I do not recommend to try to reduce stack usage. I 
> think it will make things worse.
> 8) It's a very good idea to see if the interrupts 
> actually use the registers in the bank you reserved for 
> them. A good ISR is short and simple with no function 
> calls and therefor may not need any register at all.
>
> Greets,
> Maarten
>
>   
>> 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

Reply via email to