MBED SD Card File system not compiling on VisualGDB

Sysprogs forums Forums VisualGDB MBED SD Card File system not compiling on VisualGDB

Viewing 7 posts - 1 through 7 (of 7 total)
  • Author
    Posts
  • #13090
    rotemse
    Participant

    Hi

    I am using VisualGDB with MBED STM32L476 (DISCO L476).

    I want to interface the CPU to a SD card. I imported the SD Card File system

    https://os.mbed.com/cookbook/SD-Card-File-System

    Which is debugged, compiles and works great on MBED compiler.

    The problem is I get these bugs in FATFileHandle.h after compilation in VisualGDB:

    conflicting return type specified for ‘virtual off_t FATFileHandle::size()’   

    #ifndef MBED_FATFILEHANDLE_H
    #define MBED_FATFILEHANDLE_H

    #include “FileHandle.h”

    using namespace mbed;

    class FATFileHandle : public FileHandle {
    public:

    FATFileHandle(FIL fh);
    virtual int close();
    virtual ssize_t write(const void* buffer, size_t length);
    virtual ssize_t read(void* buffer, size_t length);
    virtual int isatty();
    virtual off_t lseek(off_t position, int whence);
    virtual int fsync();
    virtual off_t flen();

    virtual off_t seek(off_t position, int whence) { return lseek(position, whence); }
    virtual off_t size() { return flen(); }

    protected:

    FIL _fh;

    };

    #endif

     

    and also in FileHandle.h:

       overriding ‘virtual size_t mbed::FileHandle::size()’

     

    #ifndef MBED_FILEHANDLE_H
    #define MBED_FILEHANDLE_H

    typedef int FILEHANDLE;

    #include <stdio.h>
    #include “platform/platform.h”

    namespace mbed {
    /** \addtogroup drivers */
    /** @{*/

    /** Class FileHandle
    *
    *  An abstract interface that represents operations on a file-like
    *  object. The core functions are read, write, and seek, but only
    *  a subset of these operations can be provided.
    *
    *  @note to create a file, @see File
    *  @note Synchronization level: Set by subclass
    */
    class FileHandle {
    public:
    virtual ~FileHandle() {}

    /** Read the contents of a file into a buffer
    *
    *  @param buffer   The buffer to read in to
    *  @param size     The number of bytes to read
    *  @return         The number of bytes read, 0 at end of file, negative error on failure
    */
    virtual ssize_t read(void *buffer, size_t size) = 0;

    /** Write the contents of a buffer to a file
    *
    *  @param buffer   The buffer to write from
    *  @param size     The number of bytes to write
    *  @return         The number of bytes written, negative error on failure
    */
    virtual ssize_t write(const void *buffer, size_t size) = 0;

    /** Move the file position to a given offset from from a given location
    *
    *  @param offset   The offset from whence to move to
    *  @param whence   The start of where to seek
    *      SEEK_SET to start from beginning of file,
    *      SEEK_CUR to start from current position in file,
    *      SEEK_END to start from end of file
    *  @return         The new offset of the file
    */
    virtual off_t seek(off_t offset, int whence = SEEK_SET) = 0;

    /** Close a file
    *
    *  @return         0 on success, negative error code on failure
    */
    virtual int close() = 0;

    /** Flush any buffers associated with the file
    *
    *  @return         0 on success, negative error code on failure
    */
    virtual int sync()
    {
    return 0;
    }

    /** Check if the file in an interactive terminal device
    *
    *  @return         True if the file is a terminal
    */
    virtual int isatty()
    {
    return false;
    }

    /** Get the file position of the file
    *
    *  @note This is equivalent to seek(0, SEEK_CUR)
    *
    *  @return         The current offset in the file
    */
    virtual off_t tell()
    {
    return seek(0, SEEK_CUR);
    }

    /** Rewind the file position to the beginning of the file
    *
    *  @note This is equivalent to seek(0, SEEK_SET)
    */
    virtual void rewind()
    {
    seek(0, SEEK_SET);
    }

    /** Get the size of the file
    *
    *  @return         Size of the file in bytes
    */
    virtual size_t size()
    {
    off_t off = tell();
    size_t size = seek(0, SEEK_END);
    seek(off, SEEK_SET);
    return size;
    }

    /** Move the file position to a given offset from a given location.
    *
    *  @param offset The offset from whence to move to
    *  @param whence SEEK_SET for the start of the file, SEEK_CUR for the
    *   current file position, or SEEK_END for the end of the file.
    *
    *  @returns
    *    new file position on success,
    *    -1 on failure or unsupported
    */
    MBED_DEPRECATED_SINCE(“mbed-os-5.4”, “Replaced by FileHandle::seek”)
    virtual off_t lseek(off_t offset, int whence) { return seek(offset, whence); }

    /** Flush any buffers associated with the FileHandle, ensuring it
    *  is up to date on disk
    *
    *  @returns
    *    0 on success or un-needed,
    *   -1 on error
    */
    MBED_DEPRECATED_SINCE(“mbed-os-5.4”, “Replaced by FileHandle::sync”)
    virtual int fsync() { return sync(); }

    /** Find the length of the file
    *
    *  @returns
    *   Length of the file
    */
    MBED_DEPRECATED_SINCE(“mbed-os-5.4”, “Replaced by FileHandle::size”)
    virtual off_t flen() { return size(); }
    };

    /** @}*/
    } // namespace mbed

    #endif

     

    #13092
    support
    Keymaster

    Hi,

    This could be the case if the 3rd-party code you are trying to import was not compatible with GCC (the compiler used by VisualGDB that is different from the online mbed compiler). The “conflicting return type” error usually points to several locations where a method is defined/declared (implying that those locations have different return type specification). We would advise double-checking those locations (e.g. one of them might be after including a header file that redefines off_t). You can also use the “generate preprocessor output” option in VS File Properties to get the fully preprocessed output of the corresponding source files (that will expand all #define and #include directives making it easier to understand cryptic error messages).

    #13285
    rotemse
    Participant

    I got this to compile, however, the SD card still doesn’t work.

    the same project from MBED online compiler doesn’t work on VisualGDB.

    the “mkdir” command does not invoke the function from fatfilesystem.h., instead it points to stdio.h

    What can be done?

    the line FILE *fp = fopen(“/sd/123.txt”, “r”);

    gives me the error “cannot open file for write”

    and program stops execution.

    it’s like the compiler doesn’t see the line:

    SDFileSystem sd(PD_4, PD_3, PD_1, PA_1, “sd”);

    in the declaration.

    If I comment it out, it behaves the same (as if I never wrote it)

    what can be done?

    #13286
    rotemse
    Participant

    One more update:

    if I put the line: SDFileSystem sd(PD_4, PD_3, PD_1, PA_1, “sd”);

    inside main, I get this run time error and the program stops execution on this line:

     

    Couldn’t create sd in FATFileSystem::FATFileSystem

     

    #13290
    support
    Keymaster

    Hi,

    The fatfs module might not be providing hooks to replace the built-in system calls fopen() using the GCC compiler. Please review the sources of the FatFS library and check if it provides its own versions of fopen() and other similar functions that you could call directly.

    #13341
    rotemse
    Participant

    Still struggling with SD card to interface with VisualGDB.

    I imported an MBED library called  SDBlockDevice

    And now I get the error that my MBED version in VisualGDB is not high enough.

     

    #ifdef MBED_MAJOR_VERSION
    #if (MBED_VERSION < MBED_ENCODE_VERSION(5,6,1))
    #error “Incompatible mbed-os version detected! Required 5.5.4 and above”
    #endif
    #else

    What Can I do?

    How do I check my version?

    How Do I upgrade my version in the project?

    • This reply was modified 6 years, 3 months ago by rotemse.
    #13351
    support
    Keymaster

    Hi,

    You can check the mbed version used by VisualGDB via Tools->VisualGDB->Manage VisualGDB Packages. The latest version shipped with VisualGDB is 5.6.3, so the code in this example should normally work.

    If you are getting strange mbed-related errors, you could also try importing the project directly from mbed-cli as shown in this tutorial.

Viewing 7 posts - 1 through 7 (of 7 total)
  • You must be logged in to reply to this topic.