#define DEBUG 1
extern "C"
{
#include "memdebug.h"
}
void shuffle(void **array, int n);
void showmem();
void dotest(bool shuffle);
// Compatibility stub for undefined pure virtual
extern "C" void __cxa_pure_virtual() { for(;;); }
void dotest(bool shuffle_)
{
void *ptrs[20];
uint16_t i;
Serial.println("allocating");
showmem();
for(i=0;i<sizeof(ptrs)/sizeof(ptrs[0]);i++)
{
ptrs[i]=malloc(20);
showmem();
}
if(shuffle_)
shuffle(ptrs,sizeof(ptrs)/sizeof(ptrs[0]));
Serial.println("freeing");
for(i=0;i<sizeof(ptrs)/sizeof(ptrs[0]);i++)
{
free(ptrs[i]);
showmem();
}
}
void showmem()
{
char buffer[100];
sprintf(buffer,"%04u %04u %04u : used/free/large",
getMemoryUsed(),
getFreeMemory(),
getLargestAvailableMemoryBlock());
Serial.println(buffer);
}
int rand_int(int n)
{
int limit = RAND_MAX - RAND_MAX % n;
int rnd;
do
{
rnd = rand();
} while (rnd >= limit);
return rnd % n;
}
void shuffle(void **array, int n)
{
int i, j;
void *tmp;
for (i = n - 1; i > 0; i--)
{
j = rand_int(i + 1);
tmp = array[j];
array[j] = array[i];
array[i] = tmp;
}
}
void setup()
{
Serial.begin(9600);
dotest(false);
dotest(true);
}
void loop()
{
}
/*
int freeRam()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
void setup()
{
Serial.begin(9600);
Serial.println(freeRam(),DEC);
}
void loop()
{
}
*/