Cool that it can sm_alloc from multiple pools! There is a text label error in setup where simple.ino showed 't2' for this 't1':
Code:
Serial.printf("t1 address: %p, value: %s\n", t1, t1);
<edit>
>> CHEAT below since the EXTMEM size isn't known at compile time - I compile alloc 8MB and double when there is 16MB of EXTMEM - could have done 16MB and limited to 8MB - the other way?
Allocs are too big for ALL to work with only 8MB EXTMEM - but it seems to run right.
That means we could sm_alloc() from the trapped ITCM block where it could be 1KB to 31KB in size!
Wondered about that, but didn't look at the code. Wrote this to do some random alloc/free and it seems to be running about 9 hours:
Code:
T:\tCode\libraries\static_malloc\examples\SimplePlus\simpleplus.ino Oct 11 2020 03:24:29
PSRAM size =16 MB
f1 address: 0x700000d8, value: 3.141593
f2 address: 0x700007d4, value: 1.414214
t2 address: 0x70000750, value: This is a text
----------------------------
f3 address: 0x700000d8, value: 42.000000
f2 address: 0x700007d4, value: 1.414214
t2 address: 0x70000750, value: This is a text
0 address: 0x708e5030 size: 0x40000
5 address: 0x70174f0c size: 0x10000
1 address: 0x70925050 size: 0x20000
>>> 0 FREE add: 0x708e5030 7 address: 0x7094506c size: 0x70000
>>> 1 FREE add: 0x70925050 4 address: 0x708e5030 size: 0x50000
6 address: 0x709b508c size: 0x50000
0 address: 0x70a050a8 size: 0x50000
9 address: 0x70a550c4 size: 0x60000
>>> 4 FREE add: 0x708e5030 4 address: 0x708e5030 size: 0x30000
3 address: 0x70ab50dc size: 0x40000
>>> 4 FREE add: 0x708e5030 >>> 7 FREE add: 0x7094506c 1 address: 0x708e5030 size: 0x30000
7 address: 0x70915048 size: 0x60000
>>> 9 FREE add: 0x70a550c4 >>> 0 FREE add: 0x70a050a8 >>> 1 FREE add: 0x708e5030 4 address: 0x70a050a8 size: 0x70000
>>> 4 FREE add: 0x70a050a8 >>> 6 FREE add: 0x709b508c 1 address: 0x70975060 size: 0x50000
0 address: 0x709c507c size: 0x70000
2 address: 0x708e5030 size: 0x10000
>>> 7 FREE add: 0x70915048 7 address: 0x708f5050 size: 0x70000
>>> 0 FREE add: 0x709c507c >>> 7 FREE add: 0x708f5050 >>> 2 FREE add: 0x708e5030 8 address: 0x708e5030 size: 0x70000
6 address: 0x709c507c size: 0x50000
4 address: 0x70a15098 size: 0x50000
>>> 5 FREE add: 0x70174f0c >>> 4 FREE add: 0x70a15098 9 address: 0x70a15098 size: 0x60000
7 address: 0x70af50fc size: 0x50000
>>> 6 FREE add: 0x709c507c >>> 8 FREE add: 0x708e5030 >>> 7 FREE add: 0x70af50fc 5 address: 0x708e5030 size: 0x50000
8 address: 0x709c507c size: 0x40000
>>> 1 FREE add: 0x70975060 6 address: 0x7093504c size: 0x80000
>>> 3 FREE add: 0x70ab50dc >>> 9 FREE add: 0x70a15098 2 address: 0x70174f0c size: 0x10000
1 address: 0x70a0509c size: 0x80000
>>> 2 FREE add: 0x70174f0c 2 address: 0x70a850b8 size: 0x50000
>>> 5 FREE add: 0x708e5030 3 address: 0x708e5030 size: 0x20000
>>> 6 FREE add: 0x7093504c 4 address: 0x7090504c size: 0x80000
6 address: 0x70ad50d4 size: 0x80000
9 address: 0x70b550f0 size: 0x60000
>>> 3 FREE add: 0x708e5030 >>> 8 FREE add: 0x709c507c 3 address: 0x70985068 size: 0x70000
>>> 3 FREE add: 0x70985068 >>> 9 FREE add: 0x70b550f0 0 address: 0x70174f0c size: 0x10000
9 address: 0x70985068 size: 0x60000
5 address: 0x70b550f0 size: 0x70000
>>> 2 FREE add: 0x70a850b8 >>> 5 FREE add: 0x70b550f0 >>> 6 FREE add: 0x70ad50d4 >>> 9 FREE add: 0x70985068 >>> 4 FREE add: 0x7090504c 5 address: 0x708e5030 size: 0x10000
7 address: 0x708f5050 size: 0x60000
4 address: 0x70955068 size: 0x20000
9 address: 0x70975084 size: 0x70000
8 address: 0x70a850b8 size: 0x30000
6 address: 0x70ab50d0 size: 0x80000
>>> 7 FREE add: 0x708f5050 >>> 1 FREE add: 0x70a0509c >>> 5 FREE add: 0x708e5030 >>> 6 FREE add: 0x70ab50d0 >>> 4 FREE add: 0x70955068 >>> 0 FREE add: 0x70174f0c >>> 9 FREE add: 0x70975084 2 address: 0x70174f0c size: 0x10000
4 address: 0x708e5030 size: 0x30000
5 address: 0x70915048 size: 0x60000
>>> 2 FREE add: 0x70174f0c 3 address: 0x70975060 size: 0x80000
7 address: 0x709f507c size: 0x70000
>>> 5 FREE add: 0x70915048 0 address: 0x70ab50d0 size: 0x80000
>>> 4 FREE add: 0x708e5030 5 address: 0x708e5030 size: 0x40000
>>> 7 FREE add: 0x709f507c 1 address: 0x709f507c size: 0x60000
>>> 5 FREE add: 0x708e5030 >>> 3 FREE add: 0x70975060 7 address: 0x708e5030 size: 0x30000
>>> 1 FREE add: 0x709f507c 5 address: 0x70915048 size: 0x70000
>>> 0 FREE add: 0x70ab50d0 >>> 5 FREE add: 0x70915048 >>> 7 FREE add: 0x708e5030 >>> 8 FREE add: 0x70a850b8
0 Alloc 512B at address: 0x70000750
1 Alloc 512B at address: 0x7000AC44
2 Alloc 512B at address: 0x7000B07C
3 Alloc 512B at address: 0x7000BD24
4 Alloc 512B at address: 0x7000C15C
5 Alloc 512B at address: 0x7000C378
6 Alloc 512B at address: 0x7000C594
7 Alloc 512B at address: 0x7000CE04
8 Alloc 512B at address: 0x7000D020
9 Alloc 512B at address: 0x7000D23C
>>> 1 FREE add: 0x7000ac44 1 address: 0x708e5030 size: 0x60000
>>> 4 FREE add: 0x7000c15c >>> 5 FREE add: 0x7000c378 >>> 8 FREE add: 0x7000d020 >>> 7 FREE add: 0x7000ce04 >>> 2 FREE add: 0x7000b07c 4 address: 0x70945048 size: 0x40000
5 address: 0x70985068 size: 0x60000
>>> 6 FREE add: 0x7000c594 8 address: 0x709e5080 size: 0x60000
>>> 1 FREE add: 0x708e5030 6 address: 0x708e5030 size: 0x50000
>>> 3 FREE add: 0x7000bd24 >>> 8 FREE add: 0x709e5080 >>> 0 FREE add: 0x70000750 7 address: 0x709e5080 size: 0x30000...
With reservation for 10 alloc pointers loop() picks one if nullptr it allocs, if not it frees. Every hundred loop()'s all are set free() - and alloc()'d - 2 sec pause - and repeats with a 1 sec pause every 10 loops, so net 10 alloc or free every second for 9 hours.
The updated 'SimplePlus.ino' - where any Serial USB inout causes a PAUSE until more Serial input is sent:
Code:
#include "static_malloc.h"
// reserve some space for sm_malloc. sm_malloc will never overwrite this buffer
// You can generate the buffer wherever you want. I.e. in normal DTCM Memory, on the external RAM chip (EXTMEM) etc.
extern uint8_t external_psram_size;
constexpr size_t myHeapSize = 1024 * 1024 * 8;
EXTMEM uint8_t myHeap[myHeapSize];
void* someAllocs[10];
void setup()
{
// sm_set_default_pool(myHeap, myHeapSize, 0, nullptr);
// CHEAT
if ( external_psram_size == 8 )
sm_set_default_pool(myHeap, myHeapSize, 0, nullptr);
else
sm_set_default_pool(myHeap, 2 * myHeapSize, 0, nullptr);
while ( !Serial && millis() < 4000 );
Serial.println("\n" __FILE__ " " __DATE__ " " __TIME__);
Serial.printf( "PSRAM size =%d MB\n", external_psram_size );
float* f1 = (float*)sm_malloc(sizeof(float)); // allocate a float
char* t1 = (char*)sm_malloc(100); // allocate a 100 byte cstring
float* f2 = (float*)sm_malloc(sizeof(float)); // another float
*f1 = M_PI;
*f2 = M_SQRT2;
snprintf(t1, 100, "This is a text");
Serial.printf("f1 address: %p, value: %f\n", f1, *f1);
Serial.printf("f2 address: %p, value: %f\n", f2, *f2);
Serial.printf("t2 address: %p, value: %s\n", t1, t1);
Serial.println("----------------------------\n");
sm_free(f1);
float* f3 = (float*)sm_malloc(sizeof(float)); // allocate a float
*f3 = 42;
Serial.printf("f3 address: %p, value: %f\n", f3, *f3); // should get the same address as f1 had
Serial.printf("f2 address: %p, value: %f\n", f2, *f2);
Serial.printf("t1 address: %p, value: %s\n", t1, t1);
sm_free(t1);
sm_free(f3);
sm_free(f2);
for ( int ii = 0; ii < 10; ii++ ) someAllocs[ii] = nullptr;
}
uint32_t lCnt = 0;
void loop()
{
uint32_t ii = random(10);
lCnt++;
if ( nullptr != someAllocs[ii] ) {
sm_free(someAllocs[ii]);
Serial.printf(" >>> %ld FREE add: %p\t", ii, someAllocs[ii]);
someAllocs[ii] = nullptr;
}
else {
uint32_t jj = 1024 * 64 * random(1, 8);
someAllocs[ii] = sm_malloc( jj );
Serial.printf("%ld address: %p size: 0x%X\n", ii, someAllocs[ii], jj );
}
if ( !(lCnt % 100) ) {
for ( ii = 0; ii < 10; ii++ ) {
if ( nullptr != someAllocs[ii] ) {
sm_free(someAllocs[ii]);
Serial.printf(" >>> %ld FREE add: %p\t", ii, someAllocs[ii]);
someAllocs[ii] = nullptr;
}
}
Serial.print('\n');
for ( ii = 0; ii < 10; ii++ ) {
someAllocs[ii] = sm_malloc( 512 );
Serial.printf("\t %ld Alloc 512B at address: 0x%X \n", ii, someAllocs[ii] );
}
Serial.print('\n');
delay(2000);
}
if ( !(lCnt % 10) )
delay(1000);
if ( Serial.available() ) {
while ( Serial.available() ) Serial.read();
Serial.print(" ... PAUSED ... \n");
while ( !Serial.available() ) delay(10);
while ( Serial.available() ) Serial.read();
}
}
Here are the last two runs of 100 after 9 hours:
Code:
9 Alloc 512B at address: 0x7000E100
>>> 8 FREE add: 0x7000dee4 >>> 1 FREE add: 0x7000ac44 >>> 6 FREE add: 0x7000daac >>> 2 FREE add: 0x7000c15c >>> 3 FREE add: 0x7000c378 >>> 4 FREE add: 0x7000ce04 8 address: 0x70995064 size: 0x30000
>>> 9 FREE add: 0x7000e100 9 address: 0x709c507c size: 0x70000
3 address: 0x70a3509c size: 0x70000
4 address: 0x70aa50bc size: 0x50000
>>> 8 FREE add: 0x70995064 >>> 0 FREE add: 0x70000750 >>> 4 FREE add: 0x70aa50bc 1 address: 0x70995064 size: 0x20000
>>> 3 FREE add: 0x70a3509c 8 address: 0x70a3509c size: 0x20000
4 address: 0x70a550b8 size: 0x30000
>>> 4 FREE add: 0x70a550b8 0 address: 0x70a550b8 size: 0x20000
>>> 1 FREE add: 0x70995064 >>> 8 FREE add: 0x70a3509c 6 address: 0x70995064 size: 0x20000
>>> 0 FREE add: 0x70a550b8 >>> 7 FREE add: 0x7000dcc8 4 address: 0x70a3509c size: 0x50000
>>> 5 FREE add: 0x7000d458 8 address: 0x70a850b8 size: 0x70000
7 address: 0x70af50d8 size: 0x20000
5 address: 0x70b150f4 size: 0x70000
>>> 7 FREE add: 0x70af50d8 7 address: 0x70b85114 size: 0x70000
3 address: 0x70bf5134 size: 0x60000
>>> 5 FREE add: 0x70b150f4 >>> 8 FREE add: 0x70a850b8 >>> 6 FREE add: 0x70995064 >>> 9 FREE add: 0x709c507c 2 address: 0x70995064 size: 0x20000
>>> 3 FREE add: 0x70bf5134 >>> 4 FREE add: 0x70a3509c 4 address: 0x709b5080 size: 0x50000
>>> 2 FREE add: 0x70995064 0 address: 0x70a0509c size: 0x30000
9 address: 0x70a350b4 size: 0x50000
6 address: 0x70995064 size: 0x20000
>>> 7 FREE add: 0x70b85114 1 address: 0x70a850d0 size: 0x50000
2 address: 0x70174f0c size: 0x10000
3 address: 0x70ad50ec size: 0x70000
7 address: 0x70b4510c size: 0x30000
>>> 3 FREE add: 0x70ad50ec >>> 7 FREE add: 0x70b4510c >>> 9 FREE add: 0x70a350b4 3 address: 0x70a350b4 size: 0x30000
7 address: 0x70ad50ec size: 0x20000
>>> 4 FREE add: 0x709b5080 >>> 7 FREE add: 0x70ad50ec 8 address: 0x709b5080 size: 0x30000
4 address: 0x70ad50ec size: 0x50000
>>> 6 FREE add: 0x70995064 6 address: 0x70b25108 size: 0x30000
>>> 3 FREE add: 0x70a350b4 7 address: 0x70995064 size: 0x10000
>>> 1 FREE add: 0x70a850d0 9 address: 0x70a350b4 size: 0x60000
>>> 8 FREE add: 0x709b5080 3 address: 0x709a5084 size: 0x30000
>>> 6 FREE add: 0x70b25108 >>> 7 FREE add: 0x70995064 >>> 2 FREE add: 0x70174f0c 1 address: 0x70b25108 size: 0x70000
>>> 3 FREE add: 0x709a5084 8 address: 0x70995064 size: 0x50000
>>> 0 FREE add: 0x70a0509c >>> 4 FREE add: 0x70ad50ec >>> 8 FREE add: 0x70995064 7 address: 0x70995064 size: 0x70000
3 address: 0x70a05084 size: 0x20000
0 address: 0x70a950cc size: 0x30000
>>> 0 FREE add: 0x70a950cc 4 address: 0x70a950cc size: 0x30000
2 address: 0x70ac50e4 size: 0x40000
>>> 7 FREE add: 0x70995064 0 address: 0x70995064 size: 0x60000
6 address: 0x70b95128 size: 0x60000
7 address: 0x70bf5140 size: 0x20000
8 address: 0x70c1515c size: 0x20000
>>> 4 FREE add: 0x70a950cc >>> 6 FREE add: 0x70b95128 6 address: 0x70b95128 size: 0x40000
>>> 3 FREE add: 0x70a05084 3 address: 0x709f507c size: 0x40000
>>> 7 FREE add: 0x70bf5140 >>> 8 FREE add: 0x70c1515c 4 address: 0x70174f0c size: 0x10000
>>> 6 FREE add: 0x70b95128 6 address: 0x70b95128 size: 0x50000
>>> 9 FREE add: 0x70a350b4 >>> 0 FREE add: 0x70995064 7 address: 0x70a3509c size: 0x70000
>>> 1 FREE add: 0x70b25108 >>> 2 FREE add: 0x70ac50e4 >>> 3 FREE add: 0x709f507c >>> 4 FREE add: 0x70174f0c >>> 6 FREE add: 0x70b95128 >>> 7 FREE add: 0x70a3509c
0 Alloc 512B at address: 0x70000750
1 Alloc 512B at address: 0x7000AC44
2 Alloc 512B at address: 0x7000C15C
3 Alloc 512B at address: 0x7000C378
4 Alloc 512B at address: 0x7000CE04
5 Alloc 512B at address: 0x7000D458
6 Alloc 512B at address: 0x7000DAAC
7 Alloc 512B at address: 0x7000DCC8
8 Alloc 512B at address: 0x7000DEE4
9 Alloc 512B at address: 0x7000E100
>>> 1 FREE add: 0x7000ac44 1 address: 0x70995064 size: 0x50000
>>> 8 FREE add: 0x7000dee4 >>> 3 FREE add: 0x7000c378 >>> 0 FREE add: 0x70000750 >>> 2 FREE add: 0x7000c15c 3 address: 0x709e5080 size: 0x40000
>>> 1 FREE add: 0x70995064 >>> 9 FREE add: 0x7000e100 >>> 3 FREE add: 0x709e5080 3 address: 0x70995064 size: 0x40000
>>> 5 FREE add: 0x7000d458 9 address: 0x70174f0c size: 0x10000
2 address: 0x709d5084 size: 0x40000
>>> 6 FREE add: 0x7000daac 0 address: 0x70a150a4 size: 0x60000
>>> 2 FREE add: 0x709d5084 8 address: 0x709d5084 size: 0x30000
6 address: 0x70a750bc size: 0x10000
>>> 6 FREE add: 0x70a750bc >>> 7 FREE add: 0x7000dcc8 6 address: 0x70a750bc size: 0x60000
1 address: 0x70ad50d4 size: 0x70000
5 address: 0x70b450f4 size: 0x40000
>>> 6 FREE add: 0x70a750bc 7 address: 0x70a750bc size: 0x40000
>>> 8 FREE add: 0x709d5084 >>> 0 FREE add: 0x70a150a4 >>> 9 FREE add: 0x70174f0c >>> 1 FREE add: 0x70ad50d4 >>> 7 FREE add: 0x70a750bc 7 address: 0x70174f0c size: 0x10000
2 address: 0x709d5084 size: 0x10000
1 address: 0x709e50a4 size: 0x50000
>>> 2 FREE add: 0x709d5084 8 address: 0x70a350c0 size: 0x30000
>>> 5 FREE add: 0x70b450f4 6 address: 0x70a650d8 size: 0x50000
>>> 6 FREE add: 0x70a650d8 >>> 8 FREE add: 0x70a350c0 0 address: 0x70a350c0 size: 0x20000
5 address: 0x70a550dc size: 0x40000
2 address: 0x709d5084 size: 0x10000
>>> 7 FREE add: 0x70174f0c >>> 3 FREE add: 0x70995064 7 address: 0x70a950fc size: 0x70000
>>> 1 FREE add: 0x709e50a4 8 address: 0x70995064 size: 0x30000
>>> 5 FREE add: 0x70a550dc >>> 2 FREE add: 0x709d5084 9 address: 0x70174f0c size: 0x10000
3 address: 0x709c507c size: 0x30000
2 address: 0x70b0511c size: 0x70000
>>> 0 FREE add: 0x70a350c0 >>> 3 FREE add: 0x709c507c 1 address: 0x709c507c size: 0x60000
>>> 1 FREE add: 0x709c507c 5 address: 0x709c507c size: 0x20000
>>> 9 FREE add: 0x70174f0c 3 address: 0x709e5098 size: 0x50000
9 address: 0x70a350b4 size: 0x20000
>>> 9 FREE add: 0x70a350b4 >>> 7 FREE add: 0x70a950fc >>> 5 FREE add: 0x709c507c 6 address: 0x709c507c size: 0x20000
>>> 2 FREE add: 0x70b0511c 5 address: 0x70a350b4 size: 0x60000
1 address: 0x70a950cc size: 0x40000
>>> 4 FREE add: 0x7000ce04 >>> 1 FREE add: 0x70a950cc 2 address: 0x70174f0c size: 0x10000
>>> 6 FREE add: 0x709c507c >>> 5 FREE add: 0x70a350b4 >>> 3 FREE add: 0x709e5098 3 address: 0x709c507c size: 0x10000
5 address: 0x709d509c size: 0x70000
0 address: 0x70a450bc size: 0x40000
7 address: 0x70a850dc size: 0x70000
>>> 7 FREE add: 0x70a850dc >>> 8 FREE add: 0x70995064 >>> 2 FREE add: 0x70174f0c 9 address: 0x70995064 size: 0x20000
1 address: 0x70a850dc size: 0x30000
2 address: 0x70ab50f4 size: 0x60000
>>> 3 FREE add: 0x709c507c >>> 9 FREE add: 0x70995064 >>> 2 FREE add: 0x70ab50f4 2 address: 0x70ab50f4 size: 0x70000
>>> 1 FREE add: 0x70a850dc >>> 0 FREE add: 0x70a450bc 7 address: 0x70995064 size: 0x40000
9 address: 0x70a450bc size: 0x40000
>>> 2 FREE add: 0x70ab50f4 >>> 9 FREE add: 0x70a450bc 1 address: 0x70a450bc size: 0x50000
8 address: 0x70a950d8 size: 0x40000
>>> 5 FREE add: 0x709d509c 3 address: 0x709d5084 size: 0x20000
>>> 8 FREE add: 0x70a950d8 9 address: 0x709f50a0 size: 0x50000
>>> 1 FREE add: 0x70a450bc >>> 3 FREE add: 0x709d5084 >>> 7 FREE add: 0x70995064 >>> 9 FREE add: 0x709f50a0
0 Alloc 512B at address: 0x70000750
1 Alloc 512B at address: 0x7000AC44
2 Alloc 512B at address: 0x7000C15C
3 Alloc 512B at address: 0x7000C378
4 Alloc 512B at address: 0x7000CE04
5 Alloc 512B at address: 0x7000D458
6 Alloc 512B at address: 0x7000DAAC
7 Alloc 512B at address: 0x7000DCC8
8 Alloc 512B at address: 0x7000DEE4
9 Alloc 512B at address: 0x7000E100
... PAUSED ...