Не могу понять, почему работает не так, как нужно следующий код:
Файл main.c:
Код
FATFS fatfs; // File system object
FIL fil; // File object
BYTE Buffer[512];
//-----------------------------------------------------------------------
// Program Main
//-----------------------------------------------------------------------
int main (void)
{
HW_Init();
f_mount(0, &fatfs); // Register volume work area (never fails)
f_open(&fil, "TEST1234.TXT", FA_WRITE | FA_CREATE_ALWAYS);
for(;;);
}
FIL fil; // File object
BYTE Buffer[512];
//-----------------------------------------------------------------------
// Program Main
//-----------------------------------------------------------------------
int main (void)
{
HW_Init();
f_mount(0, &fatfs); // Register volume work area (never fails)
f_open(&fil, "TEST1234.TXT", FA_WRITE | FA_CREATE_ALWAYS);
for(;;);
}
Файл ff.c:
Код
FATFS *FatFs[_VOLUMES]; /* Pointer to the file system objects (logical drives) */
/*-----------------------------------------------------------------------*/
/* Mount/Unmount a Logical Drive */
/*-----------------------------------------------------------------------*/
FRESULT f_mount (
BYTE vol, /* Logical drive number to be mounted/unmounted */
FATFS *fs /* Pointer to new file system object (NULL for unmount)*/
)
{
...
FatFs[vol] = fs; /* Register new fs object */
return FR_OK;
}
/*-----------------------------------------------------------------------*/
/* Open or Create a File */
/*-----------------------------------------------------------------------*/
FRESULT f_open (
FIL *fp, /* Pointer to the blank file object */
const TCHAR *path, /* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)
{
FRESULT res;
DIR dj;
BYTE *dir;
DEF_NAMEBUF;
...
_putcUSART(((BYTE*)&(dj.fs))[1]);
_putcUSART(((BYTE*)&(dj.fs))[0]);
_putcUSART(0xFF);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[3]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[2]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[1]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[0]);
_putcUSART(0xFF);
res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));
_putcUSART(((BYTE*)&(dj.fs))[1]);
_putcUSART(((BYTE*)&(dj.fs))[0]);
_putcUSART(0xFF);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[3]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[2]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[1]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[0]);
for(;;); // Остановка
...
}
/*-----------------------------------------------------------------------*/
/* Check if the file system object is valid or not */
/*-----------------------------------------------------------------------*/
static
FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */
const TCHAR **path, /* Pointer to pointer to the path name (drive number) */
FATFS **rfs, /* Pointer to pointer to the found file system object */
BYTE chk_wp /* !=0: Check media write protection for write access */
)
{
BYTE fmt, b, pi, *tbl;
UINT vol;
DSTATUS stat;
DWORD bsect, fasize, tsect, sysect, nclst, szbfat;
WORD nrsv;
const TCHAR *p = *path;
FATFS *fs;
...
*rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */
// Далее идет работа с fs.
...
_putcUSART(((BYTE*)&((*rfs)))[1]);
_putcUSART(((BYTE*)&((*rfs)))[0]);
_putcUSART(0xFF);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[3]);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[2]);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[1]);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[0]);
_putcUSART(0xFF);
return FR_OK;
}
/*-----------------------------------------------------------------------*/
/* Mount/Unmount a Logical Drive */
/*-----------------------------------------------------------------------*/
FRESULT f_mount (
BYTE vol, /* Logical drive number to be mounted/unmounted */
FATFS *fs /* Pointer to new file system object (NULL for unmount)*/
)
{
...
FatFs[vol] = fs; /* Register new fs object */
return FR_OK;
}
/*-----------------------------------------------------------------------*/
/* Open or Create a File */
/*-----------------------------------------------------------------------*/
FRESULT f_open (
FIL *fp, /* Pointer to the blank file object */
const TCHAR *path, /* Pointer to the file name */
BYTE mode /* Access mode and file open mode flags */
)
{
FRESULT res;
DIR dj;
BYTE *dir;
DEF_NAMEBUF;
...
_putcUSART(((BYTE*)&(dj.fs))[1]);
_putcUSART(((BYTE*)&(dj.fs))[0]);
_putcUSART(0xFF);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[3]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[2]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[1]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[0]);
_putcUSART(0xFF);
res = chk_mounted(&path, &dj.fs, (BYTE)(mode & ~FA_READ));
_putcUSART(((BYTE*)&(dj.fs))[1]);
_putcUSART(((BYTE*)&(dj.fs))[0]);
_putcUSART(0xFF);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[3]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[2]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[1]);
_putcUSART(((BYTE*)&(dj.fs->dirbase))[0]);
for(;;); // Остановка
...
}
/*-----------------------------------------------------------------------*/
/* Check if the file system object is valid or not */
/*-----------------------------------------------------------------------*/
static
FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */
const TCHAR **path, /* Pointer to pointer to the path name (drive number) */
FATFS **rfs, /* Pointer to pointer to the found file system object */
BYTE chk_wp /* !=0: Check media write protection for write access */
)
{
BYTE fmt, b, pi, *tbl;
UINT vol;
DSTATUS stat;
DWORD bsect, fasize, tsect, sysect, nclst, szbfat;
WORD nrsv;
const TCHAR *p = *path;
FATFS *fs;
...
*rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */
// Далее идет работа с fs.
...
_putcUSART(((BYTE*)&((*rfs)))[1]);
_putcUSART(((BYTE*)&((*rfs)))[0]);
_putcUSART(0xFF);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[3]);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[2]);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[1]);
_putcUSART(((BYTE*)&((*rfs)->dirbase))[0]);
_putcUSART(0xFF);
return FR_OK;
}
В FatFs[vol] - указатель на структуру с параметрами смонтированного диска (флешки).
Т.е. в функции chk_mounted изменяется объект fatfs, который объявлен в main.c. И строка:
*rfs = fs = FatFs[vol];
должна присваивать адрес объекта fatfs из main.c ссылке dj.fs, объявленной в функции f_open. И тогда, при обращении к dj.fs в функции f_open, я должен был бы получать значения fatfs.
На COM-порт приходит:
{02}{26}{FF}{25}{4F}{0E}{D0}{FF}{02}{26}{FF}{00}{00}{02}{67}{FF}{02}{26}{FF}{25}
{4F}{0E}{D0}
Сам адрес корневого каталога - 0x00000267 находится верно, но почему-то, при возврате из функции chk_mounted, значение dj.fs->dirbase становится не 0x00000267. Хотя, вроде бы, и адрес тот же - 0x0226.
При этом, в самом объекте fatfs значения изменяются нормально. Если после вызова функции f_open, написать:
Код
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[3]);
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[2]);
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[1]);
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[0]);
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[2]);
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[1]);
_putcUSART((BYTE) ((BYTE*)&(fatfs.dirbase))[0]);
то на COM-порт приходит то, что нужно:
{00}{00}{02}{67}
Похоже, что я где-то путаюсь в ссылках.
Помогите, пожалуйста, понять, где в этом коде ошибка.