В дополнение к прошлой заметке
Как я уже говорил, у CCM есть некоторые особенности, чтобы их понять и не наступать на грабли, по каждому чипу лучше всего сверяться с документацией. Например для STM32F407, CCM подключена только к D-BUS (шине данных), поэтому на этих чипах нет никакой возможности выполнять код лежащий в CCM.
Для STM32F3xx наоборот, ST вполне даже рекомендует оптимизировать быстродействие переместим код в CCM, обещая при этом +43% к производительности. Но опять же, согласно RM0316 CCM не имеет подключения к шинам DMA S3,S4 поэтому DMA работать откажутся.
По поводу производительности, по тестам для STM32F407 выходит такой результат, в таблице время выполнения теста относительно FLASH/RAM (больше — хуже):
Код в FLASH | Код в SRAM | |
---|---|---|
Данные в SRAM | 0% | +14.53% |
Данные в CCM | +2.4% | +15.73% |
А вот результаты того же теста для STM32F303:
Код в FLASH | Код в SRAM | Код в CCM | |
---|---|---|---|
Данные в SRAM | 0% | 0% | -16.93% |
Данные в CCM | +4.6% | +10.77% | -12.32% |
методика простая:
uint32_t test(volatile uint32_t *data, size_t size) { uint32_t s = HAL_GetTick(); for (int k = 0; k < COUNTER; k++) { volatile uint32_t *ptr; size_t i = size; ptr = data; while (--i) *ptr++ = 0xAABBCCDD; i = size; ptr = data; while (--i) *ptr++ ^= 0xDDCCBBAA; i = size; ptr = data; uint32_t v = 0xFFFFFFFF; while (--i) v ^= *ptr++; } s = HAL_GetTick() - s; return s; } |