From 6b7ee6dc16ae0fd7370d1d451f0a3afbfd0de1b0 Mon Sep 17 00:00:00 2001 From: gdisirio Date: Mon, 9 Apr 2012 14:51:29 +0000 Subject: [PATCH] Added mail pools. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@4089 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/various/evtimer.h | 8 ++++ os/various/mail.c | 96 ++++++++++++++++++++++++++++++++++++++++++++ os/various/mail.h | 59 +++++++++++++++++++++++++++ readme.txt | 2 + 4 files changed, 165 insertions(+) create mode 100644 os/various/mail.c create mode 100644 os/various/mail.h diff --git a/os/various/evtimer.h b/os/various/evtimer.h index 7d54d446b..695a3851e 100644 --- a/os/various/evtimer.h +++ b/os/various/evtimer.h @@ -29,6 +29,14 @@ #ifndef _EVTIMER_H_ #define _EVTIMER_H_ + +/* + * Module dependencies check. + */ +#if !CH_USE_EVENTS +#error "Event Timers require CH_USE_EVENTS" +#endif + /** * @brief Event timer structure. */ diff --git a/os/various/mail.c b/os/various/mail.c new file mode 100644 index 000000000..cebd44457 --- /dev/null +++ b/os/various/mail.c @@ -0,0 +1,96 @@ +/* + 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 mail.c + * @brief Threads mail code. + * + * @addtogroup mail + * @{ + */ + +#include "ch.h" +#include "mail.h" + +/** + * @brief Initializes a Mail Pool. + * @note The number of the mail objects in the mail pool should be at + * least 2+size(mailbox), this considering one writer and + * one reader, add one element for each extra reader or writer in + * order to avoid waiting on the mail pool. A smaller number of + * elements can be specified if waiting on the pool is acceptable. + * + * @param[out] mlp pointer to a @p MailPool structure + * @param[in] size the size of the mail objects to be placed in the pool + * @param[in] p pointer to the mail objects array first element + * @param[in] n number of elements in the mail objects array + * + * @init + */ +void mailInit(MailPool *mlp, size_t size, void *p, size_t n) { + + chPoolInit(&mlp->pool, size, NULL); + chPoolLoadArray(&mlp->pool, p, n); + chSemInit(&mlp->sem, (cnt_t)n); +} + +/** + * @brief Allocates a mail object from a mail pool. + * @pre The mail pool must be already been initialized. + * + * @param[in] mlp pointer to a @p MailPool structure + * @param[in] time the number of ticks before the operation timeouts, + * the following special values are allowed: + * - @a TIME_IMMEDIATE immediate timeout. + * - @a TIME_INFINITE no timeout. + * . + * @return The mail object. + * @retval NULL timeout expired. + * + * @api + */ +void *mailCreate(MailPool *mlp, systime_t time) { + msg_t msg; + void *mailp; + + msg = chSemWaitTimeout(&mlp->sem, time); + if (msg != RDY_OK) + return NULL; + mailp = chPoolAlloc(&mlp->pool); + chDbgAssert(mailp != NULL, "mailCreate(), #1", "empty pool"); + return mailp; +} + +/** + * @brief Releases a mail object into a mail pool. + * @pre The mail pool must be already been initialized. + * + * @param[in] mlp pointer to a @p MailPool structure + * @param[in] mailp the pointer to the mail object to be released + * + * @api + */ +void mailDelete(MailPool *mlp, void *mailp) { + + chPoolFree(&mlp->pool, mailp); + chSemSignal(&mlp->sem); +} + +/** @} */ diff --git a/os/various/mail.h b/os/various/mail.h new file mode 100644 index 000000000..1786494e6 --- /dev/null +++ b/os/various/mail.h @@ -0,0 +1,59 @@ +/* + 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 mail.h + * @brief Threads mail macros and structures. + * + * @addtogroup mail + * @{ + */ + +#ifndef _MAIL_H_ +#define _MAIL_H_ + +/* + * Module dependencies check. + */ +#if !CH_USE_SEMAPHORES || !CH_USE_MEMPOOLS +#error "Mail Pools require CH_USE_SEMAPHORES and CH_USE_MEMPOOLS" +#endif + +/** + * @brief Mail Pool descriptor. + */ +typedef struct { + MemoryPool pool; /**< @brief Available mail objects. */ + Semaphore sem; /**< @brief Semaphore guard. */ +} MailPool; + +#ifdef __cplusplus +extern "C" { +#endif + void mailInit(MailPool *mlp, size_t size, void *p, size_t n); + void *mailCreate(MailPool *mlp, systime_t time); + void mailDelete(MailPool *mlp, void *mailp); +#ifdef __cplusplus +} +#endif + +#endif /* _MAIL_H_ */ + +/** @} */ diff --git a/readme.txt b/readme.txt index 089b6e9d9..66a6d4acd 100644 --- a/readme.txt +++ b/readme.txt @@ -106,6 +106,8 @@ 3484947)(backported to 2.4.1). - FIX: Fixed various minor documentation errors (bug 3484942)(backported to 2.4.1). +- NEW: Added support for pools of generic "mail" objects under ./os/various, + mail objects are meant to be used together with mailboxes. - NEW: Added a new function chPoolLoadArray() to the Memory Pools subsystem, it allows to load an entire array element's into a pool with a single operation.