bootloader/early boot: Error out if >192KB of static DRAM is allocated (temporary fix)
Currently the last 128KB of DRAM is reserved for the bootloader & early boot stacks. This means if >192KB of static DRAM is allocated, the only available heap is this region - which is disabled until the scheduler starts. As a result, you get either heap corruption on early boot if the static data overlaps startup heap (leading to very weird errors), or FreeRTOS will fail to start when it can't malloc() anything. Long term fix is to move the stacks & bootloader data to the very end of RAM, and only reserve that part for early boot. This is a little fiddly because of also wanting to make sure this memory is not preemptively fragmented when it gets reintroduced to the heap. This will become more important if/when we have more static allocation options in the future. For now, these errors make it clear why the boot has failed. Ref TW13909
This commit is contained in:
committed by
Angus Gratton
parent
9487797273
commit
2b0f623259
@@ -520,6 +520,13 @@ static void unpack_load_app(const esp_partition_pos_t* partition)
|
||||
bootloader RAM... */
|
||||
|
||||
if (end_addr < 0x40000000) {
|
||||
if (end_addr > 0x3FFE0000) {
|
||||
/* Temporary workaround for an ugly crash, until we allow >192KB of static DRAM */
|
||||
ESP_LOGE(TAG, "DRAM segment %d (start 0x%08x end 0x%08x) too large for IDF to boot",
|
||||
segment, start_addr, end_addr);
|
||||
return;
|
||||
}
|
||||
|
||||
sp = (intptr_t)get_sp();
|
||||
if (end_addr > sp) {
|
||||
ESP_LOGE(TAG, "Segment %d end address %08x overlaps bootloader stack %08x - can't load",
|
||||
|
||||
Reference in New Issue
Block a user