Проблемы 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-карты - наш опыт показывает, что разница в производительности между разными производителями очень велика, и некоторые карты практически невозможно использовать, в то время как другие работают очень быстро при одинаковых испытаниях.