PSRAM problem while frame buffer init?
Posted: Fri Jan 15, 2021 12:24 pm
System keep rebooting while frame buffer init and here's log while.
I have no idea why free space on PSRAM shows abnomal values after allocating 960kBytes.
Code
I have no idea why free space on PSRAM shows abnomal values after allocating 960kBytes.
Code: Select all
I (2556) camera: Detected OV5640 camera
E (2556) camera: in_bpp: 2, fb_bpp: 2, fb_size: 983040, mode: 3, width: 2560 height: 1920
I (2556) camera: [DEBUG] Frame Buffer(2) Init...in Camera.c
I (2556) camera: ********* PSRAM CHECK(2) *********
I (2566) camera: heap_caps_get_total_size(MALLOC_CAP_SPIRAM) = 4194303
I (2576) camera: heap_caps_get_free_size(MALLOC_CAP_SPIRAM) = 4194264
I (2576) camera: heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM) = 4194264
I (2586) camera: heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM) = 4194264
I (2596) camera: *************************************
I (2606) camera: Allocating 960 KB frame buffer in PSRAM
I (2606) camera: ********* PSRAM CHECK(3) *********
I (2616) camera: heap_caps_get_total_size(MALLOC_CAP_SPIRAM) = 4194303
I (2616) camera: heap_caps_get_free_size(MALLOC_CAP_SPIRAM) = 4194264
I (2626) camera: heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM) = 4194264
I (2636) camera: heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM) = 4194264
I (2646) camera: *************************************
E (2776) camera: [DEBUG]Allocating 960 KB frame buffer in PSRAM Success
I (2776) camera: ********* PSRAM CHECK(4) *********
I (2776) camera: heap_caps_get_total_size(MALLOC_CAP_SPIRAM) = 4194303
I (2786) camera: heap_caps_get_free_size(MALLOC_CAP_SPIRAM) = -24831
I (2796) camera: heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM) = -1
assertion "next > (intptr_t)block" failed: file "D:/esp-idf-v4.1/components/heap/multi_heap.c", line 131, function: get_next_block
abort() was called at PC 0x401518b0 on core 0
ELF file SHA256: 4646feaf3aec573f
Backtrace: 0x4008c165:0x3ffbffa0 0x4008c501:0x3ffbffc0 0x401518b0:0x3ffbffe0 0x4009196a:0x3ffc0010 0x400d69e6:0x3ffc0030 0x400d6a45:0x3ffc0070 0x400e2197:0x3ffc00b0 0x400e2257:0x3ffc00d0 0x400e2ab7:0x3ffc0100 0x400e2e31:0x3ffc0140 0x400d94fd:0x3ffc0170 0x400d9052:0x3ffc0220 0x400d31c0:0x3ffc0240 0x4008d83d:0x3ffc0260
Rebooting...
ets Jul 29 2019 12:21:46
Code: Select all
static void psram_check(uint8_t location)
{
ESP_LOGI(TAG, "********* PSRAM CHECK(%d) *********", location);
ESP_LOGI(TAG, "heap_caps_get_total_size(MALLOC_CAP_SPIRAM) = %d", heap_caps_get_total_size(MALLOC_CAP_SPIRAM) );
ESP_LOGI(TAG, "heap_caps_get_free_size(MALLOC_CAP_SPIRAM) = %d", heap_caps_get_free_size(MALLOC_CAP_SPIRAM) );
ESP_LOGI(TAG, "heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM) = %d", heap_caps_get_minimum_free_size(MALLOC_CAP_SPIRAM) );
ESP_LOGI(TAG, "heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM) = %d", heap_caps_get_largest_free_block(MALLOC_CAP_SPIRAM) );
ESP_LOGI(TAG, "*************************************");
}
static esp_err_t camera_fb_init(size_t count)
{
if(!count) {
return ESP_ERR_INVALID_ARG;
}
camera_fb_deinit();
psram_check(2);
camera_fb_int_t * _fb = NULL, * _fb1 = NULL, * _fb2 = NULL;
for(size_t i = 0; i < count; i++) {
_fb2 = (camera_fb_int_t *)malloc(sizeof(camera_fb_int_t));
if(!_fb2) {
goto fail;
}
memset(_fb2, 0, sizeof(camera_fb_int_t));
_fb2->size = s_state->fb_size;
_fb2->buf = (uint8_t*) calloc(_fb2->size, 1);
if(!_fb2->buf) {
ESP_LOGI(TAG, "Allocating %d KB frame buffer in PSRAM", s_state->fb_size/1024);
psram_check(3);
_fb2->buf = (uint8_t*) heap_caps_calloc(_fb2->size, 1, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT);
ESP_LOGE(TAG, "[DEBUG]Allocating %d KB frame buffer in PSRAM Success", s_state->fb_size/1024);
psram_check(4);
} else {
ESP_LOGI(TAG, "Allocating %d KB frame buffer in OnBoard RAM", s_state->fb_size/1024);
}
if(!_fb2->buf) {
free(_fb2);
ESP_LOGE(TAG, "Allocating %d KB frame buffer Failed", s_state->fb_size/1024);
goto fail;
}
memset(_fb2->buf, 0, _fb2->size);
_fb2->next = _fb;
_fb = _fb2;
if(!i) {
_fb1 = _fb2;
}
}
if(_fb1) {
_fb1->next = _fb;
}
s_state->fb = _fb;//load first buffer
return ESP_OK;
fail:
while(_fb) {
_fb2 = _fb;
_fb = _fb->next;
free(_fb2->buf);
free(_fb2);
}
return ESP_ERR_NO_MEM;
}