Hello Maarten,
I would never have thought of that approach, so thanks.
I rewrote my sample, to define the global variables in separate header files,
and it still left the gap. Then I added separate >source< files with the
corresponding headers, and the gap was filled in.
Sample code:
// three header files are empty, no text at all, but must exist
// three source files with the global variable definitions
// source file, ram_test1.c
char oneChar1[16];
// source file, ram_test2.c
__bit oneBit = 0;
// source file, ram_test3.c
char oneChar2[16];
// main file, ram_test.c
#include <8052.h>
#include "ram_test1.h"
#include "ram_test2.h"
#include "ram_test3.h"
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 sample code
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|Q|Q| | | | | | |
0x20:|B|b|b|b|b|b|b|b|b|b|b|b|b|b|b|b|
0x30:|b|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|
Very nice!
Thanks again, Rich.
--- On Fri, 10/26/12, Maarten Brock <[email protected]> wrote:
> From: Maarten Brock <[email protected]>
> Subject: Re: [Sdcc-user] data ram layout, unused gap before a bit variable
> To: [email protected]
> Date: Friday, October 26, 2012, 3:37 PM
> 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
> [email protected]
> https://lists.sourceforge.net/lists/listinfo/sdcc-user
>
------------------------------------------------------------------------------
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
[email protected]
https://lists.sourceforge.net/lists/listinfo/sdcc-user