1
6
7
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
35
36
37
48
49
50
51
52
53
58
59
60
65
66
67
68
69
70
71
72
75
76
77
82
83
84
85
86
87
88
92
93
94
95
101
102
103
104
105
106
107
108
/* ... */
#include <stdarg.h>
#include <string.h>
#include "sdkconfig.h"
#include "esp_heap_caps.h"
#include "esp_private/esp_cache_private.h"
#include "soc/soc_caps.h"6 includes
#if SOC_GDMA_SUPPORTED
#include "hal/gdma_ll.h"
#endif
#if CONFIG_HEAP_PLACE_FUNCTION_INTO_FLASH
#define HEAP_IRAM_ATTR
#else
#define HEAP_IRAM_ATTR IRAM_ATTR
#endif
#define CAPS_NEEDING_ALIGNMENT (MALLOC_CAP_DMA|MALLOC_CAP_DMA_DESC_AHB|MALLOC_CAP_DMA_DESC_AXI|MALLOC_CAP_CACHE_ALIGNED|MALLOC_CAP_SIMD)
HEAP_IRAM_ATTR void esp_heap_adjust_alignment_to_hw(size_t *p_alignment, size_t *p_size, uint32_t *p_caps)
{
size_t size = *p_size;
size_t alignment = *p_alignment;
uint32_t caps = *p_caps;
if (!(caps & CAPS_NEEDING_ALIGNMENT)) {
return;
}{...}
#if CONFIG_APP_BUILD_TYPE_PURE_RAM_APP
#if SOC_CACHE_INTERNAL_MEM_VIA_L1CACHE
*p_caps |= MALLOC_CAP_INVALID;/* ... */
#else
if (caps & MALLOC_CAP_SPIRAM) {
*p_caps |= MALLOC_CAP_INVALID;
}{...}
#endif/* ... */
return;/* ... */
#endif
size_t cache_alignment_bytes = 0;
esp_err_t ret = esp_cache_get_alignment(caps, &cache_alignment_bytes);
if (ret != ESP_OK) {
*p_caps |= MALLOC_CAP_INVALID;
return;
}{...}
#if SOC_GDMA_SUPPORTED && SOC_AXI_GDMA_SUPPORTED
if ((caps & MALLOC_CAP_DMA_DESC_AXI) && (cache_alignment_bytes < GDMA_LL_AXI_DESC_ALIGNMENT)) {
cache_alignment_bytes = GDMA_LL_AXI_DESC_ALIGNMENT;
}{...}
#endif/* ... */
if (cache_alignment_bytes > alignment) {
alignment = cache_alignment_bytes;
}{...}
#if SOC_SIMD_INSTRUCTION_SUPPORTED
if (caps & MALLOC_CAP_SIMD) {
alignment = (alignment > SOC_SIMD_PREFERRED_DATA_ALIGNMENT) ? alignment : SOC_SIMD_PREFERRED_DATA_ALIGNMENT;
}{...}
#endif/* ... */
size = (size + alignment - 1) & (~(alignment - 1));
if (caps & (MALLOC_CAP_DMA_DESC_AHB | MALLOC_CAP_DMA_DESC_AXI)) {
caps &= ~(MALLOC_CAP_DMA_DESC_AHB | MALLOC_CAP_DMA_DESC_AXI);
caps |= MALLOC_CAP_DMA;
}{...}
if (caps & MALLOC_CAP_SPIRAM) {
caps &= ~MALLOC_CAP_DMA;
}{...}
caps &= ~ MALLOC_CAP_CACHE_ALIGNED;
*p_size = size;
*p_alignment = alignment;
*p_caps = caps;
}{ ... }