Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема со ссылками?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
BaN
Пытаюсь прикрутить библиотеку FatFs к PIC18F452. Компилятор HI-TECH C Compiler for PIC18 MCUs (PRO) v9.63.
Не могу понять, почему работает не так, как нужно следующий код:

Файл 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(;;);
}

Файл 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;
}

В 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]);

то на COM-порт приходит то, что нужно:
{00}{00}{02}{67}
Похоже, что я где-то путаюсь в ссылках.
Помогите, пожалуйста, понять, где в этом коде ошибка.
BaN
Похоже, компилятору не нравятся двойные указатели.
После замены передачи в функцию chk_mounted параметра FATFS **rfs на DIR *dj код стал выполняться нормально.
Файл ff.c:
Код
#define BYTE0(x) ((BYTE*)&(x))[0]
#define BYTE1(x) ((BYTE*)&(x))[1]
#define BYTE2(x) ((BYTE*)&(x))[2]
#define BYTE3(x) ((BYTE*)&(x))[3]

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(BYTE3(FatFs[0]->dirbase));
_putcUSART(BYTE2(FatFs[0]->dirbase));
_putcUSART(BYTE1(FatFs[0]->dirbase));
_putcUSART(BYTE0(FatFs[0]->dirbase));
_putcUSART(0xFF);
_putcUSART(BYTE3(dj.fs->dirbase));
_putcUSART(BYTE2(dj.fs->dirbase));
_putcUSART(BYTE1(dj.fs->dirbase));
_putcUSART(BYTE0(dj.fs->dirbase));
_putcUSART(0xFF);
    res = chk_mounted(&path, &dj, (BYTE)(mode & ~FA_READ));
_putcUSART(BYTE3(dj.fs->dirbase));
_putcUSART(BYTE2(dj.fs->dirbase));
_putcUSART(BYTE1(dj.fs->dirbase));
_putcUSART(BYTE0(dj.fs->dirbase));
_putcUSART(0xFF);
_putcUSART(BYTE3(FatFs[0]->dirbase));
_putcUSART(BYTE2(FatFs[0]->dirbase));
_putcUSART(BYTE1(FatFs[0]->dirbase));
_putcUSART(BYTE0(FatFs[0]->dirbase));
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) */
    DIR *dj,        /* Pointer to directory 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;
...
    dj->fs = fs = FatFs[vol];                /* Return pointer to the corresponding file system object */
    // Далее идет работа с fs.
...
_putcUSART(BYTE3(dj->fs->dirbase));
_putcUSART(BYTE2(dj->fs->dirbase));
_putcUSART(BYTE1(dj->fs->dirbase));
_putcUSART(BYTE0(dj->fs->dirbase));
_putcUSART(0xFF);
    return FR_OK;
}

И на COM-порт приходит:
{00}{00}{00}{00}{FF}{00}{00}{00}{00}{FF}{00}{00}{02}{67}{FF}{00}{00}{02}{67}{FF}
{00}{00}{02}{67}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.