From b5da4b76b5810b41900432832f178280069d8d91 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 3 Jan 2013 16:17:42 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5027 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/ARMCM4-STM32F407-DISCOVERY-G++/.project | 5 ++ demos/ARMCM4-STM32F407-DISCOVERY-G++/Makefile | 3 +- demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp | 2 +- os/fs/fatfs/fatfs_fsimpl.cpp | 93 +++++++++++++++++++++++++++ os/fs/fatfs/fatfs_fsimpl.hpp | 86 +++++++++++++++++++++++++ os/fs/fs.hpp | 3 +- os/various/cpp_wrappers/ch.cpp | 36 +++++++---- os/various/cpp_wrappers/ch.hpp | 55 +++++++--------- todo.txt | 4 +- 9 files changed, 238 insertions(+), 49 deletions(-) create mode 100644 os/fs/fatfs/fatfs_fsimpl.cpp create mode 100644 os/fs/fatfs/fatfs_fsimpl.hpp diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-G++/.project b/demos/ARMCM4-STM32F407-DISCOVERY-G++/.project index e5df63390..2e1e063fe 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-G++/.project +++ b/demos/ARMCM4-STM32F407-DISCOVERY-G++/.project @@ -81,6 +81,11 @@ 2 CHIBIOS/boards/ST_STM32F4_DISCOVERY + + fatfs + 2 + CHIBIOS/ext/fatfs + os 2 diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-G++/Makefile b/demos/ARMCM4-STM32F407-DISCOVERY-G++/Makefile index 55f9bb261..cd5388514 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-G++/Makefile +++ b/demos/ARMCM4-STM32F407-DISCOVERY-G++/Makefile @@ -89,6 +89,7 @@ CSRC = $(PORTSRC) \ # C++ sources that can be compiled in ARM or THUMB mode depending on the global # setting. CPPSRC = $(CHCPPSRC) \ + $(CHIBIOS)/os/fs/fatfs/fatfs_fsimpl.cpp \ main.cpp # C sources to be compiled in ARM mode regardless of the global setting. @@ -117,7 +118,7 @@ ASMSRC = $(PORTASM) INCDIR = $(PORTINC) $(KERNINC) $(TESTINC) \ $(HALINC) $(PLATFORMINC) $(BOARDINC) \ $(CHCPPINC) \ - $(CHIBIOS)/os/various $(CHIBIOS)/os/fs + $(CHIBIOS)/os/various $(CHIBIOS)/os/fs $(CHIBIOS)/os/fs/fatfs # # Project, sources and paths diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp b/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp index 3834a1046..d56a3f4c3 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp +++ b/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp @@ -92,7 +92,7 @@ private: const seqop_t *base, *curr; // Thread local variables. protected: - virtual msg_t Main(void) { + virtual msg_t main(void) { setName("sequencer"); diff --git a/os/fs/fatfs/fatfs_fsimpl.cpp b/os/fs/fatfs/fatfs_fsimpl.cpp new file mode 100644 index 000000000..8c9fd73c7 --- /dev/null +++ b/os/fs/fatfs/fatfs_fsimpl.cpp @@ -0,0 +1,93 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +/** + * @file fs_fatfs_impl.cpp + * @brief FatFS file system wrapper. + * + * @addtogroup fs_fatfs_wrapper + * @{ + */ + +#include "ch.hpp" +#include "fs.hpp" +#include "fatfs_fsimpl.hpp" +#include "hal.h" + +#define MSG_TERMINATE (msg_t)0 + +#define ERR_OK (msg_t)0 +#define ERR_TERMINATING (msg_t)1 +#define ERR_UNKNOWN_MSG (msg_t)2 + +/** + * @brief FatFS wrapper-related classes and interfaces. + */ +namespace chibios_fatfs { + + /*------------------------------------------------------------------------* + * chibios_fatfs::FatFSWrapper::FatFSServerThread * + *------------------------------------------------------------------------*/ + FatFSWrapper::FatFSServerThread::FatFSServerThread(::BaseBlockDevice *blkdev) : + BaseStaticThread(), + blkdev(blkdev) { + + start(FATFS_THREAD_PRIORITY); + } + + FatFSWrapper::FatFSServerThread::~FatFSServerThread() { + + sendMessage(MSG_TERMINATE); + wait(); + } + + msg_t FatFSWrapper::FatFSServerThread::main() { + msg_t sts; + + /* Synchronous messages processing loop.*/ + while (true) { + ThreadReference tr = waitMessage(); + msg_t msg = tr.getMessage(); + switch (msg) { + case MSG_TERMINATE: + /* The server object is being destroyed, terminating.*/ + tr.releaseMessage(ERR_TERMINATING); + return 0; + default: + sts = ERR_UNKNOWN_MSG; + } + tr.releaseMessage(sts); + } + } + + /*------------------------------------------------------------------------* + * chibios_fatfs::FatFSWrapper * + *------------------------------------------------------------------------*/ + FatFSWrapper::FatFSWrapper(::BaseBlockDevice *blkdev) : server(blkdev) { + + server.start(FATFS_THREAD_PRIORITY); + } + + FatFSWrapper::~FatFSWrapper() { + + server.~FatFSServerThread(); + } +} + +/** @} */ diff --git a/os/fs/fatfs/fatfs_fsimpl.hpp b/os/fs/fatfs/fatfs_fsimpl.hpp new file mode 100644 index 000000000..c8a454c3c --- /dev/null +++ b/os/fs/fatfs/fatfs_fsimpl.hpp @@ -0,0 +1,86 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file fs_fatfs_impl.hpp + * @brief FatFS file system wrapper header. + * + * @addtogroup cpp_library + * @{ + */ + +#include "ch.hpp" +#include "hal.h" + +#ifndef _FS_FATFS_IMPL_HPP_ +#define _FS_FATFS_IMPL_HPP_ + +/** + * @brief Stack size for the internal server thread. + */ +#if !defined(FATFS_THREAD_STACK_SIZE) || defined(__DOXYGEN__) +#define FATFS_THREAD_STACK_SIZE 1024 +#endif + +/** + * @brief Priority for the internal server thread. + */ +#if !defined(FATFS_THREAD_PRIORITY) || defined(__DOXYGEN__) +#define FATFS_THREAD_PRIORITY NORMALPRIO +#endif + +using namespace chibios_rt; + +/** + * @brief FatFS wrapper-related classes and interfaces. + */ +namespace chibios_fatfs { + + /*------------------------------------------------------------------------* + * chibios_fatfs::FatFSWrapper * + *------------------------------------------------------------------------*/ + /** + * @brief Class of the FatFS wrapper. + */ + class FatFSWrapper : public chibios_fs::BaseFileSystemInterface { + protected: + /** + * @brief Class of the internal server thread. + */ + class FatFSServerThread : public BaseStaticThread { + private: + ::BaseBlockDevice *blkdev; + protected: + virtual msg_t main(void); + public: + FatFSServerThread(::BaseBlockDevice *blkdev); + ~FatFSServerThread(); + } server; + + public: + FatFSWrapper(::BaseBlockDevice *blkdev); + + ~FatFSWrapper(); + }; +} + +#endif /* _FS_FATFS_IMPL_HPP_ */ + +/** @} */ diff --git a/os/fs/fs.hpp b/os/fs/fs.hpp index 57f776844..1ba2cfdc2 100644 --- a/os/fs/fs.hpp +++ b/os/fs/fs.hpp @@ -29,7 +29,7 @@ #ifndef _FS_HPP_ #define _FS_HPP_ -#include +#include "ch.hpp" /** * @name Error codes @@ -122,6 +122,7 @@ namespace chibios_fs { * classes can offer an extended interface. */ class BaseFileSystemInterface { + public: /** * @brief File system unmount and object destruction. */ diff --git a/os/various/cpp_wrappers/ch.cpp b/os/various/cpp_wrappers/ch.cpp index 6751dc391..e8db4c013 100644 --- a/os/various/cpp_wrappers/ch.cpp +++ b/os/various/cpp_wrappers/ch.cpp @@ -188,6 +188,16 @@ namespace chibios_rt { return (bool)chMsgIsPendingI(thread_ref); } + + msg_t ThreadReference::getMessage(void) { + + return chMsgGet(thread_ref); + } + + void ThreadReference::releaseMessage(msg_t msg) { + + chMsgRelease(thread_ref, msg); + } #endif /* CH_USE_MESSAGES */ #if CH_USE_EVENTS @@ -212,9 +222,21 @@ namespace chibios_rt { } + msg_t BaseThread::main(void) { + + return 0; + } + + ThreadReference BaseThread::start(tprio_t prio) { + + (void)prio; + + return *this; + }; + msg_t _thd_start(void *arg) { - return ((BaseThread *)arg)->Main(); + return ((BaseThread *)arg)->main(); } void BaseThread::setName(const char *tname) { @@ -257,18 +279,6 @@ namespace chibios_rt { chThdYield(); } -#if CH_USE_MESSAGES - msg_t BaseThread::getMessage(ThreadReference* trp) { - - return chMsgGet(trp->thread_ref); - } - - void BaseThread::releaseMessage(ThreadReference* trp, msg_t msg) { - - chMsgRelease(trp->thread_ref, msg); - } -#endif /* CH_USE_MESSAGES */ - #if CH_USE_EVENTS eventmask_t BaseThread::getAndClearEvents(eventmask_t mask) { diff --git a/os/various/cpp_wrappers/ch.hpp b/os/various/cpp_wrappers/ch.hpp index 2f2d5bfe0..05bc1b33d 100644 --- a/os/various/cpp_wrappers/ch.hpp +++ b/os/various/cpp_wrappers/ch.hpp @@ -221,7 +221,7 @@ namespace chibios_rt { * * @init */ - ThreadReference(Thread * tp) : thread_ref(tp) { + ThreadReference(Thread *tp) : thread_ref(tp) { }; @@ -330,6 +330,26 @@ namespace chibios_rt { * @api */ bool isPendingMessage(void); + + /** + * @brief Returns an enqueued message or @p NULL. + * + * @param[in] trp the sender thread reference + * @return The incoming message. + * + * @api + */ + msg_t getMessage(void); + + /** + * @brief Releases the next message in queue with a reply. + * + * @param[in] trp the sender thread reference + * @param[in] msg the answer message + * + * @api + */ + void releaseMessage(msg_t msg); #endif /* CH_USE_MESSAGES */ #if CH_USE_EVENTS || defined(__DOXYGEN__) @@ -380,9 +400,7 @@ namespace chibios_rt { * * @api */ - virtual msg_t Main(void) { - return 0; - }; + virtual msg_t main(void); /** * @brief Creates and starts a system thread. @@ -393,12 +411,7 @@ namespace chibios_rt { * * @api */ - virtual ThreadReference start(tprio_t prio) { - - (void)prio; - - return *this; - }; + virtual ThreadReference start(tprio_t prio); /** * @brief Sets the current thread name. @@ -510,26 +523,6 @@ namespace chibios_rt { * @api */ static ThreadReference waitMessage(void); - - /** - * @brief Returns an enqueued message or @p NULL. - * - * @param[in] trp the sender thread reference - * @return The incoming message. - * - * @api - */ - static msg_t getMessage(ThreadReference* trp); - - /** - * @brief Releases the next message in queue with a reply. - * - * @param[in] trp the sender thread reference - * @param[in] msg the answer message - * - * @api - */ - static void releaseMessage(ThreadReference* trp, msg_t msg); #endif /* CH_USE_MESSAGES */ #if CH_USE_EVENTS || defined(__DOXYGEN__) @@ -750,7 +743,7 @@ namespace chibios_rt { * * @api */ - ThreadReference start(tprio_t prio) { + virtual ThreadReference start(tprio_t prio) { msg_t _thd_start(void *arg); thread_ref = chThdCreateStatic(wa, sizeof(wa), prio, _thd_start, this); diff --git a/todo.txt b/todo.txt index 9b08762aa..d4f413d71 100644 --- a/todo.txt +++ b/todo.txt @@ -14,14 +14,14 @@ X Support for ATSAM4L devices. - Support for SPC56xA devices. - Restructure and improve documentation. X Update C++ wrapper. +X File System infrastructure. + - FatFs wrapper. Within 2.5.x: - SAM4L support. - Recursive mutexes. X SPC56x support. X Revision of the RTCv2 driver implementation. -X File System infrastructure. - - FatFs wrapper. X Streaming DAC/I2S driver model and STM32 implementation. - Specific I2C driver for STM32F0 and newer devices. - STM32 CAN2 support. -- cgit v1.2.3