Hi Rich, The variables from each source file are placed either in the overlay or data segment. But they are only subdivided by file, not by function or even variable. And arrays or structs of course cannot be subdivided at all. So the whole block of all variables from one source file is placed in one block of memory. And if it doesn't fit before the bit area it has the come after. But the block from the next source file (or the overlay block) can fill the gap. If you have many source files with few variables, you'll find everything filled up. OTOH if you put all variables in one file it's unlikely to come before the bits. And the bits can only use the area from 0x20-0x2F. When there are no bits used then the memory space is not split.
Maarten > Hello Sdcc users, > > I've been using sdcc for a year or two, thanks to all the developers for > the sdcc project. > > I'm writing to ask for help understanding how to manage ram usage with the > mcu8051. I've read over the sdcc manual several times and have searched > through the mailing list history. I'm hoping that someone can point me in > the right direction. > > The issue is that with a __bit variable defined, and several dozen __data > variables defined, there is a large gap of unused ram between the register > bank and the bit variable. > > I'm sure I could force usage of the unused ram locations by using absolute > '__at' addresses, but perhaps there's a way for sdcc to manage the ram > layout automatically. > > Here is some sample code. This sample includes a function to demonstrate > overlay variables, which is shown in the memory map. Take out the > function and you'll get the same results. I included the function to show > that overlay variables work nicely. > > // start of code sample > // SDCC : mcs51/gbz80/z80/z180/r2k/r3ka/ds390 > // /pic16/pic14/TININative/ds400/hc08/s08 > // 3.2.0 #8008 (Jul 6 2012) (MINGW32) > #include <8052.h> > > char oneChar1[24]; > char oneChar2; > > __bit oneBit = 0; > > void delay(int jj, int kk) > { > int j; > int k; > for(k=0; k < kk; k++) { > for(j=0; j < jj; j++) { > } > } > } > > void main(void) > { > > while(1) { > delay(100,200); > } > } > // end of code sample > > Here is a portion of the memory map, showing the large gap of unused data > ram: > > 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|Q|Q| | | | | | | > 0x10:| | | | | | | | | | | | | | | | | > 0x20:|B|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a| > 0x30:|a|a|a|a|a|a|a|a|a|a|S|S|S|S|S|S| > > Comment out the __bit variable and this is the memory map that results. > You can see the __data variables start right after register bank 0, > followed by the QQ overlay variables. > > 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|a|a|a|a|a|a|a|a| > 0x10:|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a| > 0x20:|a|Q|Q|S|S|S|S|S|S|S|S|S|S|S|S|S| > 0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > > Restore the __ bit variable and comment out the 'char oneChar2' variable > and you get this memory map, showing the __bit variable between the __data > variables and the overlay variables. > > 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|a|a|a|a|a|a|a|a| > 0x10:|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a|a| > 0x20:|B|Q|Q|S|S|S|S|S|S|S|S|S|S|S|S|S| > 0x30:|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S| > > Hope all this makes sense. > > Thanks for your time, > Rich. ------------------------------------------------------------------------------ WINDOWS 8 is here. Millions of people. Your app in 30 days. Visit The Windows 8 Center at Sourceforge for all your go to resources. http://windows8center.sourceforge.net/ join-generation-app-and-make-money-coding-fast/ _______________________________________________ Sdcc-user mailing list Sdcc-user@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/sdcc-user