2016-07-27 34 views
0

Ich bin mit FAT API zur Verfügung gestellt von ASF FREERTOS_USED definieren, Daten aus dem Flash zu lesen,Atmel UC3A0512 FAT API Probleme nach Symbol

Der FAT-API eine globale Variable verwendet fs_g_status Debuggen, um die Probleme zu helfen, aber es scheint, dass fs_g_status nimmt sinnlose Werte:

Mögliche Werte für fs_g_status:

#define FS_ERR_HW    (FAIL+0) //!< Hardware driver error 
#define FS_ERR_NO_FORMAT  (FAIL+1) //!< The selected drive isn't formated 
#define FS_ERR_NO_PART   (FAIL+2) //!< The selected partition doesn't existed 
#define FS_ERR_NO_SUPPORT_PART (FAIL+3) //!< The selected partition isn't supported 
#define FS_ERR_TOO_FILE_OPEN (FAIL+4) //!< The navigation have already opened a file 
#define FS_ERR_END_OF_DRIVE  (FAIL+5) //!< There are not other driver 
#define FS_ERR_BAD_POS   (FAIL+6) //!< The position is over the file 
#define FS_ERR_FS    (FAIL+7) //!< File system error 
#define FS_ERR_NO_FIND   (FAIL+8) //!< File no found 
#define FS_ERR_ENTRY_EMPTY  (FAIL+9) //!< File entry empty 
#define FS_ERR_ENTRY_BAD  (FAIL+10) //!< File entry bad 
#define FS_ERR_ENTRY_BADTYPE (FAIL+11) //!< File entry type don't corresponding 
#define FS_ERR_NO_DIR   (FAIL+12) //!< The selected file isn't a directory 
#define FS_ERR_NO_MOUNT   (FAIL+13) //!< The partition isn't mounted 
#define FS_ERR_NO_FILE_SEL  (FAIL+14) //!< There are no selected file 
#define FS_NO_LAST_LFN_ENTRY (FAIL+15) //!< The file entry isn't the last long file entry 

#define FS_ERR_ID_FILE   (FAIL+17) //!< The file identifier is bad 
#define FS_ERR_NO_FILE   (FAIL+18) //!< The selected file entry isn't a file 
#define FS_LUN_WP    (FAIL+19) //!< Drive is in read only mode 
#define FS_ERR_READ_ONLY  (FAIL+20) //!< File is on read access only 
#define FS_ERR_NAME_INCORRECT (FAIL+21) //!< The name don't corresponding at the filter name 
//... 

mit

#define FAIL  1 

Dies ist die Funktion i Daten aus dem Flash zu lesen verwenden, um

int read_Flash_Data() 
{ 
    /* initialize FSACCESS mutex and navigators */ 
    if (b_fsaccess_init()) 
    { 
    usart_write_line((&AVR32_USART0), " b_fsaccess_init return true \r\n"); 
    } 
    //fs_g_status = 0x00 OK 

    /* Try to init data flash */ 
    if (at45dbx_mem_check()) 
    { 
    /* display message */ 
    usart_write_line((&AVR32_USART0), " at45dbx_mem_check return true \r\n"); 
} 
else 
{ 
    /* display error message */ 
    usart_write_line((&AVR32_USART0)," at45dbx_mem_check return false\r\n"); 
    return (-1); 
} 
//fs_g_status = 0x00 OK 

if (nav_drive_set(LUN_ID_1) == false) 
{ 
    usart_write_line((&AVR32_USART0)," nav_drive_set return false \r\n"); 
    return (-1); 
} 
//fs_g_status = 0x01 ==> Hardware driver error NOK , but the nav_drive_set(LUN_ID_1) return true !!!! 

if(!nav_partition_mount()) 
{ 
    usart_write_line((&AVR32_USART0),"nav_partition_mount return false \r\n"); 
    return (-1); 
} 
//fs_g_status = 0x04 ==> The navigation have already opened a file, but the nav_partition_mount() return true !!!! 

if ((ret = open(ACTUAL_CONFIG_FILE_PATH, O_RDONLY)) < 0) 
{ 
    usart_write_line((&AVR32_USART0),"Opening file failed \r\n"); 
    return (-1); 
} 
//fs_g_status = 0x10 ==16(decimal) open return true !!!! 
//... 
} 

Ich denke, dass dies nicht logisch ist, sollte fs_g_status nur, wenn die Funktionen return false gesetzt werden. OK sagen wir, dass es kleinere Probleme und große Probleme gibt, die dazu führen, dass die Funktionen fehlschlagen und die Kommentare nicht gut genug sind.

Nun wird diese Funktion in einer freeRTOS-Task verwendet und ich muss das Symbol FREERTOS_USED in der Kompilation definieren, um den Flash in concurent access zu schützen, in der obigen Beschreibung wurde das Symbol nicht definiert. und jetzt nav_partition_mount() zurückgeben false und fs_g_status = 0x01.

Kommt jemand auf das Problem Ich kann nicht scheinen, Wege zu finden, das Problem zu debuggen, ist jeder Vorschlag willkommen.

Antwort

1

Sie haben vergessen, die ctrl_access_semphr, zu initialisieren, müssen Sie die in definierte Funktion ctrl_access_init verwenden.

#ifdef FREERTOS_USED 

bool ctrl_access_init(void) 
{ 
// If the handle to the protecting semaphore is not valid, 
if (!ctrl_access_semphr) 
{ 
    // try to create the semaphore. 
    vSemaphoreCreateBinary(ctrl_access_semphr); 

    // If the semaphore could not be created, there is no backup solution. 
    if (!ctrl_access_semphr) return false; 
    } 

return true; 
} 
#endif 

Ihre Funktion sollte wie folgt aussehen:

int read_Flash_Data() 
{ 
    /* initialize FSACCESS mutex and navigators */ 
    if (b_fsaccess_init()) 
    { 
    usart_write_line((&AVR32_USART0), " b_fsaccess_init return true \r\n"); 
    } 

    /* initialize ctrl_access semaphore */ 
    if (ctrl_access_init()) 
    { 
    usart_write_line((&AVR32_USART0), " ctrl_access_init return true \r\n"); 
    } 
    //......