From badec871127cc434bdb83a54c2a4d7dde26b073f Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 19 Mar 2018 12:30:31 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@11823 110e8d01-0319-4d1e-a829-52ad28d1bb01 --- os/lib/src/chmboxes.c | 4 +- os/lib/src/chpipes.c | 163 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 165 insertions(+), 2 deletions(-) create mode 100644 os/lib/src/chpipes.c diff --git a/os/lib/src/chmboxes.c b/os/lib/src/chmboxes.c index af10c6d7e..b0ca43877 100644 --- a/os/lib/src/chmboxes.c +++ b/os/lib/src/chmboxes.c @@ -103,7 +103,7 @@ void chMBObjectInit(mailbox_t *mbp, msg_t *buf, size_t n) { * @details All the waiting threads are resumed with status @p MSG_RESET and * the queued messages are lost. * @post The mailbox is in reset state, all operations will fail and - * return @p MSG reset until the mailbox is enabled again using + * return @p MSG_RESET until the mailbox is enabled again using * @p chMBResumeX(). * * @param[in] mbp the pointer to an initialized @p mailbox_t object @@ -123,7 +123,7 @@ void chMBReset(mailbox_t *mbp) { * @details All the waiting threads are resumed with status @p MSG_RESET and * the queued messages are lost. * @post The mailbox is in reset state, all operations will fail and - * return @p MSG reset until the mailbox is enabled again using + * return @p MSG_RESET until the mailbox is enabled again using * @p chMBResumeX(). * * @param[in] mbp the pointer to an initialized @p mailbox_t object diff --git a/os/lib/src/chpipes.c b/os/lib/src/chpipes.c new file mode 100644 index 000000000..74a45e121 --- /dev/null +++ b/os/lib/src/chpipes.c @@ -0,0 +1,163 @@ +/* + ChibiOS - Copyright (C) 2006..2018 Giovanni Di Sirio. + + This file is part of ChibiOS. + + ChibiOS 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 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 chpipes.c + * @brief Pipes code. + * + * @addtogroup pipes + * @details Byte pipes. + *

Operation mode

+ * A pipe is an asynchronous communication mechanism.
+ * Operations defined for mailboxes: + * - Write: Writes a buffer of data in the pipe in FIFO order. + * - Read: A buffer of data is read from the read and removed. + * - Reset: The pipe is emptied and all the stored data + * is lost. + * . + * @pre In order to use the pipes APIs the @p CH_CFG_USE_PIPES + * option must be enabled in @p chconf.h. + * @note Compatible with RT and NIL. + * @{ + */ + +#include "ch.h" + +#if (CH_CFG_USE_PIPES == TRUE) || defined(__DOXYGEN__) + +/*===========================================================================*/ +/* Module exported variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local variables. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module local functions. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module exported functions. */ +/*===========================================================================*/ + +/** + * @brief Initializes a @p mailbox_t object. + * + * @param[out] pp the pointer to the @p pipe_t structure to be + * initialized + * @param[in] buf pointer to the pipe buffer as an array of @p uint8_t + * @param[in] n number of elements in the buffer array + * + * @init + */ +void chPipeObjectInit(pipe_t *pp, uint8_t *buf, size_t n) { + + chDbgCheck((pp != NULL) && (buf != NULL) && (n > (size_t)0)); + + pp->buffer = buf; + pp->rdptr = buf; + pp->wrptr = buf; + pp->top = &buf[n]; + pp->cnt = (size_t)0; + pp->reset = false; + chThdQueueObjectInit(&pp->qw); + chThdQueueObjectInit(&pp->qr); +} + +/** + * @brief Resets a @p pipe_t object. + * @details All the waiting threads are resumed with status @p MSG_RESET and + * the queued data is lost. + * @post The pipe is in reset state, all operations will fail and + * return @p MSG_RESET until the mailbox is enabled again using + * @p chPipeResumeX(). + * + * @param[in] pp the pointer to an initialized @p pipe_t object + * + * @api + */ +void chPipeReset(mailbox_t *mbp) { + + chSysLock(); + chMBResetI(mbp); + chSchRescheduleS(); + chSysUnlock(); +} + +/** + * @brief Resets a @p pipe_t object. + * @details All the waiting threads are resumed with status @p MSG_RESET and + * the queued data is lost. + * @post The pipe is in reset state, all operations will fail and + * return @p MSG_RESET until the mailbox is enabled again using + * @p chPipeResumeX(). + * + * @param[in] pp the pointer to an initialized @p pipe_t object + * + * @api + */ +void chPipeResetI(pipe_t *pp) { + + chDbgCheckClassI(); + chDbgCheck(pipe_t != NULL); + + pipe_t->wrptr = pipe_t->buffer; + pipe_t->rdptr = pipe_t->buffer; + pipe_t->cnt = (size_t)0; + pipe_t->reset = true; + chThdDequeueAllI(&pipe_t->qw, MSG_RESET); + chThdDequeueAllI(&pipe_t->qr, MSG_RESET); +} + +size_t chPipeReadI(pipe_t *pp, uint8_t *bp, size_t n) { + +} + +size_t chPipeReadTimeoutS(pipe_t *pp, uint8_t *bp, + size_t n, sysinterval_t timeout) { + +} + +size_t chPipeReadTimeout(pipe_t *pp, uint8_t *bp, + size_t n, sysinterval_t timeout) { + +} + +size_t chPipeWriteI(pipe_t *pp, const uint8_t *bp, size_t n) { + +} + +size_t chPipeWriteTimeoutS(pipe_t *pp, const uint8_t *bp, + size_t n, sysinterval_t timeout) { + +} + +size_t chPipeWriteTimeout(pipe_t *pp, const uint8_t *bp, + size_t n, sysinterval_t timeout) { + +} + +#endif /* CH_CFG_USE_MAILBOXES == TRUE */ + +/** @} */ -- cgit v1.2.3