#include "esp_attr.h" #include "esp_heap_caps.h" #include "esp_spi_flash.h" #include <stdlib.h> TEST_CASE("Capabilities allocator test", "[heap]") { char *m1, *m2[10]; int x; size_t free8start, free32start, free8, free32; /* It's important we printf() something before we take the empty heap sizes, as the first printf() in a task allocates heap resources... */ printf("Testing capabilities allocator...\n"); free8start = heap_caps_get_free_size(MALLOC_CAP_8BIT); free32start = heap_caps_get_free_size(MALLOC_CAP_32BIT); printf("Free 8bit-capable memory (start): %dK, 32-bit capable memory %dK\n", free8start, free32start); TEST_ASSERT(free32start>free8start); printf("Allocating 10K of 8-bit capable RAM\n"); m1= heap_caps_malloc(10*1024, MALLOC_CAP_8BIT); printf("--> %p\n", m1); free8 = heap_caps_get_free_size(MALLOC_CAP_8BIT); free32 = heap_caps_get_free_size(MALLOC_CAP_32BIT); printf("Free 8bit-capable memory (both reduced): %dK, 32-bit capable memory %dK\n", free8, free32); //Both should have gone down by 10K; 8bit capable ram is also 32-bit capable TEST_ASSERT(free8<(free8start-10*1024)); TEST_ASSERT(free32<(free32start-10*1024)); //Assume we got DRAM back TEST_ASSERT((((int)m1)&0xFF000000)==0x3F000000);
uint32_t esp_get_free_heap_size( void ) { return heap_caps_get_free_size( MALLOC_CAP_DEFAULT ); }
{ vTaskDelay(portMAX_DELAY); //Await external deletion } static void tsk_self_del_us_delay(void *param) { uint32_t delay = (uint32_t)param; ets_delay_us(delay); vTaskDelete(NULL); } TEST_CASE("FreeRTOS Delete Tasks", "[freertos]") { /* -------------- Test vTaskDelete() on currently running tasks ----------------*/ uint32_t before_count = uxTaskGetNumberOfTasks(); uint32_t before_heap = heap_caps_get_free_size(HEAP_CAPS); for(int i = 0; i < portNUM_PROCESSORS; i++){ for(int j = 0; j < NO_OF_TSKS; j++){ TEST_ASSERT_EQUAL(pdTRUE, xTaskCreatePinnedToCore(tsk_self_del, "tsk_self", 1024, NULL, configMAX_PRIORITIES - 1, NULL, i)); } } vTaskDelay(DELAY_TICKS); //Minimal delay to see if Idle task cleans up all tasks awaiting deletion in a single tick TEST_ASSERT_EQUAL(before_count, uxTaskGetNumberOfTasks()); TEST_ASSERT_EQUAL(before_heap, heap_caps_get_free_size(HEAP_CAPS)); /* ------------- Test vTaskDelete() on not currently running tasks ------------ */ TaskHandle_t handles[NO_OF_TSKS]; before_heap = heap_caps_get_free_size(HEAP_CAPS); //Create task pinned to the same core that will not run during task deletion for(int j = 0 ; j < NO_OF_TSKS; j++){ TEST_ASSERT_EQUAL(pdTRUE, xTaskCreatePinnedToCore(tsk_extern_del, "tsk_extern", 4096, NULL, configMAX_PRIORITIES - 1, &handles[j], xPortGetCoreID()));