Difference between revisions of "Where do your variables stored"

From Embedded Systems Learning Academy
Jump to: navigation, search
(BSS and Data Segments)
(BSS and Data Segments)
Line 17: Line 17:
  
 
Eg3:
 
Eg3:
<pre>
+
<syntaxhighlight lang="C">
 
          
 
          
 
#include <stdio.h>
 
#include <stdio.h>
Line 29: Line 29:
 
void foo()
 
void foo()
 
         {
 
         {
  const int local_constant=100;
+
          const int local_constant=100;
  
          int local;
+
          int local;
 
 
 
 
          local = 3;
+
          local = 3;
  
          int un-initialized;
+
          int un-initialized;
 +
         
 +
          int another-initialized=0;
 +
         
 +
          static int local_static=9;
  
  int another-initialized=0;
+
          local_static++;
 +
          printf("local varaible is %d\n", local);
 +
}
 +
       
 +
</syntaxhighlight>
  
  static int local_static=9;
 
 
  local_static++;
 
 
  printf("local varaible is %d\n", local);
 
}
 
        </pre>
 
 
 
 
In the above example, executable code of the program is stored in flash and const variable global_var=20  
 
In the above example, executable code of the program is stored in flash and const variable global_var=20  
Line 75: Line 76:
 
 
 
'''Simple example:'''
 
'''Simple example:'''
        <pre>
+
<syntaxhighlight lang="C">
  
#include <stdio.h>
+
    #include <stdio.h>
  
 
int main(void)
 
int main(void)
Line 83: Line 84:
 
return 0;
 
return 0;
 
}
 
}
       </pre>
+
        
 +
</syntaxhighlight>
  
 
Memory occupied by the above program:
 
Memory occupied by the above program:
+
 
        <pre>
+
<syntaxhighlight lang="C">
 +
 
 +
       
 
$ gcc -o just_main just_main.c
 
$ gcc -o just_main just_main.c
  
Line 95: Line 99:
 
3153    1976    448    5577    15c9 just_main.exe
 
3153    1976    448    5577    15c9 just_main.exe
 
          
 
          
        </pre>
+
</syntaxhighlight>
  
 
After modifying the above program with one global variable:
 
After modifying the above program with one global variable:
 
 
        <pre>
+
<syntaxhighlight lang="C">
  
#include <stdio.h>
+
    #include <stdio.h>
  
 
int global_var;
 
int global_var;
Line 110: Line 114:
 
}
 
}
 
 
        </pre>
+
</syntaxhighlight>
 +
 
  
 
Memory map of the above program looks like:
 
Memory map of the above program looks like:
 +
       
 +
<syntaxhighlight lang="C">
  
        <pre>
+
      $ gcc -o just_main just_main.c
 
 
$ gcc -o just_main just_main.c
 
  
 
$ size just_main.exe
 
$ size just_main.exe
Line 123: Line 128:
 
3153    1976    464    5593    15d9 just_main.exe
 
3153    1976    464    5593    15d9 just_main.exe
 
          
 
          
         </pre>
+
          
 +
</syntaxhighlight>
  
 
bss section is increased by 2 bytes;
 
bss section is increased by 2 bytes;
Line 129: Line 135:
 
Modify the above program with global variable initialized to zero;
 
Modify the above program with global variable initialized to zero;
 
 
        <pre>
+
<syntaxhighlight lang="C">
  
#include <stdio.h>
+
    #include <stdio.h>
  
 
int global_var=0;
 
int global_var=0;
Line 140: Line 146:
 
}
 
}
 
 
        </pre>
+
</syntaxhighlight>
 
          
 
          
 
Data and bss segments occupy the RAM area as below.
 
Data and bss segments occupy the RAM area as below.
  
         <pre>
+
         <syntaxhighlight lang="C">
  
 
$ gcc -o just_main just_main.c
 
$ gcc -o just_main just_main.c
Line 153: Line 159:
 
3153    1976    480    5609    15e9 just_main.exe
 
3153    1976    480    5609    15e9 just_main.exe
  
         </pre>
+
         </syntaxhighlight>
  
 
bss segment is increased by 32 bits(4 bytes)
 
bss segment is increased by 32 bits(4 bytes)
Line 159: Line 165:
 
Modify the above program with global variable initialized to non-zero;
 
Modify the above program with global variable initialized to non-zero;
 
 
        <pre>
+
<syntaxhighlight lang="C">
  
#include <stdio.h>
+
      #include <stdio.h>
  
 
int global_var=8;
 
int global_var=8;
Line 170: Line 176:
 
}
 
}
 
          
 
          
        </pre>
+
</syntaxhighlight>
  
 
RAM memory is occupied by bss and data as below
 
RAM memory is occupied by bss and data as below
  
        <pre>
+
<syntaxhighlight lang="C">
 
          
 
          
 
$ gcc -o just_main just_main
 
$ gcc -o just_main just_main
Line 183: Line 189:
 
3153    1976    448    5577    15c9 just_main.exe
 
3153    1976    448    5577    15c9 just_main.exe
  
        </pre>
+
 +
</syntaxhighlight>
  
 
bss section is not modified.
 
bss section is not modified.

Revision as of 02:28, 19 December 2016

BSS and Data Segments

What are text,.bss and data sections in an Embedded C program?

Where do your program recide?Obviously memory,but how is it organized?

In embedded systems ,which are RAM-memory constrained ,memory map is divided into segments called text,data and bss.

Text segment:

Contains code and constants of the program.Text section is allocated on flash.

Eg1: a.out :executable code

Eg2:const uint8_t i=8 :contant

Eg3:

        
	#include <stdio.h>

	const int global_var=20;

	int data_variable = 500;

	static int static_var=10;

	void foo()
        {
          const int local_constant=100;	

          int local;
	 
          local = 3;

          int un-initialized;
          
          int another-initialized=0;
          
          static int local_static=9;

          local_static++;
          printf("local varaible is %d\n", local);
	}


In the above example, executable code of the program is stored in flash and const variable global_var=20 and local_constant=100 are stored in text segment.

Data segment:

Initialized variables are stored in this section.

Initially values are stored in flash and copied into RAM during execution

through copy down process.

Eg: uint8_t j=10; --------initialized variable

In the code given above int data_variable = 500,static int static_var=10,local = 3, and local_static=9 are stored in data segment.

.bss segment:

Uninitialized variables are stored in bss section.

In embedded software, the bss segment is mapped into memory that is initialized to zero by the C run-time system before main() is entered.

(wiki :https://en.wikipedia.org/wiki/.bss#BSS_in_C)

Eg:int newvar;

In the above code un-initialized(after initializing it to zero) and another_initialized are stored in bss section ;

Simple example:

    #include <stdio.h>

	int main(void)
	{
		return 0;
	}

Memory occupied by the above program:

        
	$ gcc -o just_main just_main.c

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     448    5577    15c9 just_main.exe

After modifying the above program with one global variable:

     #include <stdio.h>

	int global_var;

	int main(void)
	{
		return 0;
	}


Memory map of the above program looks like:

      $ gcc -o just_main just_main.c

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     464    5593    15d9 just_main.exe

bss section is increased by 2 bytes;

Modify the above program with global variable initialized to zero;

     #include <stdio.h>

	int global_var=0;

	int main(void)
	{
		return 0;
	}

Data and bss segments occupy the RAM area as below.

	$ gcc -o just_main just_main.c

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     480    5609    15e9 just_main.exe

bss segment is increased by 32 bits(4 bytes)

Modify the above program with global variable initialized to non-zero;

      #include <stdio.h>

	int global_var=8;

	int main(void)
	{
		return 0;
	}

RAM memory is occupied by bss and data as below

        
	$ gcc -o just_main just_main

	$ size just_main.exe

	text    data     bss     dec     hex filename
	3153    1976     448    5577    15c9 just_main.exe

bss section is not modified.


FAQ: What is the size of bss segment? bss does not take any space in the object file and stores the count of variables that can be given initial values.Hence occupy 4 or 8 bytes depending on the implementation.

What is the amount of RAM being used? Memory occupied by bss and data segments added together.