W tym poście chciałbym opisać w jaki sposób określić w jakiej pamięci chcemy przechowywać które dane. Konkretnie zajmę się bufor dla MBEDTLS Heap.
W moim układzie (STM32H725) pamięć podzielona jest na następujące części:
- ITCMRAM 0x00000000 64K
- DTCMRAM 0x20000000 128K
- FLASH 0x08000000 1024K
- RAM_D1 0x24000000 320K
- RAM_D2 0x30000000 32K
- RAM_D3 0x38000000 16K
Bufor przeniesiemy do pamięci DTCMRAM. Wydaje się ona dobrym miejscem na tego typu bufory. Jest szybka i dostępna bezpośrednio dla CPU. Nie używałbym jej jednak np. do ETH DMA czy SPI DMA. Je lepiej trzymać w RAM.
Całość pamięci w projekcie podzielona jest mniej więcej tak:
FLASH - kod programu, zmienne const, tablica vektorów.
RAM_D1 - .data, .bss, heap, stack.
DTCMRAM - MBED TLS Heap.
RAM_D2 - LwIP, Ethernet, DMA UART
Definiujemy tablicę:
- #define MBEDTLS_HEAP_SIZE (120U * 1024U)
- static unsigned char mbedtls_heap[MBEDTLS_HEAP_SIZE]
- __attribute__((section(".mbedtls_heap"), aligned(8)));
Funkcję inicjalizująca dane:
static uint8_t mbedtls_heap_initialized = 0;
void MbedTLS_Heap_Init(void)
{
if (mbedtls_heap_initialized == 0U) {
mbedtls_memory_buffer_alloc_init(mbedtls_heap, sizeof(mbedtls_heap));
mbedtls_heap_initialized = 1U;
}
}
Funkcje MbedTLS_Heap_Init() należy wywołać po inicjalizacji MX_MBEDTLS_Init():
- MX_MBEDTLS_Init();
- MbedTLS_Heap_Init();
Należy pamiętać jeszcze o włączeniu odpowiednich definów:
- #define MBEDTLS_MEMORY_BUFFER_ALLOC_C
- #define MBEDTLS_PLATFORM_MEMORY
Pierwsza z nich włącza alokowanie statycznego bufora. Druga pozwala na korzystanie z własnych funkcji alokacji.
Dodaje odpowiednią sekcję w pamięci wraz z zabezpieczeniem przed przekroczeniem w trakcie buildu programu:
- .mbedtls_heap (NOLOAD) :
- {
- . = ALIGN(8);
- __mbedtls_heap_start__ = .;
- KEEP(*(.mbedtls_heap))
- KEEP(*(.mbedtls_heap*))
- . = ALIGN(8);
- __mbedtls_heap_end__ = .;
- } >DTCMRAM
- __mbedtls_heap_size__ = SIZEOF(.mbedtls_heap);
- __dtcmram_free__ = ORIGIN(DTCMRAM) + LENGTH(DTCMRAM) - __mbedtls_heap_end__;
- ASSERT(SIZEOF(.mbedtls_heap) <= (120 * 1024),
- "MBEDTLS heap section is larger than expected")
- ASSERT(__mbedtls_heap_end__ <= ORIGIN(DTCMRAM) + LENGTH(DTCMRAM),
- "DTCMRAM overflow by MBEDTLS heap")
Dzięki temu zabezpieczeniu jak wprowadzimy za dużą tablicę do pamięci to dostaniemy błąd kompilacji: