Sysprogs forums › Forums › VisualGDB › MBED SD Card File system not compiling on VisualGDB
- This topic has 6 replies, 2 voices, and was last updated 6 years, 3 months ago by support.
-
AuthorPosts
-
November 28, 2017 at 18:37 #13090rotemseParticipant
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_Htypedef 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
November 29, 2017 at 02:01 #13092supportKeymasterHi,
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).
December 14, 2017 at 13:06 #13285rotemseParticipantI 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?
December 14, 2017 at 13:14 #13286rotemseParticipantOne 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
December 14, 2017 at 22:22 #13290supportKeymasterHi,
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.
December 27, 2017 at 18:14 #13341rotemseParticipantStill 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
#elseWhat 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.
December 29, 2017 at 05:46 #13351supportKeymasterHi,
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.
-
AuthorPosts
- You must be logged in to reply to this topic.