我在使用自由脂肪期间提出这个问题。 使用iar编译器和MCU的开发环境使用cortex-m4。 我使用hal库,FreeRTOS FAT Config.h的内容如下:
#define BUS_4BITS 1
#define SDIO_USES_DMA 1
我只生成了一个SDcard写入任务,用50hz写入400byte 任务如下:
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任务示波器结果确认在测试过程中出现意外时间长度,我将其设置为50hz写入400byte但有时需要200~250ms
即使我更改了仍然出现问题的字节长度
为什么会出现这个问题?
我有没有机会用50hz写512字节?
或SDcard写入的字节或频率是否有限制?
答案 0 :(得分:0)
这是使用FreeRTOS+FAT吗?或者您的开发环境附带的东西?在任何情况下,看起来您测量的时间与执行SD卡实际写入的驱动程序有关,因此我建议在驱动程序内部进行计时。此外,你尝试过不同的SD卡 - 我们的经验是不同制造商之间的性能差异非常大,有些卡几乎无法使用,而其他卡在进行相同测试时非常快。
答案 1 :(得分:0)
实时写入任何类型的媒体RELIABLY需要您的缓冲。
卡中的SD控制器本身尽可能通过缓冲区等的花哨管理来减少延迟,但即使是最好的也可以在执行垃圾收集时持续250ms或更长的任何给定写入时具有延迟。
平均而言,他们会管理他们宣传的吞吐量,但主机/库需要管理异步写入和缓冲以隔离系统的时序关键部分。