【问题标题】:fatfs f_write returns FR_DISK_ERR when passing a pointer to data in a mail queuefatfs f_write 在传递指向邮件队列中数据的指针时返回 FR_DISK_ERR
【发布时间】:2020-06-05 10:10:19
【问题描述】:

我正在尝试使用 FreeRTOS 将 ADC 数据写入 STM32F7 上的 SD 卡,并且我正在使用 CMSIS-RTOS API 的 V1。我正在使用邮件队列,并且我有一个包含数组的结构。

typedef struct
{
     uint16_t data[2048];
} ADC_DATA;

在 ADC 半/完整中断上,我将数据添加到队列中,并且我有一个消费者任务将这些数据写入 sd 卡。我的问题在我的消费者任务中,我必须对另一个数组执行 memcpy,然后将该数组的内容写入 sd 卡。

void vConsumer(void const * argument)
{   
    ADC_DATA *rx_data;

    for(;;)
    {   
        writeEvent = osMailGet(adcDataMailId, osWaitForever);

        if(writeEvent.status == osEventMail)
        {
            // write Data to SD
             rx_data =  writeEvent.value.p;
             memcpy(sd_buff, rx_data->data, sizeof(sd_buff));
             if(wav_write_result == FR_OK)
             {
                 if( f_write(&wavFile, (uint8_t *)sd_buff, SD_WRITE_BUF_SIZE, (void*)&bytes_written) == FR_OK)
                    {
                        file_size+=bytes_written;
                    }
             } 

            osMailFree(adcDataMailId, rx_data);

        }
}

这按预期工作,但如果我尝试将此行更改为

f_write(&wavFile, (uint8_t *)rx_data->data, SD_WRITE_BUF_SIZE, (void*)&bytes_written) == FR_OK)

为了摆脱 memcpy,f_write 返回FR_DISK_ERR。任何人都可以帮助阐明为什么会发生这种情况,我觉得额外的 memcpy 没用,您应该能够将指向队列的指针直接传递给 f_write。

【问题讨论】:

    标签: embedded stm32 freertos cmsis fatfs


    【解决方案1】:

    所以这里只是一些想法:

    memcpy

    ​​>

    通常我只复制必要数量的数据。如果我有实际数据的大小,我将添加边界检查并将其传递给memcpy

    你的问题

    我只是在这里猜测,但是如果您检查结构定义,数据字段的类型为 uint16_t,并且您将其转换为字节指针。此外,FatFs documentation 期望 buf 类型为 void*。

    编辑:您能否发布更多sd_buff

    的详细信息

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-10
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多