aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2009-05-01 16:06:12 +0000
committergdisirio <gdisirio@35acf78f-673a-0410-8e92-d51de3d6d3f4>2009-05-01 16:06:12 +0000
commit521443e16740cdf9e550425cffbb4e6c53b98cfd (patch)
tree9161e2e19fecd3e4f142d2964d3276fb9fabe67b
parent0d7787542b2754010de8b4d0419f3b7ab85422f6 (diff)
downloadChibiOS-521443e16740cdf9e550425cffbb4e6c53b98cfd.tar.gz
ChibiOS-521443e16740cdf9e550425cffbb4e6c53b98cfd.tar.bz2
ChibiOS-521443e16740cdf9e550425cffbb4e6c53b98cfd.zip
Adjustments on queues.
git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@929 35acf78f-673a-0410-8e92-d51de3d6d3f4
-rw-r--r--src/chqueues.c113
-rw-r--r--src/include/queues.h37
2 files changed, 91 insertions, 59 deletions
diff --git a/src/chqueues.c b/src/chqueues.c
index b1711814d..de2160e36 100644
--- a/src/chqueues.c
+++ b/src/chqueues.c
@@ -90,10 +90,43 @@ msg_t chIQPutI(InputQueue *iqp, uint8_t b) {
return Q_OK;
}
+#if !CH_USE_SEMAPHORES_TIMEOUT || defined(__DOXYGEN__)
/**
* @brief Input queue read.
* @details This function reads a byte value from an input queue. If the queue
* is empty then the calling thread is suspended until a byte arrives
+ * in the queue.
+ *
+ * @param[in] iqp pointer to an @p InputQueue structure
+ * @return A byte value from the queue or:
+ * @retval Q_RESET if the queue was reset.
+ */
+msg_t chIQGet(InputQueue *iqp) {
+ uint8_t b;
+ msg_t msg;
+
+ chSysLock();
+ if ((msg = chSemWaitS(&iqp->q_sem)) < RDY_OK) {
+ chSysUnlock();
+ return msg;
+ }
+ b = *iqp->q_rdptr++;
+ if (iqp->q_rdptr >= iqp->q_top)
+ iqp->q_rdptr = iqp->q_buffer;
+
+ if (iqp->q_notify)
+ iqp->q_notify();
+
+ chSysUnlock();
+ return b;
+}
+#endif /* !CH_USE_SEMAPHORES_TIMEOUT */
+
+#if CH_USE_SEMAPHORES_TIMEOUT || defined(__DOXYGEN__)
+/**
+ * @brief Input queue read with timeout.
+ * @details This function reads a byte value from an input queue. If the queue
+ * is empty then the calling thread is suspended until a byte arrives
* in the queue or a timeout occurs.
*
* @param[in] iqp pointer to an @p InputQueue structure
@@ -106,29 +139,18 @@ msg_t chIQPutI(InputQueue *iqp, uint8_t b) {
* @retval Q_TIMEOUT if the specified time expired.
* @retval Q_RESET if the queue was reset.
*
- * @note The @p time parameter is only meaningful if the
- * @p CH_USE_SEMAPHORES_TIMEOUT kernel option is activated,
- * otherwise only the @p TIME_INFINITE value is accepted.
+ * @note The function is only available when the @p CH_USE_SEMAPHORES_TIMEOUT
+ * kernel option is activated,
*/
msg_t chIQGetTimeout(InputQueue *iqp, systime_t timeout) {
uint8_t b;
msg_t msg;
-#if CH_USE_SEMAPHORES_TIMEOUT
chSysLock();
if ((msg = chSemWaitTimeoutS(&iqp->q_sem, timeout)) < RDY_OK) {
chSysUnlock();
return msg;
}
-#else
- chDbgCheck(timeout == TIME_INFINITE, "chIQGetTimeout");
-
- chSysLock();
- if ((msg = chSemWaitS(&iqp->q_sem)) < RDY_OK) {
- chSysUnlock();
- return msg;
- }
-#endif
b = *iqp->q_rdptr++;
if (iqp->q_rdptr >= iqp->q_top)
iqp->q_rdptr = iqp->q_buffer;
@@ -139,6 +161,7 @@ msg_t chIQGetTimeout(InputQueue *iqp, systime_t timeout) {
chSysUnlock();
return b;
}
+#endif /* CH_USE_SEMAPHORES_TIMEOUT */
/**
* @brief Non-blocking read.
@@ -218,13 +241,48 @@ void chOQResetI(OutputQueue *oqp) {
chSemResetI(&oqp->q_sem, (cnt_t)(oqp->q_top - oqp->q_buffer));
}
+#if !CH_USE_SEMAPHORES_TIMEOUT || defined(__DOXYGEN__)
/**
* @brief Output queue write.
* @details This function writes a byte value to an output queue. If the queue
* is full then the calling thread is suspended until there is space
+ * in the queue.
+ *
+ * @param[in] oqp pointer to an @p OutputQueue structure
+ * @param[in] b the byte value to be written in the queue
+ * @return The operation status:
+ * @retval Q_OK if the operation succeeded.
+ * @retval Q_RESET if the queue was reset.
+ */
+msg_t chOQPut(OutputQueue *oqp, uint8_t b) {
+ msg_t msg;
+
+ chSysLock();
+ if ((msg = chSemWaitS(&oqp->q_sem)) < RDY_OK) {
+ chSysUnlock();
+ return msg;
+ }
+ *oqp->q_wrptr++ = b;
+ if (oqp->q_wrptr >= oqp->q_top)
+ oqp->q_wrptr = oqp->q_buffer;
+
+ if (oqp->q_notify)
+ oqp->q_notify();
+
+ chSysUnlock();
+ return Q_OK;
+}
+#endif /* !CH_USE_SEMAPHORES_TIMEOUT */
+
+#if CH_USE_SEMAPHORES_TIMEOUT || defined(__DOXYGEN__)
+/**
+ * @brief Output queue write with timeout.
+ * @details This function writes a byte value to an output queue. If the queue
+ * is full then the calling thread is suspended until there is space
* in the queue or a timeout occurs.
*
* @param[in] oqp pointer to an @p OutputQueue structure
+ * @param[in] b the byte value to be written in the queue
* @param[in] timeout the number of ticks before the operation timeouts,
* the following special values are allowed:
* - @a TIME_IMMEDIATE immediate timeout.
@@ -235,28 +293,17 @@ void chOQResetI(OutputQueue *oqp) {
* @retval Q_TIMEOUT if the specified time expired.
* @retval Q_RESET if the queue was reset.
*
- * @note The @p time parameter is only meaningful if the
- * @p CH_USE_SEMAPHORES_TIMEOUT kernel option is activated,
- * otherwise only the @p TIME_INFINITE value is accepted.
+ * @note The function is only available when the @p CH_USE_SEMAPHORES_TIMEOUT
+ * kernel option is activated,
*/
msg_t chOQPutTimeout(OutputQueue *oqp, uint8_t b, systime_t timeout) {
msg_t msg;
-#if CH_USE_SEMAPHORES_TIMEOUT
chSysLock();
if ((msg = chSemWaitTimeoutS(&oqp->q_sem, timeout)) < RDY_OK) {
chSysUnlock();
return msg;
}
-#else
- chDbgCheck(timeout == TIME_INFINITE, "chOQPutTimeout");
-
- chSysLock();
- if ((msg = chSemWaitS(&oqp->q_sem)) < RDY_OK) {
- chSysUnlock();
- return msg;
- }
-#endif
*oqp->q_wrptr++ = b;
if (oqp->q_wrptr >= oqp->q_top)
oqp->q_wrptr = oqp->q_buffer;
@@ -267,6 +314,7 @@ msg_t chOQPutTimeout(OutputQueue *oqp, uint8_t b, systime_t timeout) {
chSysUnlock();
return Q_OK;
}
+#endif /* CH_USE_SEMAPHORES_TIMEOUT */
/**
* @brief Output queue read.
@@ -290,19 +338,6 @@ msg_t chOQGetI(OutputQueue *oqp) {
}
/**
- * @brief Writes some data from the specified buffer into the queue.
- * @details The function is non-blocking and can return zero if the queue is
- * full.
- *
- * @param[in] qp pointer to a @p Queue structure
- * @param[in] buffer the data buffer
- * @param[in] n the maximum amount of data to be written
- * @return The number of written bytes.
- * @note This function is the upper side endpoint of the output queue.
- * @note The function is not atomic, if you need atomicity it is suggested
- * to use a semaphore for mutual exclusion.
- */
-/**
* @brief Non-blocking write.
* @details The function writes data from a buffer to an output queue. The
* transfer is non-blocking and can return zero if the queue is
diff --git a/src/include/queues.h b/src/include/queues.h
index ca587d388..e031a39f3 100644
--- a/src/include/queues.h
+++ b/src/include/queues.h
@@ -90,17 +90,13 @@ typedef GenericQueue InputQueue;
/** Evaluates to @p TRUE if the specified Input Queue is full. */
#define chIQIsFull(q) (chQSpace(q) >= chQSize(q))
-/**
- * @brief Input queue read.
- * @details This function reads a byte value from an input queue. If the queue
- * is empty then the calling thread is suspended until a byte arrives
- * in the queue.
- *
- * @param[in] iqp pointer to an @p InputQueue structure
- * @return A byte value from the queue or:
- * @retval Q_RESET if the queue was reset.
+#if CH_USE_SEMAPHORES_TIMEOUT
+/*
+ * When semaphores timeout is available this API is implemented as a
+ * special case of the more general chIQGetTimeout().
*/
#define chIQGet(iqp) chIQGetTimeout(iqp, TIME_INFINITE)
+#endif
/**
* @brief Output queue structure.
@@ -120,19 +116,13 @@ typedef GenericQueue OutputQueue;
/** Evaluates to @p TRUE if the specified Output Queue is full. */
#define chOQIsFull(q) (chQSpace(q) <= 0)
-/**
- * @brief Output queue write.
- * @details This function writes a byte value to an output queue. If the queue
- * is full then the calling thread is suspended until there is space
- * in the queue.
- *
- * @param[in] oqp pointer to an @p OutputQueue structure
- * @param[in] b the byte value to be written in the queue
- * @return The operation status:
- * @retval Q_OK if the operation succeeded.
- * @retval Q_RESET if the queue was reset.
+#if CH_USE_SEMAPHORES_TIMEOUT
+/*
+ * When semaphores timeout is available this API is implemented as a
+ * special case of the more general chOQPutTimeout().
*/
#define chOQPut(oqp, b) chOQPutTimeout(oqp, b, TIME_INFINITE)
+#endif
#ifdef __cplusplus
extern "C" {
@@ -140,10 +130,17 @@ extern "C" {
void chIQInit(InputQueue *qp, uint8_t *buffer, size_t size, qnotify_t inotify);
void chIQResetI(InputQueue *qp);
msg_t chIQPutI(InputQueue *qp, uint8_t b);
+#if !CH_USE_SEMAPHORES_TIMEOUT
+ msg_t chIQGet(InputQueue *qp);
+#endif
msg_t chIQGetTimeout(InputQueue *qp, systime_t timeout);
size_t chIQRead(InputQueue *qp, uint8_t *buffer, size_t n);
+
void chOQInit(OutputQueue *queue, uint8_t *buffer, size_t size, qnotify_t onotify);
void chOQResetI(OutputQueue *queue);
+#if !CH_USE_SEMAPHORES_TIMEOUT
+ msg_t chOQPut(OutputQueue *queue, uint8_t b);
+#endif
msg_t chOQPutTimeout(OutputQueue *queue, uint8_t b, systime_t timeout);
msg_t chOQGetI(OutputQueue *queue);
size_t chOQWrite(OutputQueue *queue, uint8_t *buffer, size_t n);