123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108 |
- #pragma once
- #ifdef MULTI_HEAP_FREERTOS
- #include "freertos/FreeRTOS.h"
- #include "sdkconfig.h"
- #include "esp_rom_sys.h"
- #if CONFIG_IDF_TARGET_ESP32
- #include "esp32/rom/ets_sys.h"
- #elif CONFIG_IDF_TARGET_ESP32S2
- #include "esp32s2/rom/ets_sys.h"
- #endif
- #include <assert.h>
- typedef portMUX_TYPE multi_heap_lock_t;
- #define MULTI_HEAP_LOCK(PLOCK) do { \
- if((PLOCK) != NULL) { \
- portENTER_CRITICAL((PLOCK)); \
- } \
- } while(0)
- #define MULTI_HEAP_UNLOCK(PLOCK) do { \
- if ((PLOCK) != NULL) { \
- portEXIT_CRITICAL((PLOCK)); \
- } \
- } while(0)
- #define MULTI_HEAP_LOCK_INIT(PLOCK) do { \
- vPortCPUInitializeMutex((PLOCK)); \
- } while(0)
- #define MULTI_HEAP_LOCK_STATIC_INITIALIZER portMUX_INITIALIZER_UNLOCKED
- #define MULTI_HEAP_PRINTF esp_rom_printf
- #define MULTI_HEAP_STDERR_PRINTF(MSG, ...) esp_rom_printf(MSG, __VA_ARGS__)
- inline static void multi_heap_assert(bool condition, const char *format, int line, intptr_t address)
- {
-
- #ifndef NDEBUG
- if(!condition) {
- #ifndef CONFIG_COMPILER_OPTIMIZATION_ASSERTIONS_SILENT
- esp_rom_printf(format, line, address);
- #endif
- abort();
- }
- #else
- (void) condition;
- #endif
- }
- #define MULTI_HEAP_ASSERT(CONDITION, ADDRESS) \
- multi_heap_assert((CONDITION), "CORRUPT HEAP: multi_heap.c:%d detected at 0x%08x\n", \
- __LINE__, (intptr_t)(ADDRESS))
- #ifdef CONFIG_HEAP_TASK_TRACKING
- #include <freertos/task.h>
- #define MULTI_HEAP_BLOCK_OWNER TaskHandle_t task;
- #define MULTI_HEAP_SET_BLOCK_OWNER(HEAD) (HEAD)->task = xTaskGetCurrentTaskHandle()
- #define MULTI_HEAP_GET_BLOCK_OWNER(HEAD) ((HEAD)->task)
- #else
- #define MULTI_HEAP_BLOCK_OWNER
- #define MULTI_HEAP_SET_BLOCK_OWNER(HEAD)
- #define MULTI_HEAP_GET_BLOCK_OWNER(HEAD) (NULL)
- #endif
- #else
- #include <assert.h>
- #define MULTI_HEAP_PRINTF printf
- #define MULTI_HEAP_STDERR_PRINTF(MSG, ...) fprintf(stderr, MSG, __VA_ARGS__)
- #define MULTI_HEAP_LOCK(PLOCK) (void) (PLOCK)
- #define MULTI_HEAP_UNLOCK(PLOCK) (void) (PLOCK)
- #define MULTI_HEAP_LOCK_INIT(PLOCK) (void) (PLOCK)
- #define MULTI_HEAP_LOCK_STATIC_INITIALIZER 0
- #define MULTI_HEAP_ASSERT(CONDITION, ADDRESS) assert((CONDITION) && "Heap corrupt")
- #define MULTI_HEAP_BLOCK_OWNER
- #define MULTI_HEAP_SET_BLOCK_OWNER(HEAD)
- #define MULTI_HEAP_GET_BLOCK_OWNER(HEAD) (NULL)
- #endif
|