Использование f_mount для чтения и записи данных в текстовый файл - PullRequest
0 голосов
/ 05 октября 2018

В моем приложении мне нужно открыть, прочитать и записать данные в текстовый файл с помощью вызовов f_open, f_read & f_write.

Не удается открыть файл .txt

res = f_open(&f_header.file, file_path, FA_OPEN_EXISTING | FA_WRITE | FA__WRITTEN | FA_READ | FA_CREATE_NEW  );
                printf("res value after f open %d \n\r",res);
if (res != FR_OK) {
                printf("Failed to open %s, error %d\n\r", file_path, res);
    }

Это дает ошибку:

FR_NOT_ENABLED, / * (12) Том не имеет рабочей области * /

Для решения этой ошибки прикладной программе необходимо выполнить f_mountФункция после каждого изменения носителя принудительно очищает объект файловой системы.

Как использовать вызов f_mount () в этом приложении для решения этой проблемы?Я не совсем понимаю насчет второго параметра.

Я добавил это f_mount (& fs0, "0: //", 1);решить эту проблему.

До вызова f_open.Он также не принимает вызов f_mount ().

res=f_mount(&fs0,"0://", 1);

res = f_open(&f_header.file, file_path, FA_OPEN_EXISTING | FA_WRITE | FA__WRITTEN | FA_READ | FA_CREATE_NEW  );

-> Код останавливается во время выполнения до f_mount () *

Вот исходный код для f_mount, который я 'm используя:

FRESULT f_mount (
    FATFS* fs,          /* Pointer to the file system object (NULL:unmount)*/
    const TCHAR* path,  /* Logical drive number to be mounted/unmounted */
    BYTE opt            /* 0:Do not mount (delayed mount), 1:Mount immediately */
)
{
    FATFS *cfs;
    int vol;
    FRESULT res;
    const TCHAR *rp = path;
    vol = get_ldnumber(&rp);
    if (vol < 0) return FR_INVALID_DRIVE;
    cfs = FatFs[vol];                   /* Pointer to fs object */
    if (cfs) {
#if _FS_LOCK
        clear_lock(cfs);
#endif
#if _FS_REENTRANT                       /* Discard sync object of the current volume */
        if (!ff_del_syncobj(cfs->sobj)) return FR_INT_ERR;
#endif
        cfs->fs_type = 0;               /* Clear old fs object */
    }
    if (fs) {
        fs->fs_type = 0;                /* Clear new fs object */
#if _FS_REENTRANT                       /* Create sync object for the new volume */
        if (!ff_cre_syncobj((BYTE)vol, &fs->sobj)) return FR_INT_ERR;
#endif
    }
    FatFs[vol] = fs;            /* Register new fs object */
    if (!fs || opt != 1) return FR_OK;  /* Do not mount now, it will be mounted later */
    res = find_volume(&fs, &path, 0);   /* Force mounted the volume */
    LEAVE_FF(fs, res);
}
  • Код не показывает никаких ошибок / предупреждений во время создания файла.Я уверен, что с кодом проблем нет.
  • В коде нет ничего плохого.Это какая-то проблема, связанная с выделением памяти или нехваткой памяти в emmc.Каковы возможные причины такого поведения. Любая помощь приветствуется.

Спасибо и с уважением заранее

1 Ответ

0 голосов
/ 05 октября 2018

Согласно http://elm -chan.org / fsw / ff / doc / mount.html :

FRESULT f_mount (
  FATFS*       fs,    /* [IN] Filesystem object */
  const TCHAR* path,  /* [IN] Logical drive number */
  BYTE         opt    /* [IN] Initialization option */
);

Parameters
  fs
    Pointer to the filesystem object to be registered and cleared. Null pointer unregisters the registered filesystem object.
  path
    Pointer to the null-terminated string that specifies the logical drive. The string without drive number means the default drive.
  opt
    Mounting option. 0: Do not mount now (to be mounted on the first access to the volume), 1: Force mounted the volume to check if it is ready to work.

Другими словами, второй параметр - это то, как вы хотитеобращайтесь к этой конкретной файловой системе при дальнейшей работе с ней.

Например, монтируйте ее так:

f_mount(&fs0, "0://", 1);

, тогда вы сможете открывать файлы следующим образом:

f_open(fp, "0://path/to/file", FA_CREATE_ALWAYS);
...