March Madness - Arduino Memory Usage |
This program displays the memory map of the machine. This sample was run on a 644P (Sanguino) which has a total of 4K ram.
A very good reference for this is AVR LibC manual
CPU USAGE +----------------+ __data_start =256 + data + + variables + data_size =540 + + +----------------+ __data_end =796 +----------------+ __bss_start =796 + bss + + variables + bss_size =315 + + +----------------+ __bss_end =1111 +----------------+ __heap_start =1111 + + + heap + heap_size =2427 + + +----------------+ heap_end =3538 +----------------+ Current STACK =4317 + + + stack + stack_size =35 + + +----------------+ RAMEND =4351 available =779 Free memory3233 |
||
|
|
||
//************************************************************************
//* http://www.nongnu.org/avr-libc/user-manual/malloc.html
//* thanks to John O for the pointer to this info and the insperation to do it
void Ram_TableDisplay(void)
{
char stack = 1;
extern char *__data_start;
extern char *__data_end;
extern char *__bss_start;
extern char *__bss_end;
//extern char *__brkval;
extern char *__heap_start;
extern char *__heap_end;
//extern char *__malloc_heap_end;
//extern size_t __malloc_margin;
int data_size = (int)&__data_end - (int)&__data_start;
int bss_size = (int)&__bss_end - (int)&__data_end;
int heap_end = (int)&stack - (int)&__malloc_margin;
// int heap_size = (int)__brkval - (int)&__bss_end;
int heap_size = heap_end - (int)&__bss_end;
int stack_size = RAMEND - (int)&stack + 1;
int available = (RAMEND - (int)&__data_start + 1);
available -= data_size + bss_size + heap_size + stack_size;
Serial.print("+----------------+ __data_start ="); Serial.println((int)&__data_start);
Serial.print("+ data +"); Serial.println();
Serial.print("+ variables + data_size ="); Serial.println(data_size);
Serial.print("+ +"); Serial.println();
Serial.print("+----------------+ __data_end ="); Serial.println((int)&__data_end);
Serial.print("+----------------+ __bss_start ="); Serial.println((int)&__bss_start);
Serial.print("+ bss +"); Serial.println();
Serial.print("+ variables + bss_size ="); Serial.println(bss_size);
Serial.print("+ +"); Serial.println();
Serial.print("+----------------+ __bss_end ="); Serial.println((int)&__bss_end);
Serial.print("+----------------+ __heap_start ="); Serial.println((int)&__heap_start);
Serial.print("+ +"); Serial.println();
Serial.print("+ heap + heap_size ="); Serial.println(heap_size);
Serial.print("+ +"); Serial.println();
Serial.print("+----------------+ heap_end ="); Serial.println(heap_end);
Serial.print("+----------------+ Current STACK ="); Serial.println((int)&stack);
Serial.print("+ +"); Serial.println();
Serial.print("+ stack + stack_size ="); Serial.println(stack_size);
Serial.print("+ +"); Serial.println();
Serial.print("+----------------+ RAMEND ="); Serial.println(RAMEND);
// Serial.print("__brkval =");
// Serial.println((int)__brkval);
Serial.print("available =");
Serial.println(available);
Serial.println();
Serial.println();
}
int get_free_memory()
{
extern char __bss_end;
extern char *__brkval;
int free_memory;
if((int)__brkval == 0)
free_memory = ((int)&free_memory) - ((int)&__bss_end);
else
free_memory = ((int)&free_memory) - ((int)__brkval);
return free_memory;
}
//************************************************************************
void setup()
{
Serial.begin(9600);
Serial.println("CPU USAGE");
Ram_TableDisplay();
Serial.println();
Serial.print("Free memory");
Serial.println(get_free_memory());
}
//************************************************************************
void loop()
{
}
| ||