ZestCode
 
Loading...
Searching...
No Matches
queue.h
1/*
2 * FreeRTOS Kernel V10.0.1
3 * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy of
6 * this software and associated documentation files (the "Software"), to deal in
7 * the Software without restriction, including without limitation the rights to
8 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9 * the Software, and to permit persons to whom the Software is furnished to do so,
10 * subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in all
13 * copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 *
22 * http://www.FreeRTOS.org
23 * http://aws.amazon.com/freertos
24 *
25 * 1 tab == 4 spaces!
26 */
27
28
29#ifndef QUEUE_H
30#define QUEUE_H
31
32#ifndef INC_FREERTOS_H
33 #error "include FreeRTOS.h" must appear in source files before "include queue.h"
34#endif
35
36#ifdef __cplusplus
37extern "C" {
38#endif
39
40
46typedef void * queue_t;
47
53typedef void * QueueSetHandle_t;
54
60typedef void * QueueSetMemberHandle_t;
61
62/* For internal use only. */
63#define queueSEND_TO_BACK ( ( int32_t ) 0 )
64#define queueSEND_TO_FRONT ( ( int32_t ) 1 )
65#define queueOVERWRITE ( ( int32_t ) 2 )
66
67/* For internal use only. These definitions *must* match those in queue.c. */
68#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U )
69#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U )
70#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U )
71#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U )
72#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U )
73#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U )
74
143#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
144 queue_t queue_create(uint32_t uxQueueLength, uint32_t uxItemSize);
145#endif
146
229#if( configSUPPORT_STATIC_ALLOCATION == 1 )
230 queue_t queue_create_static(uint32_t uxQueueLength, uint32_t uxItemSize,
231 uint8_t *pucQueueStorageBuffer, static_queue_s_t *pxQueueBuffer);
232#endif /* configSUPPORT_STATIC_ALLOCATION */
233
312bool queue_prepend(queue_t queue, const void* item, uint32_t timeout);
313
394bool queue_append(queue_t queue, const void* item, uint32_t timeout);
395
478#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), queueSEND_TO_BACK )
479
561#define queue_overwrite( xQueue, pvItemToQueue ) xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), 0, queueOVERWRITE )
562
563
649int32_t xQueueGenericSend( queue_t xQueue, const void * const pvItemToQueue, uint32_t xTicksToWait, const int32_t xCopyPosition ) ;
650
743int32_t queue_peek( queue_t xQueue, void * const pvBuffer, uint32_t xTicksToWait ) ;
744
776int32_t xQueuePeekFromISR( queue_t xQueue, void * const pvBuffer ) ;
777
867int32_t queue_recv( queue_t xQueue, void * const pvBuffer, uint32_t xTicksToWait ) ;
868
882uint32_t queue_get_waiting( const queue_t xQueue ) ;
883
899uint32_t queue_get_available( const queue_t xQueue ) ;
900
913void queue_delete( queue_t xQueue ) ;
914
983#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_FRONT )
984
985
1054#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
1055
1141#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueOVERWRITE )
1142
1215#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), ( pxHigherPriorityTaskWoken ), queueSEND_TO_BACK )
1216
1294int32_t xQueueGenericSendFromISR( queue_t xQueue, const void * const pvItemToQueue, int32_t * const pxHigherPriorityTaskWoken, const int32_t xCopyPosition ) ;
1295int32_t xQueueGiveFromISR( queue_t xQueue, int32_t * const pxHigherPriorityTaskWoken ) ;
1296
1384int32_t xQueueReceiveFromISR( queue_t xQueue, void * const pvBuffer, int32_t * const pxHigherPriorityTaskWoken ) ;
1385
1386/*
1387 * Utilities to query queues that are safe to use from an ISR. These utilities
1388 * should be used only from witin an ISR, or within a critical section.
1389 */
1390int32_t xQueueIsQueueEmptyFromISR( const queue_t xQueue ) ;
1391int32_t xQueueIsQueueFullFromISR( const queue_t xQueue ) ;
1392uint32_t uxQueueMessagesWaitingFromISR( const queue_t xQueue ) ;
1393
1394/*
1395 * The functions defined above are for passing data to and from tasks. The
1396 * functions below are the equivalents for passing data to and from
1397 * co-routines.
1398 *
1399 * These functions are called from the co-routine macro implementation and
1400 * should not be called directly from application code. Instead use the macro
1401 * wrappers defined within croutine.h.
1402 */
1403int32_t xQueueCRSendFromISR( queue_t xQueue, const void *pvItemToQueue, int32_t xCoRoutinePreviouslyWoken );
1404int32_t xQueueCRReceiveFromISR( queue_t xQueue, void *pvBuffer, int32_t *pxTaskWoken );
1405int32_t xQueueCRSend( queue_t xQueue, const void *pvItemToQueue, uint32_t xTicksToWait );
1406int32_t xQueueCRReceive( queue_t xQueue, void *pvBuffer, uint32_t xTicksToWait );
1407
1408/*
1409 * For internal use only. Use mutex_create(),
1410 * sem_create() or mutex_get_owner() instead of calling
1411 * these functions directly.
1412 */
1413queue_t xQueueCreateMutex( const uint8_t ucQueueType ) ;
1414queue_t xQueueCreateMutexStatic( const uint8_t ucQueueType, static_queue_s_t *pxStaticQueue ) ;
1415queue_t xQueueCreateCountingSemaphore( const uint32_t uxMaxCount, const uint32_t uxInitialCount ) ;
1416queue_t xQueueCreateCountingSemaphoreStatic( const uint32_t uxMaxCount, const uint32_t uxInitialCount, static_queue_s_t *pxStaticQueue ) ;
1417int32_t xQueueSemaphoreTake( queue_t xQueue, uint32_t xTicksToWait ) ;
1418void* xQueueGetMutexHolder( queue_t xSemaphore ) ;
1419void* xQueueGetMutexHolderFromISR( queue_t xSemaphore ) ;
1420
1421/*
1422 * For internal use only. Use xSemaphoreTakeMutexRecursive() or
1423 * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.
1424 */
1425int32_t xQueueTakeMutexRecursive( queue_t xMutex, uint32_t xTicksToWait ) ;
1426int32_t xQueueGiveMutexRecursive( queue_t pxMutex ) ;
1427
1428/*
1429 * Reset a queue back to its original empty state. The return value is now
1430 * obsolete and is always set to pdPASS.
1431 */
1432void queue_reset(queue_t queue);
1433
1434/*
1435 * The registry is provided as a means for kernel aware debuggers to
1436 * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add
1437 * a queue, semaphore or mutex handle to the registry if you want the handle
1438 * to be available to a kernel aware debugger. If you are not using a kernel
1439 * aware debugger then this function can be ignored.
1440 *
1441 * configQUEUE_REGISTRY_SIZE defines the maximum number of handles the
1442 * registry can hold. configQUEUE_REGISTRY_SIZE must be greater than 0
1443 * within FreeRTOSConfig.h for the registry to be available. Its value
1444 * does not effect the number of queues, semaphores and mutexes that can be
1445 * created - just the number that the registry can hold.
1446 *
1447 * @param xQueue The handle of the queue being added to the registry. This
1448 * is the handle returned by a call to queue_create(). Semaphore and mutex
1449 * handles can also be passed in here.
1450 *
1451 * @param pcName The name to be associated with the handle. This is the
1452 * name that the kernel aware debugger will display. The queue registry only
1453 * stores a pointer to the string - so the string must be persistent (global or
1454 * preferably in ROM/Flash), not on the stack.
1455 */
1456#if( configQUEUE_REGISTRY_SIZE > 0 )
1457 void vQueueAddToRegistry( queue_t xQueue, const char *pcName ) ; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
1458#endif
1459
1460/*
1461 * The registry is provided as a means for kernel aware debuggers to
1462 * locate queues, semaphores and mutexes. Call vQueueAddToRegistry() add
1463 * a queue, semaphore or mutex handle to the registry if you want the handle
1464 * to be available to a kernel aware debugger, and vQueueUnregisterQueue() to
1465 * remove the queue, semaphore or mutex from the register. If you are not using
1466 * a kernel aware debugger then this function can be ignored.
1467 *
1468 * @param xQueue The handle of the queue being removed from the registry.
1469 */
1470#if( configQUEUE_REGISTRY_SIZE > 0 )
1471 void vQueueUnregisterQueue( queue_t xQueue ) ;
1472#endif
1473
1474/*
1475 * The queue registry is provided as a means for kernel aware debuggers to
1476 * locate queues, semaphores and mutexes. Call pcQueueGetName() to look
1477 * up and return the name of a queue in the queue registry from the queue's
1478 * handle.
1479 *
1480 * @param xQueue The handle of the queue the name of which will be returned.
1481 * @return If the queue is in the registry then a pointer to the name of the
1482 * queue is returned. If the queue is not in the registry then NULL is
1483 * returned.
1484 */
1485#if( configQUEUE_REGISTRY_SIZE > 0 )
1486 const char *pcQueueGetName( queue_t xQueue ) ; /*lint !e971 Unqualified char types are allowed for strings and single characters only. */
1487#endif
1488
1489/*
1490 * Generic version of the function used to creaet a queue using dynamic memory
1491 * allocation. This is called by other functions and macros that create other
1492 * RTOS objects that use the queue structure as their base.
1493 */
1494#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
1495 queue_t xQueueGenericCreate( const uint32_t uxQueueLength, const uint32_t uxItemSize, const uint8_t ucQueueType ) ;
1496#endif
1497
1498/*
1499 * Generic version of the function used to creaet a queue using dynamic memory
1500 * allocation. This is called by other functions and macros that create other
1501 * RTOS objects that use the queue structure as their base.
1502 */
1503#if( configSUPPORT_STATIC_ALLOCATION == 1 )
1504 queue_t xQueueGenericCreateStatic( const uint32_t uxQueueLength, const uint32_t uxItemSize, uint8_t *pucQueueStorage, static_queue_s_t *pxStaticQueue, const uint8_t ucQueueType ) ;
1505#endif
1506
1507/*
1508 * Queue sets provide a mechanism to allow a task to block (pend) on a read
1509 * operation from multiple queues or semaphores simultaneously.
1510 *
1511 * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1512 * function.
1513 *
1514 * A queue set must be explicitly created using a call to xQueueCreateSet()
1515 * before it can be used. Once created, standard FreeRTOS queues and semaphores
1516 * can be added to the set using calls to xQueueAddToSet().
1517 * xQueueSelectFromSet() is then used to determine which, if any, of the queues
1518 * or semaphores contained in the set is in a state where a queue read or
1519 * semaphore take operation would be successful.
1520 *
1521 * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html
1522 * for reasons why queue sets are very rarely needed in practice as there are
1523 * simpler methods of blocking on multiple objects.
1524 *
1525 * Note 2: Blocking on a queue set that contains a mutex will not cause the
1526 * mutex holder to inherit the priority of the blocked task.
1527 *
1528 * Note 3: An additional 4 bytes of RAM is required for each space in a every
1529 * queue added to a queue set. Therefore counting semaphores that have a high
1530 * maximum count value should not be added to a queue set.
1531 *
1532 * Note 4: A receive (in the case of a queue) or take (in the case of a
1533 * semaphore) operation must not be performed on a member of a queue set unless
1534 * a call to xQueueSelectFromSet() has first returned a handle to that set member.
1535 *
1536 * @param uxEventQueueLength Queue sets store events that occur on
1537 * the queues and semaphores contained in the set. uxEventQueueLength specifies
1538 * the maximum number of events that can be queued at once. To be absolutely
1539 * certain that events are not lost uxEventQueueLength should be set to the
1540 * total sum of the length of the queues added to the set, where binary
1541 * semaphores and mutexes have a length of 1, and counting semaphores have a
1542 * length set by their maximum count value. Examples:
1543 * + If a queue set is to hold a queue of length 5, another queue of length 12,
1544 * and a binary semaphore, then uxEventQueueLength should be set to
1545 * (5 + 12 + 1), or 18.
1546 * + If a queue set is to hold three binary semaphores then uxEventQueueLength
1547 * should be set to (1 + 1 + 1 ), or 3.
1548 * + If a queue set is to hold a counting semaphore that has a maximum count of
1549 * 5, and a counting semaphore that has a maximum count of 3, then
1550 * uxEventQueueLength should be set to (5 + 3), or 8.
1551 *
1552 * @return If the queue set is created successfully then a handle to the created
1553 * queue set is returned. Otherwise NULL is returned.
1554 */
1555QueueSetHandle_t xQueueCreateSet( const uint32_t uxEventQueueLength ) ;
1556
1557/*
1558 * Adds a queue or semaphore to a queue set that was previously created by a
1559 * call to xQueueCreateSet().
1560 *
1561 * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1562 * function.
1563 *
1564 * Note 1: A receive (in the case of a queue) or take (in the case of a
1565 * semaphore) operation must not be performed on a member of a queue set unless
1566 * a call to xQueueSelectFromSet() has first returned a handle to that set member.
1567 *
1568 * @param xQueueOrSemaphore The handle of the queue or semaphore being added to
1569 * the queue set (cast to an QueueSetMemberHandle_t type).
1570 *
1571 * @param xQueueSet The handle of the queue set to which the queue or semaphore
1572 * is being added.
1573 *
1574 * @return If the queue or semaphore was successfully added to the queue set
1575 * then pdPASS is returned. If the queue could not be successfully added to the
1576 * queue set because it is already a member of a different queue set then pdFAIL
1577 * is returned.
1578 */
1579int32_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) ;
1580
1581/*
1582 * Removes a queue or semaphore from a queue set. A queue or semaphore can only
1583 * be removed from a set if the queue or semaphore is empty.
1584 *
1585 * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1586 * function.
1587 *
1588 * @param xQueueOrSemaphore The handle of the queue or semaphore being removed
1589 * from the queue set (cast to an QueueSetMemberHandle_t type).
1590 *
1591 * @param xQueueSet The handle of the queue set in which the queue or semaphore
1592 * is included.
1593 *
1594 * @return If the queue or semaphore was successfully removed from the queue set
1595 * then pdPASS is returned. If the queue was not in the queue set, or the
1596 * queue (or semaphore) was not empty, then pdFAIL is returned.
1597 */
1598int32_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet ) ;
1599
1600/*
1601 * xQueueSelectFromSet() selects from the members of a queue set a queue or
1602 * semaphore that either contains data (in the case of a queue) or is available
1603 * to take (in the case of a semaphore). xQueueSelectFromSet() effectively
1604 * allows a task to block (pend) on a read operation on all the queues and
1605 * semaphores in a queue set simultaneously.
1606 *
1607 * See FreeRTOS/Source/Demo/Common/Minimal/QueueSet.c for an example using this
1608 * function.
1609 *
1610 * Note 1: See the documentation on http://wwwFreeRTOS.org/RTOS-queue-sets.html
1611 * for reasons why queue sets are very rarely needed in practice as there are
1612 * simpler methods of blocking on multiple objects.
1613 *
1614 * Note 2: Blocking on a queue set that contains a mutex will not cause the
1615 * mutex holder to inherit the priority of the blocked task.
1616 *
1617 * Note 3: A receive (in the case of a queue) or take (in the case of a
1618 * semaphore) operation must not be performed on a member of a queue set unless
1619 * a call to xQueueSelectFromSet() has first returned a handle to that set member.
1620 *
1621 * @param xQueueSet The queue set on which the task will (potentially) block.
1622 *
1623 * @param xTicksToWait The maximum time, in ticks, that the calling task will
1624 * remain in the Blocked state (with other tasks executing) to wait for a member
1625 * of the queue set to be ready for a successful queue read or semaphore take
1626 * operation.
1627 *
1628 * @return xQueueSelectFromSet() will return the handle of a queue (cast to
1629 * a QueueSetMemberHandle_t type) contained in the queue set that contains data,
1630 * or the handle of a semaphore (cast to a QueueSetMemberHandle_t type) contained
1631 * in the queue set that is available, or NULL if no such queue or semaphore
1632 * exists before before the specified block time expires.
1633 */
1634QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, const uint32_t xTicksToWait ) ;
1635
1636/*
1637 * A version of xQueueSelectFromSet() that can be used from an ISR.
1638 */
1639QueueSetMemberHandle_t xQueueSelectFromSetFromISR( QueueSetHandle_t xQueueSet ) ;
1640
1641/* Not public API functions. */
1642void vQueueWaitForMessageRestricted( queue_t xQueue, uint32_t xTicksToWait, const int32_t xWaitIndefinitely ) ;
1643int32_t xQueueGenericReset( queue_t xQueue, int32_t xNewQueue ) ;
1644void vQueueSetQueueNumber( queue_t xQueue, uint32_t uxQueueNumber ) ;
1645uint32_t uxQueueGetQueueNumber( queue_t xQueue ) ;
1646uint8_t ucQueueGetQueueType( queue_t xQueue ) ;
1647
1648
1649#ifdef __cplusplus
1650}
1651#endif
1652
1653#endif /* QUEUE_H */
void queue_delete(queue_t queue)
bool queue_append(queue_t queue, const void *item, uint32_t timeout)
queue_t queue_create(uint32_t length, uint32_t item_size)
uint32_t queue_get_available(const queue_t queue)
bool queue_peek(queue_t queue, void *const buffer, uint32_t timeout)
bool queue_recv(queue_t queue, void *const buffer, uint32_t timeout)
uint32_t queue_get_waiting(const queue_t queue)
void queue_reset(queue_t queue)
queue_t queue_create_static(uint32_t length, uint32_t item_size, uint8_t *storage_buffer, static_queue_s_t *queue_buffer)