git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@5027 35acf78f-673a-0410-8e92-d51de3d6d3f4

This commit is contained in:
gdisirio 2013-01-03 16:17:42 +00:00
parent 05c30c4e65
commit b5da4b76b5
9 changed files with 238 additions and 49 deletions

View File

@ -81,6 +81,11 @@
<type>2</type>
<locationURI>CHIBIOS/boards/ST_STM32F4_DISCOVERY</locationURI>
</link>
<link>
<name>fatfs</name>
<type>2</type>
<locationURI>CHIBIOS/ext/fatfs</locationURI>
</link>
<link>
<name>os</name>
<type>2</type>

View File

@ -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

View File

@ -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");

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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<FATFS_THREAD_STACK_SIZE>(),
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();
}
}
/** @} */

View File

@ -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 <http://www.gnu.org/licenses/>.
*/
/**
* @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<FATFS_THREAD_STACK_SIZE> {
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_ */
/** @} */

View File

@ -29,7 +29,7 @@
#ifndef _FS_HPP_
#define _FS_HPP_
#include <ch.hpp>
#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.
*/

View File

@ -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) {

View File

@ -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);

View File

@ -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.