fatfs f_write 在传递指向邮件队列中数据的指针时返回 FR_DISK_ERR

Posted

技术标签:

【中文标题】fatfs f_write 在传递指向邮件队列中数据的指针时返回 FR_DISK_ERR【英文标题】:fatfs f_write returns FR_DISK_ERR when passing a pointer to data in a mail queue 【发布时间】: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。

【问题讨论】:

【参考方案1】:

所以这里只是一些想法:

memcpy

​​>

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

你的问题

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

编辑:您能否发布更多sd_buff

的详细信息

【讨论】:

以上是关于fatfs f_write 在传递指向邮件队列中数据的指针时返回 FR_DISK_ERR的主要内容,如果未能解决你的问题,请参考以下文章

用FATFS在SD卡里写一串数字

RabbitMQ保证传递到镜像队列

mysql中数百万行的基于键的分区

mailto实现将用户在网页中输入的内容传递到本地邮件客户端

将使用 f_mount 创建的工作空间传递给另一个源文件

php+redis实现消息队列