Difference between revisions of "Where do your variables stored"
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...") |
Proj user12 (talk | contribs) m |
||
(7 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 | + | 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. | + | 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. | + | '''Text segment:''' |
+ | |||
+ | Contains code and constants of the program.Text section is allocated on flash. | ||
+ | |||
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: | ||
− | + | <syntaxhighlight lang="C"> | |
+ | |||
#include <stdio.h> | #include <stdio.h> | ||
+ | |||
const int global_var=20; | const int global_var=20; | ||
+ | |||
int data_variable = 500; | int data_variable = 500; | ||
+ | |||
static int static_var=10; | static int static_var=10; | ||
− | void foo(){ | + | |
− | + | 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); | ||
} | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
− | 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 | + | 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. | + | '''Data segment:''' |
− | Initially values are stored in flash and copied into RAM during execution | + | |
+ | Initialized variables are stored in this section. | ||
+ | |||
+ | Initially, values are stored in flash and copied into RAM during execution | ||
+ | |||
through copy down process. | through copy down process. | ||
− | Eg: uint8_t j=10; initialized variable | + | 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 | + | 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. | + | '''.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. | 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) | (wiki :https://en.wikipedia.org/wiki/.bss#BSS_in_C) | ||
Eg:int newvar; | Eg:int newvar; | ||
− | In the above code | + | In the above code un-initialized(after initializing it to zero) and another_initialized are stored in bss section ; |
− | Simple example: | + | '''Simple example:''' |
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | #include <stdio.h> | ||
− | |||
int main(void) | int main(void) | ||
{ | { | ||
return 0; | return 0; | ||
} | } | ||
− | + | ||
− | + | </syntaxhighlight> | |
+ | |||
+ | Memory occupied by the above program: | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | |||
$ gcc -o just_main just_main.c | $ gcc -o just_main just_main.c | ||
+ | |||
$ size just_main.exe | $ size just_main.exe | ||
+ | |||
text data bss dec hex filename | text data bss dec hex filename | ||
3153 1976 448 5577 15c9 just_main.exe | 3153 1976 448 5577 15c9 just_main.exe | ||
− | + | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | After modifying the above program with one global variable: | ||
− | + | <syntaxhighlight lang="C"> | |
+ | |||
+ | #include <stdio.h> | ||
+ | |||
int global_var; | int global_var; | ||
+ | |||
int main(void) | int main(void) | ||
{ | { | ||
Line 69: | Line 115: | ||
} | } | ||
− | + | </syntaxhighlight> | |
+ | |||
+ | |||
+ | Memory map of the above program looks like: | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
+ | $ gcc -o just_main just_main.c | ||
+ | |||
$ size just_main.exe | $ size just_main.exe | ||
+ | |||
text data bss dec hex filename | text data bss dec hex filename | ||
3153 1976 464 5593 15d9 just_main.exe | 3153 1976 464 5593 15d9 just_main.exe | ||
− | + | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | bss section is increased by 2 bytes; | ||
− | + | Modify the above program with global variable initialized to zero; | |
− | + | <syntaxhighlight lang="C"> | |
+ | |||
+ | #include <stdio.h> | ||
+ | |||
int global_var=0; | int global_var=0; | ||
+ | |||
int main(void) | int main(void) | ||
{ | { | ||
Line 84: | Line 147: | ||
} | } | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Data and bss segments occupy the RAM area as below. | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
$ gcc -o just_main just_main.c | $ gcc -o just_main just_main.c | ||
+ | |||
$ size just_main.exe | $ size just_main.exe | ||
+ | |||
text data bss dec hex filename | text data bss dec hex filename | ||
3153 1976 480 5609 15e9 just_main.exe | 3153 1976 480 5609 15e9 just_main.exe | ||
− | + | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | bss segment is increased by 32 bits(4 bytes) | ||
− | + | Modify the above program with global variable initialized to non-zero; | |
− | + | <syntaxhighlight lang="C"> | |
+ | |||
+ | #include <stdio.h> | ||
+ | |||
int global_var=8; | int global_var=8; | ||
+ | |||
int main(void) | int main(void) | ||
{ | { | ||
return 0; | return 0; | ||
} | } | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | RAM memory is occupied by bss and data as below | ||
+ | |||
+ | <syntaxhighlight lang="C"> | ||
+ | |||
$ gcc -o just_main just_main | $ gcc -o just_main just_main | ||
+ | |||
$ size just_main.exe | $ size just_main.exe | ||
+ | |||
text data bss dec hex filename | text data bss dec hex filename | ||
3153 1976 448 5577 15c9 just_main.exe | 3153 1976 448 5577 15c9 just_main.exe | ||
− | + | ||
+ | |||
+ | </syntaxhighlight> | ||
+ | |||
+ | bss section is not modified. | ||
Line 112: | Line 203: | ||
What is the amount of RAM being used? | What is the amount of RAM being used? | ||
Memory occupied by bss and data segments added together. | Memory occupied by bss and data segments added together. | ||
− | |||
− |
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.