Where do your variables stored

From Embedded Systems Learning Academy
Revision as of 21:11, 10 December 2016 by Proj user16 (talk | contribs) (Created page with "=== BSS and Data Segments === <pre> 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...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

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 flash.
	
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 of flash.
	
.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;
	}
	
	$ 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;
	}
	
	$ 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;
	}
	$ 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.