AvrIO  1.4.5
Bibliothèque C modulaire pour ATMEL AVR
queue.h
1 
18 #ifndef _AVRIO_QUEUE_H_
19 # define _AVRIO_QUEUE_H_
20 
21 # include <avrio/defs.h>
22 # include <avrio/mutex.h>
23 
24 __BEGIN_C_DECLS
25  /* ======================================================================== */
38  /* structures ============================================================= */
43  struct xQueue;
44 
45 /* constants ================================================================ */
46 
47 /* internal public functions ================================================ */
56 void vQueuePush (struct xQueue *pxQueue, uint8_t ucByte);
57 
66 uint8_t ucQueuePull (struct xQueue *pxQueue);
67 
75 void vQueueDrop (struct xQueue *pxQueue);
76 
87 uint8_t ucQueueRead (struct xQueue *pxQueue, size_t xIndex);
88 
97 void vQueuePushWord (struct xQueue *pxQueue, uint16_t usWord);
98 
107 uint16_t usQueuePullWord (struct xQueue *pxQueue);
108 
119 uint16_t usQueueReadWord (struct xQueue *pxQueue, size_t xIndex);
120 
135 const char *pcQueuePushString (struct xQueue *pxQueue, const char *pcString);
136 
148 size_t xQueuePushBytes (struct xQueue *pxQueue, const uint8_t * pucBytes,
149  size_t xLength);
150 
161 size_t xQueuePushBytesOfQueue (struct xQueue *pxDstQueue,
162  struct xQueue *pxSrcQueue, size_t xLength);
163 
172 size_t xQueuePullBytes (struct xQueue *pxQueue,
173  uint8_t * pucBytes, size_t xLength);
174 
182 size_t xQueuePullAll (struct xQueue *pxQueue, uint8_t * pucBytes);
183 
192 void vQueueDropBytes (struct xQueue *pxQueue, size_t xLength);
193 
199 void vQueueFlush (struct xQueue *pxQueue);
200 
208 void vQueueSetBuffer (struct xQueue *pxQueue, uint8_t * pucBuffer, size_t xBufferSize);
209 
216 size_t xQueueLength (struct xQueue *pxQueue);
217 
224 size_t xQueueSize (struct xQueue *pxQueue);
225 
235 int iQueueCompare (struct xQueue *pxQueue1, struct xQueue *pxQueue2);
236 
243 size_t xQueueFree (struct xQueue *pxQueue);
244 
254 struct xQueue *pxQueueNew (size_t xBufferSize);
255 
264 void vQueueDelete (struct xQueue *pxQueue);
265 
266 # if defined(__DOXYGEN__)
267 /*
268  * __DOXYGEN__ defined
269  * Partie documentation ne devant pas être compilée.
270  * =============================================================================
271  */
272 /* macros =================================================================== */
280 # define QUEUE_DECLARE(xVarName, xBufferSize)
281 
289 # define QUEUE_STATIC_DECLARE(xVarName, xBufferSize)
290 
291 /* inline public functions ================================================== */
292 
299 bool xQueueIsEmpty (struct xQueue *pxQueue);
300 
307 bool xQueueIsFull (struct xQueue *pxQueue);
308 
319 size_t xQueuePushQueue (struct xQueue *pxDstQueue, struct xQueue *pxSrcQueue);
320 
327 size_t xQueueSizeOf (struct xQueue *pxQueue);
328 
336 void vQueueCopy (struct xQueue *pxDst, const struct xQueue *pxSrc);
337 
342 # else
343 /*
344  * __DOXYGEN__ not defined
345  * Partie ne devant pas être documentée.
346  * =============================================================================
347  */
348 # include "avrio-config.h"
349 # include <string.h>
350 
351 /* structures =============================================================== */
352 struct xQueue {
353  uint8_t *pxFirst;
354  uint8_t *pxLast;
355  uint8_t * volatile pxIn;
356  uint8_t * volatile pxOut;
357  volatile bool isEmpty;
358  volatile bool isFull;
359  // TODO: suppression
360  xMutex xLock;
361 };
362 
363 /* types ==================================================================== */
364 typedef struct xQueue xQueue;
365 
366 /* macros =================================================================== */
367 #define QUEUE_MUTEX_INITIALIZER (MUTEX_INITIALIZER & ~QUEUE_LOCK_EMPTY)
368 
369  // ----------------------------------------------------------------------------
370 # define QUEUE_DECLARE(__name,__size) \
371  uint8_t __name ## Buffer[__size]; \
372  xQueue __name = { .pxFirst = __name ## Buffer, \
373  .pxLast = __name ## Buffer + __size - 1, \
374  .pxIn = __name ## Buffer, \
375  .pxOut = __name ## Buffer, \
376  .isEmpty = true, \
377  .isFull = false, \
378  .xLock = MUTEX_INITIALIZER }
379 
380  // ----------------------------------------------------------------------------
381 # define QUEUE_STATIC_DECLARE(__name,__size) \
382  static uint8_t __name ## Buffer[__size]; \
383  static xQueue __name = { .pxFirst = __name ## Buffer, \
384  .pxLast = __name ## Buffer + __size - 1, \
385  .pxIn = __name ## Buffer, \
386  .pxOut = __name ## Buffer, \
387  .isEmpty = true, \
388  .isFull = false, \
389  .xLock = MUTEX_INITIALIZER }
390 
391 /* inline public functions ================================================== */
392 // ------------------------------------------------------------------------------
393 INLINE bool xQueueIsEmpty (xQueue * q) {
394 
395  return q->isEmpty;
396 }
397 
398 // ------------------------------------------------------------------------------
399 INLINE bool xQueueIsFull (xQueue * q) {
400 
401  return q->isFull;
402 }
403 
404 // ------------------------------------------------------------------------------
405 INLINE size_t xQueuePushQueue (struct xQueue *pxDstQueue,
406  struct xQueue *pxSrcQueue) {
407 
408  return xQueuePushBytesOfQueue (pxDstQueue, pxSrcQueue,
409  xQueueLength (pxSrcQueue));
410 }
411 
412 // ------------------------------------------------------------------------------
413 INLINE size_t xQueueSizeOf (xQueue * q) {
414 
415  return sizeof (xQueue) + xQueueSize (q);
416 }
417 
418 // ------------------------------------------------------------------------------
419 INLINE void
420  vQueueCopy (struct xQueue *pxDst, const struct xQueue *pxSrc) {
421 
422  memcpy (pxDst, pxSrc, sizeof(xQueue));
423 }
424 
426 //
427 // TODO:
428 // Suppression des mutex (recherche dépendances dans avrio et autres projets
429 //
431 /* constants ================================================================ */
436 typedef enum {
437 
438  QUEUE_LOCK_RD = 0x01,
439  QUEUE_LOCK_WR = 0x02,
440  QUEUE_LOCK_FULL = 0x04,
441  QUEUE_LOCK_EMPTY = 0x08,
442  QUEUE_LOCK_FREE = QUEUE_LOCK_RD | QUEUE_LOCK_WR,
443  QUEUE_LOCK_ALL = QUEUE_LOCK_RD | QUEUE_LOCK_WR | QUEUE_LOCK_FULL
444 } eQueueLock;
445 
446 // ----------------------------------------------------------------------------
447 INLINE void
448  vQueueUnlock (struct xQueue *q,
449  uint8_t ucMask) {
450 
451  vMutexUnlockBit (&(q->xLock), ucMask);
452 }
453 
454 // ----------------------------------------------------------------------------
455 INLINE void
456  vQueueLock (struct xQueue *q, uint8_t ucMask) {
457 
458  vMutexLockBit (&(q->xLock), ucMask);
459 }
460 
461 // ----------------------------------------------------------------------------
462 INLINE void
463  vQueueUntilLocked (struct xQueue *q, uint8_t ucMask) {
464 
465  vMutexUntilBitUnlocked (&(q->xLock), ucMask);
466 }
467 
468 // ----------------------------------------------------------------------------
469 INLINE int8_t
470  xQueueTryLock (struct xQueue *q,
471  uint8_t ucMask) {
472 
473  return xMutexTryLockBit (&(q->xLock), ucMask);
474 }
475 
476 // ------------------------------------------------------------------------------
477 INLINE void vQueueWaitUntilIsFull (struct xQueue * q) {
478 
479  vQueueUntilLocked (q, QUEUE_LOCK_FULL);
480 }
481 
482 // ------------------------------------------------------------------------------
483 INLINE void vQueueWaitUntilIsEmpty (struct xQueue * q) {
484 
485  vQueueUntilLocked (q, QUEUE_LOCK_EMPTY);
486 }
487 
488 # endif /* __DOXYGEN__ not defined */
489 /* ========================================================================== */
490 __END_C_DECLS
491 #endif /* _AVRIO_QUEUE_H_ */
void vQueuePush(struct xQueue *pxQueue, uint8_t ucByte)
Empile un octet.
uint16_t usQueueReadWord(struct xQueue *pxQueue, size_t xIndex)
Lecture d&#39;un mot de 16 bits (sans dépiler)
struct xQueue * pxQueueNew(size_t xBufferSize)
Crée et initialise une pile en mémoire dynamique.
size_t xQueuePullBytes(struct xQueue *pxQueue, uint8_t *pucBytes, size_t xLength)
Dépile des octets.
uint16_t usQueuePullWord(struct xQueue *pxQueue)
Dépile un mot de 16 bits.
bool xQueueIsFull(struct xQueue *pxQueue)
Teste si la pile est vide.
Pile FIFO.
volatile uint8_t xMutex
Type mutex.
Definition: mutex.h:59
int8_t xMutexTryLockBit(xMutex *pxMutex, uint8_t ucMask)
Variante non bloquante de vMutexLockBit()
uint8_t ucQueueRead(struct xQueue *pxQueue, size_t xIndex)
Lecture d&#39;un octet (sans le dépiler)
void vMutexUnlockBit(xMutex *pxMutex, uint8_t ucMask)
void vQueuePushWord(struct xQueue *pxQueue, uint16_t usWord)
Empile un mot de 16 bits.
size_t xQueuePushQueue(struct xQueue *pxDstQueue, struct xQueue *pxSrcQueue)
Empile une pile dans une autre.
void vQueueDrop(struct xQueue *pxQueue)
Détruit un octet.
void vQueueDelete(struct xQueue *pxQueue)
Détruit une pile créée avec xQueueNew()
size_t xQueueLength(struct xQueue *pxQueue)
Renvoie le nombre d&#39;octets empilés.
void vMutexUntilBitUnlocked(xMutex *pxMutex, uint8_t ucMask)
Attend tant qu&#39;un ou plusieurs bits d&#39;un mutex sont verrouillés (P)
void vQueueCopy(struct xQueue *pxDst, const struct xQueue *pxSrc)
Copie d&#39;une pile sur une autre.
size_t xQueueSize(struct xQueue *pxQueue)
Renvoie la longueur de la pile.
size_t xQueuePullAll(struct xQueue *pxQueue, uint8_t *pucBytes)
Dépile tous les octets.
void vQueueFlush(struct xQueue *pxQueue)
Vide la pile.
void vQueueSetBuffer(struct xQueue *pxQueue, uint8_t *pucBuffer, size_t xBufferSize)
Initialise la pile avec le buffer.
bool xQueueIsEmpty(struct xQueue *pxQueue)
Teste si la pile est vide.
void vQueueDropBytes(struct xQueue *pxQueue, size_t xLength)
Détruit plusieurs octets.
size_t xQueueSizeOf(struct xQueue *pxQueue)
Renvoie la taille mémoire d&#39;une pile.
size_t xQueuePushBytesOfQueue(struct xQueue *pxDstQueue, struct xQueue *pxSrcQueue, size_t xLength)
Empile des octets d&#39;une pile dans une autre.
uint8_t ucQueuePull(struct xQueue *pxQueue)
Dépile un octet.
size_t xQueuePushBytes(struct xQueue *pxQueue, const uint8_t *pucBytes, size_t xLength)
Empile une suite d&#39;octets.
int iQueueCompare(struct xQueue *pxQueue1, struct xQueue *pxQueue2)
Compare le contenu de deux piles d&#39;octets.
size_t xQueueFree(struct xQueue *pxQueue)
Renvoie le nombre d&#39;octets disponibles.
const char * pcQueuePushString(struct xQueue *pxQueue, const char *pcString)
Empile une chaîne d&#39;octets à zéro terminal.
void vMutexLockBit(xMutex *pxMutex, uint8_t ucMask)
Attend jusqu&#39;à ce qu&#39;un ou plusieurs bits d&#39;un mutex soit libres et les verrouillent (P) ...