Проблемы FreeRTOS с полным циклом, есть ли вероятность, что я смогу написать 512 байт с частотой 50 Гц?

Я поднимаю этот вопрос во время использования freertos fat. Среда разработки с использованием компилятора iar и MCU использует cortex-m4. Я использую библиотеку hal, и содержимое FreeRTOS FAT Config.h выглядит следующим образом:

#define BUS_4BITS           1
#define SDIO_USES_DMA           1

Я сгенерировал только одну задачу, SDcard write, которая записывает 400 байт с частотой 50 Гц, задача выглядит следующим образом:

void SDCARD_WRITE_Task(void  * pvParameters)
{
  uint32_t PreviousWakeTime = 0;

  SDcard_Init();
  SDcard_SetFileName("FDR","/FDR");

  for(;;)
  {
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6,GPIO_PIN_SET);        //pin high
    PreviousWakeTime = osKernelSysTick();                       
    SDcard_Write(ucFileName, SDCARD_Buffer, sizeof(SDCARD_Buffer));  
    HAL_GPIO_WritePin(GPIOG, GPIO_PIN_6,GPIO_PIN_RESET);          // pin low
    vTaskDelayUntil(&PreviousWakeTime, 20/portTICK_PERIOD_MS );
  }
}

PG6, вывод высокий в начале, будет в низком состоянии в конце цикла, чтобы проверить время обработки SDcard. Запись содержимого функции выглядит следующим образом:

введите описание изображения здесь

SDCARD WRITE Результаты осциллографа задач подтвердили случаи, когда во время теста произошла неожиданная длительность, я установил 50 Гц для записи 400 байт, но иногда это занимает 200~250 мс

введите описание изображения здесь

даже если я изменю длину байтов, проблема все еще возникла

Почему возникает эта проблема?

есть ли шанс, что я могу написать 512 байт с 50 Гц?

или есть какие-либо ограничения в байтах или частоте записи SD-карты?

2 ответа

Запись на любой носитель в режиме реального времени НАДЕЖНАЯ требует буферизации на вашей стороне.

Контроллеры SD в самих картах делают все возможное, чтобы уменьшить задержку за счет сложного управления буферами и т. Д., Но даже самые лучшие могут иметь задержку при любой записи, которая длится 250 мс и более, поскольку она выполняет сбор мусора.

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

Это использует FreeRTOS + FAT? Или что-то, что поставляется с вашей средой разработки? В любом случае, похоже, что время, которое вы измеряете, связано с драйвером, который выполняет фактическую запись на SD-карту, поэтому я бы посоветовал взять тайминги внутри драйвера. Кроме того, вы пробовали разные SD-карты - наш опыт показывает, что разница в производительности между разными производителями очень велика, и некоторые карты практически невозможно использовать, в то время как другие работают очень быстро при одинаковых испытаниях.

Другие вопросы по тегам