fatfs f_write возвращает FR_DISK_ERR при передаче указателя на данные в почтовой очереди - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь использовать FreeRTOS для записи данных AD C на SD-карту на STM32F7, и я использую V1 API CMSIS-RTOS. Я использую почтовые очереди, и у меня есть структура, которая содержит массив.

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

в AD C половина / Полное полное прерывание, я добавляю данные в очередь, и у меня есть потребительская задача который записывает эти данные на 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 Ответ

0 голосов
/ 21 февраля 2020

Итак, несколько мыслей здесь:

memcpy

Обычно я копирую только необходимый объем данных. Если у меня есть размер фактических данных, я добавлю проверку границы и передам ее memcpy.

Ваша проблема

Я просто догадываюсь здесь, но если вы проверите определение структуры, поле данных будет иметь тип uint16_t, и вы приведете его к байтовому указателю. Также документация FatFs ожидает пустоту * для типа buf.

РЕДАКТИРОВАТЬ: Не могли бы вы опубликовать более подробную информацию о sd_buff

...