Difference between revisions of "Where do your variables stored"

From Embedded Systems Learning Academy
Jump to: navigation, search
(BSS and Data Segments)
m
 
(4 intermediate revisions by 2 users not shown)
Line 1: Line 1:
 +
 
=== BSS and Data Segments ===
 
=== BSS and Data Segments ===
 
  
 
What are text,.bss and data sections in an Embedded C program?
 
What are text,.bss and data sections in an Embedded C program?
  
Where do your program recide?Obviously memory,but how is it organized?
+
Where does your program reside? Obviously memory, but how is it organized?
  
In embedded systems ,which are RAM-memory constrained ,memory map is divided into segments
+
In embedded systems, which are RAM-memory constrained, memory map is divided into segments
called text,data and bss.
+
called text, data and bss.
 
 
 
'''Text segment:'''
 
'''Text segment:'''
Line 15: Line 15:
 
Eg1: a.out :executable code  
 
Eg1: a.out :executable code  
  
Eg2:const uint8_t i=8 :contant
+
Eg2: const uint8_t i=8 :contant
  
 
Eg3:
 
Eg3:
<pre>
+
<syntaxhighlight lang="C">
 
+
       
 
#include <stdio.h>
 
#include <stdio.h>
  
Line 30: Line 30:
 
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 55: Line 56:
 
Initialized variables are stored in this section.
 
Initialized variables are stored in this section.
  
Initially values are stored in flash and copied into RAM during execution
+
Initially, values are stored in flash and copied into RAM during execution
  
 
through copy down process.
 
through copy down process.
Line 76: Line 77:
 
 
 
'''Simple example:'''
 
'''Simple example:'''
        <pre>
+
<syntaxhighlight lang="C">
  
#include <stdio.h>
+
    #include <stdio.h>
  
 
int main(void)
 
int main(void)
Line 84: Line 85:
 
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 96: Line 100:
 
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 111: Line 115:
 
}
 
}
 
 
        </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 124: Line 129:
 
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 130: Line 136:
 
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 141: Line 147:
 
}
 
}
 
 
        </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 154: Line 160:
 
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 160: Line 166:
 
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 171: Line 177:
 
}
 
}
 
          
 
          
        </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 184: Line 190:
 
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.

Latest revision as of 02:46, 24 April 2017

BSS and Data Segments

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

Where does your program reside? 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.