struct __freelist {
size_t size;
struct __freelist *next;
};
extern uint16_t *__brkval;
extern struct __freelist *__flp;
extern uint16_t __heap_start;
extern uint16_t __data_start;
extern uint16_t __bss_start;
extern uint16_t __bss_end;
void show_allocator() {
if(__flp == 0) {
Serial.println("There is no freelist.");
} else {
Serial.print("The freelist starts at 0x");
Serial.println((uint16_t)__flp, HEX);
}
if(__brkval == 0) {
Serial.println("No memory has been allocated yet");
Serial.print("The heap starts at 0x");
Serial.println((uint16_t)&__heap_start,HEX);
} else {
Serial.print("The current end of heap is at 0x");
Serial.println((uint16_t)__brkval, HEX);
}
Serial.println();
}
void setup() {
Serial.begin(9600);
Serial.print(".data section starts at 0x");
Serial.println((uint16_t)&__data_start, HEX);
Serial.print(".bss section starts at 0x");
Serial.println((uint16_t)&__bss_start, HEX);
Serial.print("Together, they take up ");
Serial.print((uint16_t)&__bss_end - (uint16_t)&__data_start);
Serial.println(" bytes of memory\n");
show_allocator();
Serial.println("allocate 4 bytes");
uint32_t* ptr = malloc(4);
Serial.print("allocated block address = 0x");
Serial.println((uint16_t)ptr, HEX);
show_allocator();
Serial.println("allocate 8 bytes");
uint16_t* ptr2 = malloc(8);
Serial.print("allocated block address = 0x");
Serial.println((uint16_t)ptr2, HEX);
show_allocator();
Serial.println("free the first block (4 bytes)");
free(ptr);
show_allocator();
Serial.println("free the second block (8 bytes)");
free(ptr2);
show_allocator();
}
void loop() {
// put your main code here, to run repeatedly:
}