lsd-maddrive / STM32_ChibiOS

Resources for ChibiOS on STM32 boards
Creative Commons Attribution Share Alike 4.0 International
6 stars 7 forks source link

[HAL/ADC] Чтение буффера АЦП и проверка на кэширование в DMA #11

Open KaiL4eK opened 5 years ago

KaiL4eK commented 5 years ago

Утро началось не с кофе. =) Вместе с @PonomarevDA выяснили, что на камнях F7 может встречаться проблема кэширования буфера при работе с АЦП. Быстрофикс говорит о том, что можно использовать следующий вид при работе:

#if defined(__GNUC__)
__attribute__((aligned (32)))
#endif
static adcsample_t adc_buffer[ADC1_NUM_CHANNELS * ADC1_BUF_DEPTH];

static void adccallback(ADCDriver *adcp, adcsample_t *buffer, size_t n)
{
  adcp = adcp; n = n;
  dmaBufferInvalidate(buffer,
                      n * adcp->grpp->num_channels * sizeof (adcsample_t));
...
}

Как видно, используется функция dmaBufferInvalidate() для проверки того, выданы данные из кэша или нет, а также выравнивается буфер adc_buffer[] 32м байтам.

Причины этой проблемы выясняются, быстрофиксом пользоваться можно, но нужно четко понимать, при каких обстоятельствах данные начинают зависать в кэше.

KaiL4eK commented 5 years ago

Вот здесь есть инфа о том, что у Cortex-M7 (а это наш F7) длина строки кэша = 32 байта. Пока есть предположение, что при использовании буфера размером более 32 байта (для нас это adcsample_t buffer[16], так как sizeof(adcsample_t) == 2) приводит к активному использованию кэша, что наводит на мысль, что при использовании маленького буфера все будет работать без проверок на выдачу из кэша