diff options
| -rw-r--r-- | demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp | 5 | ||||
| -rw-r--r-- | os/fs/fatfs/fatfs_fsimpl.cpp | 23 | ||||
| -rw-r--r-- | os/fs/fatfs/fatfs_fsimpl.hpp | 18 | ||||
| -rw-r--r-- | os/various/cpp_wrappers/ch.cpp | 110 | ||||
| -rw-r--r-- | os/various/cpp_wrappers/ch.hpp | 55 | 
5 files changed, 133 insertions, 78 deletions
diff --git a/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp b/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp index 2275d6702..426d2b336 100644 --- a/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp +++ b/demos/ARMCM4-STM32F407-DISCOVERY-G++/main.cpp @@ -151,7 +151,7 @@ static SequencerThread blinker2(LED4_sequence);  static SequencerThread blinker3(LED5_sequence);
  static SequencerThread blinker4(LED6_sequence);
 -static FatFSWrapper fs(NULL);
 +static FatFSWrapper fs;
  /*
   * Application entry point.
 @@ -168,6 +168,9 @@ int main(void) {    halInit();
    System::init();
 +  fs.mount();
 +  fs.unmount();
 +
    /*
     * Activates the serial driver 2 using the driver default configuration.
     * PA2(TX) and PA3(RX) are routed to USART2.
 diff --git a/os/fs/fatfs/fatfs_fsimpl.cpp b/os/fs/fatfs/fatfs_fsimpl.cpp index e42c11e50..4fd071f00 100644 --- a/os/fs/fatfs/fatfs_fsimpl.cpp +++ b/os/fs/fatfs/fatfs_fsimpl.cpp @@ -47,9 +47,8 @@ namespace chibios_fatfs {    /*------------------------------------------------------------------------*
     * chibios_fatfs::FatFSWrapper::FatFSServerThread                         *
     *------------------------------------------------------------------------*/
 -  FatFSWrapper::FatFSServerThread::FatFSServerThread(::BaseBlockDevice *blkdev) :
 -      BaseStaticThread<FATFS_THREAD_STACK_SIZE>(),
 -      blkdev(blkdev) {
 +  FatFSWrapper::FatFSServerThread::FatFSServerThread(void) :
 +      BaseStaticThread<FATFS_THREAD_STACK_SIZE>() {
      start(FATFS_THREAD_PRIORITY);
    }
 @@ -79,18 +78,28 @@ namespace chibios_fatfs {      }
    }
 +  void FatFSWrapper::FatFSServerThread::stop(void) {
 +
 +    sendMessage(MSG_TERMINATE);
 +    wait();
 +  }
 +
    /*------------------------------------------------------------------------*
     * chibios_fatfs::FatFSWrapper                                           *
     *------------------------------------------------------------------------*/
 -  FatFSWrapper::FatFSWrapper(::BaseBlockDevice *blkdev) : server(blkdev) {
 +  FatFSWrapper::FatFSWrapper(void) {
 +
 +  }
 +
 +  void FatFSWrapper::mount(void) {
      server.start(FATFS_THREAD_PRIORITY);
    }
 -/*  FatFSWrapper::~FatFSWrapper() {
 +  void FatFSWrapper::unmount(void) {
 -    server.~FatFSServerThread();
 -  }*/
 +    server.stop();
 +  }
    uint32_t FatFSWrapper::getAndClearLastError(void) {
 diff --git a/os/fs/fatfs/fatfs_fsimpl.hpp b/os/fs/fatfs/fatfs_fsimpl.hpp index 8c61c5748..cdb46bc66 100644 --- a/os/fs/fatfs/fatfs_fsimpl.hpp +++ b/os/fs/fatfs/fatfs_fsimpl.hpp @@ -28,7 +28,6 @@  #include "ch.hpp"
  #include "fs.hpp"
 -#include "hal.h"
  #ifndef _FS_FATFS_IMPL_HPP_
  #define _FS_FATFS_IMPL_HPP_
 @@ -67,16 +66,15 @@ namespace chibios_fatfs {       * @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(void);
 +      virtual void stop(void);
      } server;
    public:
 -    FatFSWrapper(::BaseBlockDevice *blkdev);
 +    FatFSWrapper(void);
      virtual uint32_t getAndClearLastError(void);
      virtual void synchronize(void);
      virtual void remove(const char *fname);
 @@ -84,6 +82,16 @@ namespace chibios_fatfs {      virtual BaseFileStreamInterface *openForRead(const char *fname);
      virtual BaseFileStreamInterface *openForWrite(const char *fname);
      virtual BaseFileStreamInterface *create(const char *fname);
 +
 +    /**
 +     * @brief   Mounts the file system.
 +     */
 +    void mount(void);
 +
 +    /**
 +     * @brief   Unmounts the file system.
 +     */
 +    void unmount(void);
    };
  }
 diff --git a/os/various/cpp_wrappers/ch.cpp b/os/various/cpp_wrappers/ch.cpp index 5191f2748..c971a90aa 100644 --- a/os/various/cpp_wrappers/ch.cpp +++ b/os/various/cpp_wrappers/ch.cpp @@ -97,6 +97,12 @@ namespace chibios_rt {    /*------------------------------------------------------------------------*
     * chibios_rt::ThreadReference                                            *
     *------------------------------------------------------------------------*/
 +
 +  void ThreadReference::stop(void) {
 +
 +    chDbgPanic("invoked unimplemented method stop()");
 +  }
 +
    msg_t ThreadReference::suspend(void) {
      msg_t msg;
 @@ -158,6 +164,10 @@ namespace chibios_rt {    void ThreadReference::requestTerminate(void) {
 +    chDbgAssert(thread_ref != NULL,
 +                "ThreadReference, #5",
 +                "not referenced");
 +
      chThdTerminate(thread_ref);
    }
 @@ -165,7 +175,7 @@ namespace chibios_rt {      msg_t ThreadReference::wait(void) {
        chDbgAssert(thread_ref != NULL,
 -                  "ThreadReference, #5",
 +                  "ThreadReference, #6",
                    "not referenced");
        msg_t msg = chThdWait(thread_ref);
 @@ -178,7 +188,7 @@ namespace chibios_rt {    msg_t ThreadReference::sendMessage(msg_t msg) {
      chDbgAssert(thread_ref != NULL,
 -                "ThreadReference, #6",
 +                "ThreadReference, #7",
                  "not referenced");
      return chMsgSend(thread_ref, msg);
 @@ -186,16 +196,28 @@ namespace chibios_rt {    bool ThreadReference::isPendingMessage(void) {
 +    chDbgAssert(thread_ref != NULL,
 +                "ThreadReference, #7",
 +                "not referenced");
 +
      return (bool)chMsgIsPendingI(thread_ref);
    }
    msg_t ThreadReference::getMessage(void) {
 +    chDbgAssert(thread_ref != NULL,
 +                "ThreadReference, #8",
 +                "not referenced");
 +
      return chMsgGet(thread_ref);
    }
    void ThreadReference::releaseMessage(msg_t msg) {
 +    chDbgAssert(thread_ref != NULL,
 +                "ThreadReference, #9",
 +                "not referenced");
 +
      chMsgRelease(thread_ref, msg);
    }
  #endif /* CH_USE_MESSAGES */
 @@ -203,11 +225,19 @@ namespace chibios_rt {  #if CH_USE_EVENTS
      void ThreadReference::signalEvents(eventmask_t mask) {
 +      chDbgAssert(thread_ref != NULL,
 +                  "ThreadReference, #10",
 +                  "not referenced");
 +
        chEvtSignal(thread_ref, mask);
      }
      void ThreadReference::signalEventsI(eventmask_t mask) {
 +      chDbgAssert(thread_ref != NULL,
 +                  "ThreadReference, #11",
 +                  "not referenced");
 +
        chEvtSignalI(thread_ref, mask);
      }
  #endif /* CH_USE_EVENTS */
 @@ -359,66 +389,66 @@ namespace chibios_rt {  #if CH_USE_SEMAPHORES
    /*------------------------------------------------------------------------*
 -   * chibios_rt::Semaphore                                                  *
 +   * chibios_rt::CounterSemaphore                                           *
     *------------------------------------------------------------------------*/
 -  Semaphore::Semaphore(cnt_t n) {
 +  CounterSemaphore::CounterSemaphore(cnt_t n) {
      chSemInit(&sem, n);
    }
 -  void Semaphore::reset(cnt_t n) {
 +  void CounterSemaphore::reset(cnt_t n) {
      chSemReset(&sem, n);
    }
 -  void Semaphore::resetI(cnt_t n) {
 +  void CounterSemaphore::resetI(cnt_t n) {
      chSemResetI(&sem, n);
    }
 -  msg_t Semaphore::wait(void) {
 +  msg_t CounterSemaphore::wait(void) {
      return chSemWait(&sem);
    }
 -  msg_t Semaphore::waitS(void) {
 +  msg_t CounterSemaphore::waitS(void) {
      return chSemWaitS(&sem);
    }
 -  msg_t Semaphore::waitTimeout(systime_t time) {
 +  msg_t CounterSemaphore::waitTimeout(systime_t time) {
      return chSemWaitTimeout(&sem, time);
    }
 -  msg_t Semaphore::waitTimeoutS(systime_t time) {
 +  msg_t CounterSemaphore::waitTimeoutS(systime_t time) {
      return chSemWaitTimeoutS(&sem, time);
    }
 -  void Semaphore::signal(void) {
 +  void CounterSemaphore::signal(void) {
      chSemSignal(&sem);
    }
 -  void Semaphore::signalI(void) {
 +  void CounterSemaphore::signalI(void) {
      chSemSignalI(&sem);
    }
 -  void Semaphore::addCounterI(cnt_t n) {
 +  void CounterSemaphore::addCounterI(cnt_t n) {
      chSemAddCounterI(&sem, n);
    }
 -  cnt_t Semaphore::getCounterI(void) {
 +  cnt_t CounterSemaphore::getCounterI(void) {
      return chSemGetCounterI(&sem);
    }
  #if CH_USE_SEMSW
 -  msg_t Semaphore::signalWait(chibios_rt::Semaphore *ssem,
 -                              chibios_rt::Semaphore *wsem) {
 +  msg_t CounterSemaphore::signalWait(CounterSemaphore *ssem,
 +                                     CounterSemaphore *wsem) {
      return chSemSignalWait(&ssem->sem, &wsem->sem);
    }
 @@ -607,110 +637,108 @@ namespace chibios_rt {  #if CH_USE_QUEUES
    /*------------------------------------------------------------------------*
 -   * chibios_rt::InputQueue                                                 *
 +   * chibios_rt::InQueue                                                    *
     *------------------------------------------------------------------------*/
 -  InputQueue::InputQueue(uint8_t *bp, size_t size,
 -                         qnotify_t infy, void *link) {
 +  InQueue::InQueue(uint8_t *bp, size_t size, qnotify_t infy, void *link) {
      chIQInit(&iq, bp, size, infy, link);
    }
 -  size_t InputQueue::getFullI(void) {
 +  size_t InQueue::getFullI(void) {
      return chIQGetFullI(&iq);
    }
 -  size_t InputQueue::getEmptyI(void) {
 +  size_t InQueue::getEmptyI(void) {
      return chIQGetEmptyI(&iq);
    }
 -  bool InputQueue::isEmptyI(void) {
 +  bool InQueue::isEmptyI(void) {
      return (bool)chIQIsEmptyI(&iq);
    }
 -  bool InputQueue::isFullI(void) {
 +  bool InQueue::isFullI(void) {
      return (bool)chIQIsFullI(&iq);
    }
 -  void InputQueue::resetI(void) {
 +  void InQueue::resetI(void) {
      chIQResetI(&iq);
    }
 -  msg_t InputQueue::putI(uint8_t b) {
 +  msg_t InQueue::putI(uint8_t b) {
      return chIQPutI(&iq, b);
    }
 -  msg_t InputQueue::get() {
 +  msg_t InQueue::get() {
      return chIQGet(&iq);
    }
 -  msg_t InputQueue::getTimeout(systime_t time) {
 +  msg_t InQueue::getTimeout(systime_t time) {
      return chIQGetTimeout(&iq, time);
    }
 -  size_t InputQueue::readTimeout(uint8_t *bp, size_t n, systime_t time) {
 +  size_t InQueue::readTimeout(uint8_t *bp, size_t n, systime_t time) {
      return chIQReadTimeout(&iq, bp, n, time);
    }
    /*------------------------------------------------------------------------*
 -   * chibios_rt::OutputQueue                                                *
 +   * chibios_rt::OutQueue                                                   *
     *------------------------------------------------------------------------*/
 -  OutputQueue::OutputQueue(uint8_t *bp, size_t size,
 -                           qnotify_t onfy, void *link) {
 +  OutQueue::OutQueue(uint8_t *bp, size_t size, qnotify_t onfy, void *link) {
      chOQInit(&oq, bp, size, onfy, link);
    }
 -  size_t OutputQueue::getFullI(void) {
 +  size_t OutQueue::getFullI(void) {
      return chOQGetFullI(&oq);
    }
 -  size_t OutputQueue::getEmptyI(void) {
 +  size_t OutQueue::getEmptyI(void) {
      return chOQGetEmptyI(&oq);
    }
 -  bool OutputQueue::isEmptyI(void) {
 +  bool OutQueue::isEmptyI(void) {
      return (bool)chOQIsEmptyI(&oq);
    }
 -  bool OutputQueue::isFullI(void) {
 +  bool OutQueue::isFullI(void) {
      return (bool)chOQIsFullI(&oq);
    }
 -  void OutputQueue::resetI(void) {
 +  void OutQueue::resetI(void) {
      chOQResetI(&oq);
    }
 -  msg_t OutputQueue::put(uint8_t b) {
 +  msg_t OutQueue::put(uint8_t b) {
      return chOQPut(&oq, b);
    }
 -  msg_t OutputQueue::putTimeout(uint8_t b, systime_t time) {
 +  msg_t OutQueue::putTimeout(uint8_t b, systime_t time) {
      return chOQPutTimeout(&oq, b, time);
    }
 -  msg_t OutputQueue::getI(void) {
 +  msg_t OutQueue::getI(void) {
      return chOQGetI(&oq);
    }
 -  size_t OutputQueue::writeTimeout(const uint8_t *bp, size_t n,
 -                                   systime_t time) {
 +  size_t OutQueue::writeTimeout(const uint8_t *bp, size_t n,
 +                                systime_t time) {
      return chOQWriteTimeout(&oq, bp, n, time);
    }
 diff --git a/os/various/cpp_wrappers/ch.hpp b/os/various/cpp_wrappers/ch.hpp index 370b9a3f2..6e41cea6e 100644 --- a/os/various/cpp_wrappers/ch.hpp +++ b/os/various/cpp_wrappers/ch.hpp @@ -226,6 +226,13 @@ namespace chibios_rt {      };
      /**
 +     * @brief   Stops the thread.
 +     * @note    The implementation is left to descendant classes and is
 +     *          optional.
 +     */
 +    virtual void stop(void);
 +
 +    /**
       * @brief   Suspends the current thread on the reference.
       * @details The suspended thread becomes the referenced thread. It is
       *          possible to use this method only if the thread reference
 @@ -752,12 +759,12 @@ namespace chibios_rt {  #if CH_USE_SEMAPHORES || defined(__DOXYGEN__)
    /*------------------------------------------------------------------------*
 -   * chibios_rt::Semaphore                                                  *
 +   * chibios_rt::CounterSemaphore                                           *
     *------------------------------------------------------------------------*/
    /**
     * @brief   Class encapsulating a semaphore.
     */
 -  class Semaphore {
 +  class CounterSemaphore {
    public:
      /**
       * @brief   Embedded @p ::Semaphore structure.
 @@ -765,7 +772,7 @@ namespace chibios_rt {      ::Semaphore sem;
      /**
 -     * @brief   Semaphore constructor.
 +     * @brief   CounterSemaphore constructor.
       * @details The embedded @p ::Semaphore structure is initialized.
       *
       * @param[in] n             the semaphore counter value, must be greater
 @@ -773,7 +780,7 @@ namespace chibios_rt {       *
       * @init
       */
 -    Semaphore(cnt_t n);
 +    CounterSemaphore(cnt_t n);
      /**
       * @brief   Performs a reset operation on the semaphore.
 @@ -930,8 +937,8 @@ namespace chibios_rt {       *
       * @api
       */
 -    static msg_t signalWait(chibios_rt::Semaphore *ssem,
 -                            chibios_rt::Semaphore *wsem);
 +    static msg_t signalWait(CounterSemaphore *ssem,
 +                            CounterSemaphore *wsem);
  #endif /* CH_USE_SEMSW */
    };
    /*------------------------------------------------------------------------*
 @@ -1398,12 +1405,12 @@ namespace chibios_rt {  #if CH_USE_QUEUES || defined(__DOXYGEN__)
    /*------------------------------------------------------------------------*
 -   * chibios_rt::InputQueue                                                 *
 +   * chibios_rt::InQueue                                                    *
     *------------------------------------------------------------------------*/
    /**
     * @brief   Class encapsulating an input queue.
     */
 -  class InputQueue {
 +  class InQueue {
    private:
      /**
       * @brief   Embedded @p ::InputQueue structure.
 @@ -1412,7 +1419,7 @@ namespace chibios_rt {    public:
      /**
 -     * @brief   InputQueue constructor.
 +     * @brief   InQueue constructor.
       *
       * @param[in] bp        pointer to a memory area allocated as queue buffer
       * @param[in] size      size of the queue buffer
 @@ -1422,7 +1429,7 @@ namespace chibios_rt {       *
       * @init
       */
 -    InputQueue(uint8_t *bp, size_t size, qnotify_t infy, void *link);
 +    InQueue(uint8_t *bp, size_t size, qnotify_t infy, void *link);
      /**
       * @brief   Returns the filled space into an input queue.
 @@ -1551,7 +1558,7 @@ namespace chibios_rt {    };
    /*------------------------------------------------------------------------*
 -   * chibios_rt::InputQueueBuffer                                           *
 +   * chibios_rt::InQueueBuffer                                              *
     *------------------------------------------------------------------------*/
    /**
     * @brief   Template class encapsulating an input queue and its buffer.
 @@ -1559,28 +1566,28 @@ namespace chibios_rt {     * @param N                   size of the input queue
     */
    template <int N>
 -  class InputQueueBuffer : public InputQueue {
 +  class InQueueBuffer : public InQueue {
    private:
      uint8_t iq_buf[N];
    public:
      /**
 -     * @brief   InputQueueBuffer constructor.
 +     * @brief   InQueueBuffer constructor.
       *
       * @init
       */
 -    InputQueueBuffer(qnotify_t infy, void *link) : InputQueue(iq_buf, N,
 -                                                              infy, link) {
 +    InQueueBuffer(qnotify_t infy, void *link) : InQueue(iq_buf, N,
 +                                                        infy, link) {
      }
    };
    /*------------------------------------------------------------------------*
 -   * chibios_rt::OutputQueue                                                *
 +   * chibios_rt::OutQueue                                                   *
     *------------------------------------------------------------------------*/
    /**
     * @brief   Class encapsulating an output queue.
     */
 -  class OutputQueue {
 +  class OutQueue {
    private:
      /**
       * @brief   Embedded @p ::OutputQueue structure.
 @@ -1589,7 +1596,7 @@ namespace chibios_rt {    public:
      /**
 -     * @brief   OutputQueue constructor.
 +     * @brief   OutQueue constructor.
       *
       * @param[in] bp        pointer to a memory area allocated as queue buffer
       * @param[in] size      size of the queue buffer
 @@ -1599,7 +1606,7 @@ namespace chibios_rt {       *
       * @init
       */
 -    OutputQueue(uint8_t *bp, size_t size, qnotify_t onfy, void *link);
 +    OutQueue(uint8_t *bp, size_t size, qnotify_t onfy, void *link);
      /**
       * @brief   Returns the filled space into an output queue.
 @@ -1730,7 +1737,7 @@ namespace chibios_rt {  };
    /*------------------------------------------------------------------------*
 -   * chibios_rt::OutputQueueBuffer                                          *
 +   * chibios_rt::OutQueueBuffer                                             *
     *------------------------------------------------------------------------*/
    /**
     * @brief   Template class encapsulating an output queue and its buffer.
 @@ -1738,18 +1745,18 @@ namespace chibios_rt {     * @param N                   size of the output queue
     */
    template <int N>
 -  class OutputQueueBuffer : public OutputQueue {
 +  class OutQueueBuffer : public OutQueue {
    private:
      uint8_t oq_buf[N];
    public:
      /**
 -     * @brief   OutputQueueBuffer constructor.
 +     * @brief   OutQueueBuffer constructor.
       *
       * @init
       */
 -    OutputQueueBuffer(qnotify_t onfy, void *link) : InputQueue(oq_buf, N,
 -                                                               onfy, link) {
 +    OutQueueBuffer(qnotify_t onfy, void *link) : OutQueue(oq_buf, N,
 +                                                          onfy, link) {
      }
    };
  #endif /* CH_USE_QUEUES */
  | 
