0

我正在尝试使用 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。

4

1 回答 1

0

所以这里只是一些想法:

内存

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

你的问题

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

编辑:您能否发布更多关于sd_buff的详细信息

于 2020-02-21T10:01:48.210 回答