Seems to work adding to ...\hardware\teensy\avr\cores\teensy4\imxrt1062_t4 1.ld:
Code:
_seram = ADDR(.bss.extram);
_eeram = ADDR(.bss.extram) + SIZEOF(.bss.extram);
And edited code p#7 below shows either with #if 0 small EXTMEM:
Code:
T:\tCode\RAM\KurtE_ERAM_Alloc\KurtE_ERAM_Alloc.ino Sep 15 2020 13:27:40
ERAM start==0x70000000 end==0x70000800
EXTMEM fluff==0x70000000[size=400] fluff2==0x70000400[size=400]
External PSRAM size: 16
Eat: 70800000 B1:7059da60 B2:7033b4c0 B3: 700d8f20
Pass 1 error count: 0
Pass 2 error count: 0
or #if 1 larger EXTMEM:
Code:
T:\tCode\RAM\KurtE_ERAM_Alloc\KurtE_ERAM_Alloc.ino Sep 15 2020 13:27:56
ERAM start==0x70000000 end==0x70002000
EXTMEM fluff==0x70000000[size=1000] fluff2==0x70001000[size=1000]
External PSRAM size: 16
Eat: 70800000 B1:7059da60 B2:7033b4c0 B3: 700d8f20
Pass 1 error count: 0
Pass 2 error count: 0
> Not getting error in code - not sure when that might happen
> this was just proof of concept tracking the EXTMEM alloc - got rid of warnings on fixed 0x70000000l usage - no promise it is right
Here with edits:
Code:
#define COUNT_ALLOC 1250000
//===============================================================================
#if defined(ARDUINO_TEENSY41)
extern "C" {
extern uint8_t external_psram_size;
}
uint8_t *extmem_next_free = nullptr; // set in startup NULL if we don't have external memory
extern unsigned long _seram;
extern unsigned long _eeram;
uint8_t *malloc_extmem(size_t cb_alloc) {
if (!extmem_next_free) extmem_next_free = (uint8_t *)&_seram + (uint32_t)(external_psram_size * 1048576);
// lets allocate and return on 16 byte boundaries.
uint8_t *ret_val = (uint8_t *)((uint32_t)(extmem_next_free - cb_alloc) & 0xfffffff0);
// BUGBUG only comparing that we run of EXTERNAL memory not that we overrun pre allocated
if (ret_val < (uint8_t *)&_eeram) return nullptr;
extmem_next_free = ret_val;
return ret_val;
}
#else
uint8_t *malloc_extmem(size_t cb_alloc) {
return nullptr;
}
#endif
void free_extmem(char *p) {
// we don't do any free yet
}
//===============================================================================
extern uint8_t *malloc_extmem(size_t cb_alloc);
uint16_t *buffer1;
uint16_t *buffer2;
uint16_t *buffer3;
#if 1
EXTMEM uint32_t fluff[1024];
EXTMEM uint32_t fluff2[1024];
#else
EXTMEM uint32_t fluff[256];
EXTMEM uint32_t fluff2[256];
#endif
uint8_t *buffer_eat_upper_8mb = nullptr;
void setup() {
pinMode(13, OUTPUT);
Serial.begin(115200);
while (!Serial && millis() < 4000 );
Serial.println("\n" __FILE__ " " __DATE__ " " __TIME__);
Serial.printf( "ERAM start==0x%x\t end==0x%x\n", &_seram, &_eeram );
Serial.printf( "EXTMEM \t fluff==0x%x[size=%x]\t fluff2==0x%x[size=%x]\n", fluff, sizeof(fluff), fluff2, sizeof(fluff2) );
#if defined(ARDUINO_TEENSY41)
Serial.printf("External PSRAM size: %d\n", external_psram_size);
if (external_psram_size == 16) buffer_eat_upper_8mb = malloc_extmem(1024*1024*8);
#endif
buffer1 = (uint16_t*)malloc_extmem(COUNT_ALLOC * sizeof(uint16_t));
buffer2 = (uint16_t*)malloc_extmem(COUNT_ALLOC * sizeof(uint16_t));
buffer3 = (uint16_t*)malloc_extmem(COUNT_ALLOC * sizeof(uint16_t));
Serial.printf("Eat: %x B1:%x B2:%x B3: %x\n", (uint32_t)buffer_eat_upper_8mb, (uint32_t)buffer1, (uint32_t)buffer2, (uint32_t)buffer3);
if (!buffer1 || !buffer2 || !buffer3) {
Serial.println("Failed to allocate external memory");
for (;;) {
digitalWrite(13, !digitalRead(13));
delay(250);
}
}
}
uint32_t loop_count = 0;
void loop() {
digitalWrite(13, !digitalRead(13));
loop_count++;
for (uint32_t i = 0; i < COUNT_ALLOC; i++) {
buffer1[i] = i & 0xffff;
buffer2[i] = loop_count & 0xffff;
buffer3[i] = buffer1[i] ^ buffer2[i];
if (buffer_eat_upper_8mb)buffer_eat_upper_8mb[i] = loop_count + i ;
}
uint32_t error_count = 0;
for (uint32_t i = 0; i < COUNT_ALLOC; i++) {
if ((buffer1[i] != (i & 0xffff)) || (buffer2[i] != (loop_count & 0xffff)) || (buffer3[i] != (buffer1[i] ^ buffer2[i]))) {
error_count++;
if (error_count < 5) Serial.printf("%u %x %x %x\n", i, buffer1[i], buffer2[i], buffer3[i]);
}
}
Serial.printf("Pass %d error count: %d\n", loop_count, error_count);
}
With two tiny single byte fluffs:
ERAM start==0x70000000 end==0x70000002
EXTMEM fluff==0x70000000[size=1] fluff2==0x70000001[size=1]
With no fluff:
T:\tCode\RAM\KurtE_ERAM_Alloc\KurtE_ERAM_Alloc.ino Sep 15 2020 14:07:40
ERAM start==0x70000000 end==0x70000000