From 3d2f2081cebee2936d8073ab6a55177b6549013e Mon Sep 17 00:00:00 2001 From: gdisirio Date: Tue, 17 Feb 2009 19:58:46 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@778 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- src/include/ch.h | 1 + src/include/mailboxes.h | 85 ++++++++++++++++++++++++++++++++++++++++++++++++ src/include/semaphores.h | 4 +-- src/include/sys.h | 4 --- src/include/threads.h | 4 +++ 5 files changed, 92 insertions(+), 6 deletions(-) create mode 100644 src/include/mailboxes.h (limited to 'src/include') diff --git a/src/include/ch.h b/src/include/ch.h index ec53b4197..b760e3d30 100644 --- a/src/include/ch.h +++ b/src/include/ch.h @@ -74,6 +74,7 @@ #include "condvars.h" #include "events.h" #include "messages.h" +#include "mailboxes.h" #include "heap.h" #include "mempools.h" #include "threads.h" diff --git a/src/include/mailboxes.h b/src/include/mailboxes.h new file mode 100644 index 000000000..03623e7bc --- /dev/null +++ b/src/include/mailboxes.h @@ -0,0 +1,85 @@ +/* + ChibiOS/RT - Copyright (C) 2006-2007 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 mailboxes.h + * @brief Mailboxes macros and structures. + * @addtogroup Mailboxes + * @{ + */ + +#ifndef _MAILBOXES_H_ +#define _MAILBOXES_H_ + +#if CH_USE_MAILBOXES + +typedef struct { + msg_t *mb_buffer; /**< Pointer to the mailbox buffer.*/ + msg_t *mb_top; /**< Pointer to the first location + after the buffer.*/ + msg_t *mb_wrptr; /**< Write pointer.*/ + msg_t *mb_rdptr; /**< Read pointer.*/ + Semaphore mb_fullsem; /**< Full counter @p Semaphore.*/ + Semaphore mb_emptysem; /**< Empty counter @p Semaphore.*/ +} Mailbox; + +#ifdef __cplusplus +extern "C" { +#endif + void chMBInit(Mailbox *mbp, msg_t *buf, cnt_t n); + void chMBReset(Mailbox *mbp); + msg_t chMBPost(Mailbox *mbp, msg_t msg, systime_t timeout); + msg_t chMBPostAhead(Mailbox *mbp, msg_t msg, systime_t timeout); + msg_t chMBFetch(Mailbox *mbp, msg_t *msgp, systime_t timeout); +#ifdef __cplusplus +} +#endif + +/** + * Verifies if the mailbox has space for an immediate message. + * @param[in] mbp the pointer to an initialized Mailbox object + * @return The number of empty message slots. + * @note Can be invoked in any system state but if invoked out of a locked + * state then the returned value may change after reading. + */ +#define chMBHasSpace(mbp) chSemGetCounterI(&(mbp)->mb_emptysem) + +/** + * Verifies if the mailbox has incoming messages. + * @param[in] mbp the pointer to an initialized Mailbox object + * @return The number of queued messages. + * @note Can be invoked in any system state but if invoked out of a locked + * state then the returned value may change after reading. + */ +#define chMBContainsMessages(mbp) chSemGetCounterI(&(mbp)->mb_fullsem) + +/** + * Returns the next message in the queue without removing it. + * @note A message must be waiting in the queue for this function to work or + * it would return garbage. The correct way to use this macro is to + * use @p chMBContainsMessages() and then use this macro, all within + * a lock state. + */ +#define chMBPeek(mbp) (*(mbp)->mb_rdptr) + +#endif /* CH_USE_MAILBOXES */ + +#endif /* _MAILBOXES_H_ */ + +/** @} */ diff --git a/src/include/semaphores.h b/src/include/semaphores.h index 25f11b06b..acb48f150 100644 --- a/src/include/semaphores.h +++ b/src/include/semaphores.h @@ -63,7 +63,7 @@ extern "C" { * Decreases the semaphore counter, this macro can be used when it is ensured * that the counter would not become negative. */ -#define chSemFastWaitS(sp) ((sp)->s_cnt--) +#define chSemFastWaitI(sp) ((sp)->s_cnt--) /** * Increases the semaphore counter, this macro can be used when the counter is @@ -74,7 +74,7 @@ extern "C" { /** * Returns the semaphore counter current value. */ -#define chSemGetCounter(sp) ((sp)->s_cnt) +#define chSemGetCounterI(sp) ((sp)->s_cnt) #endif /* CH_USE_SEMAPHORES */ diff --git a/src/include/sys.h b/src/include/sys.h index ccc71ae7f..e36d98b76 100644 --- a/src/include/sys.h +++ b/src/include/sys.h @@ -43,13 +43,9 @@ /** * @brief Performs a context switch. - * @details This is the most critical code in any port, this function - * is responsible for the context switch between 2 threads. * * @param otp the thread to be switched out * @param ntp the thread to be switched in - * @note The implementation of this code affects directly the context - * switch performance so optimize here as much as you can. */ #define chSysSwitchI(otp, ntp) port_switch(otp, ntp) diff --git a/src/include/threads.h b/src/include/threads.h index be48fcbb3..961ef5b0b 100644 --- a/src/include/threads.h +++ b/src/include/threads.h @@ -49,6 +49,10 @@ struct Thread { struct context p_ctx; /**< Processor context.*/ #if CH_USE_NESTED_LOCKS cnt_t p_locks; /**< Number of nested locks.*/ +#endif +#if CH_DBG_THREADS_PROFILING + systime_t p_time; /**< Consumed time. + @note This field can overflow.*/ #endif /* * The following fields are merged in unions because they are all -- cgit v1.2.3