heap: fix unit test for the case when less than 10k of IRAM is available

This commit is contained in:
Ivan Grokhotkov 2018-06-27 14:46:20 +08:00
parent 253930acd1
commit 7a154d6a4e

View file

@ -9,6 +9,7 @@
#include "esp_heap_caps.h" #include "esp_heap_caps.h"
#include "esp_spi_flash.h" #include "esp_spi_flash.h"
#include <stdlib.h> #include <stdlib.h>
#include <sys/param.h>
TEST_CASE("Capabilities allocator test", "[heap]") TEST_CASE("Capabilities allocator test", "[heap]")
{ {
@ -38,18 +39,24 @@ TEST_CASE("Capabilities allocator test", "[heap]")
TEST_ASSERT((((int)m1)&0xFF000000)==0x3F000000); TEST_ASSERT((((int)m1)&0xFF000000)==0x3F000000);
free(m1); free(m1);
printf("Freeing; allocating 10K of 32K-capable RAM\n"); //The goal here is to allocate from IRAM. Since there is no external IRAM (yet)
m1 = heap_caps_malloc(10*1024, MALLOC_CAP_32BIT); //the following gives size of IRAM-only (not D/IRAM) memory.
size_t free_iram = heap_caps_get_free_size(MALLOC_CAP_INTERNAL) -
heap_caps_get_free_size(MALLOC_CAP_8BIT | MALLOC_CAP_INTERNAL);
size_t alloc32 = MIN(free_iram / 2, 10*1024);
printf("Freeing; allocating %u bytes of 32K-capable RAM\n", alloc32);
m1 = heap_caps_malloc(alloc32, MALLOC_CAP_32BIT);
printf("--> %p\n", m1); printf("--> %p\n", m1);
//Check that we got IRAM back
TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000);
free8 = heap_caps_get_free_size(MALLOC_CAP_8BIT); free8 = heap_caps_get_free_size(MALLOC_CAP_8BIT);
free32 = heap_caps_get_free_size(MALLOC_CAP_32BIT); free32 = heap_caps_get_free_size(MALLOC_CAP_32BIT);
printf("Free 8bit-capable memory (after 32-bit): %dK, 32-bit capable memory %dK\n", free8, free32); printf("Free 8bit-capable memory (after 32-bit): %dK, 32-bit capable memory %dK\n", free8, free32);
//Only 32-bit should have gone down by 10K: 32-bit isn't necessarily 8bit capable //Only 32-bit should have gone down by alloc32: 32-bit isn't necessarily 8bit capable
TEST_ASSERT(free32<(free32start-10*1024)); TEST_ASSERT(free32<(free32start-alloc32));
TEST_ASSERT(free8==free8start); TEST_ASSERT(free8==free8start);
//Assume we got IRAM back
TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000);
free(m1); free(m1);
printf("Allocating impossible caps\n"); printf("Allocating impossible caps\n");
m1= heap_caps_malloc(10*1024, MALLOC_CAP_8BIT|MALLOC_CAP_EXEC); m1= heap_caps_malloc(10*1024, MALLOC_CAP_8BIT|MALLOC_CAP_EXEC);
printf("--> %p\n", m1); printf("--> %p\n", m1);
@ -57,14 +64,15 @@ TEST_CASE("Capabilities allocator test", "[heap]")
printf("Testing changeover iram -> dram"); printf("Testing changeover iram -> dram");
// priorities will exhaust IRAM first, then start allocating from DRAM // priorities will exhaust IRAM first, then start allocating from DRAM
for (x=0; x<10; x++) { for (x=0; x<10; x++) {
m2[x]= heap_caps_malloc(10*1024, MALLOC_CAP_32BIT); m2[x]= heap_caps_malloc(alloc32, MALLOC_CAP_32BIT);
printf("--> %p\n", m2[x]); printf("--> %p\n", m2[x]);
} }
TEST_ASSERT((((int)m2[0])&0xFF000000)==0x40000000); TEST_ASSERT((((int)m2[0])&0xFF000000)==0x40000000);
TEST_ASSERT((((int)m2[9])&0xFF000000)==0x3F000000); TEST_ASSERT((((int)m2[9])&0xFF000000)==0x3F000000);
printf("Test if allocating executable code still gives IRAM, even with dedicated IRAM region depleted\n"); printf("Test if allocating executable code still gives IRAM, even with dedicated IRAM region depleted\n");
// (the allocation should come from D/IRAM) // (the allocation should come from D/IRAM)
m1= heap_caps_malloc(10*1024, MALLOC_CAP_EXEC); free_iram = heap_caps_get_free_size(MALLOC_CAP_EXEC);
m1= heap_caps_malloc(MIN(free_iram / 2, 10*1024), MALLOC_CAP_EXEC);
printf("--> %p\n", m1); printf("--> %p\n", m1);
TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000); TEST_ASSERT((((int)m1)&0xFF000000)==0x40000000);
free(m1); free(m1);