Loading...
Searching...
No Matches
queue.h
1/*
2 * SPDX-FileCopyrightText: 2022 Gunar Schorcht
3 * SPDX-License-Identifier: LGPL-2.1-only
4 */
5
6/*
7 * FreeRTOS to RIOT-OS adaption module for source code compatibility
8 */
9
10#pragma once
11
12#ifndef DOXYGEN
13
14#include "freertos/FreeRTOS.h"
15#include "list.h"
16
17#ifdef __cplusplus
18extern "C" {
19#endif
20
21#define xQueueHandle QueueHandle_t
22
23typedef void* QueueHandle_t;
24
25/*
26 * In FreeRTOS different types of semaphores, mutexes and queues are all
27 * mapped to a single generic queue type. With all these different types,
28 * single functions for send, receive, give and take are then used. To be
29 * able to distinguish between these different types in RIOT, we need typed
30 * objects.
31 */
32typedef struct {
33 uint8_t type; /* type of the queue, MUST be the first element */
34 bool stat; /* statically allocated queue memory */
35 list_node_t sending; /* threads that are waiting to send */
36 list_node_t receiving; /* threads that are waiting to receive */
37 uint8_t* queue; /* the queue of waiting items */
38 uint32_t item_size; /* size of each item in the queue */
39 uint32_t item_num; /* num of items that can be stored in queue */
40 uint32_t item_front; /* first item in queue */
41 uint32_t item_tail; /* last item in queue */
42 uint32_t item_level; /* num of items stored in queue */
43} _queue_t;
44
45typedef _queue_t StaticQueue_t;
46typedef _queue_t StaticSemaphore_t;
47
48QueueHandle_t xQueueGenericCreate (const UBaseType_t uxQueueLength,
49 const UBaseType_t uxItemSize,
50 const uint8_t ucQueueType);
51
52QueueHandle_t xQueueCreateStatic( const UBaseType_t uxQueueLength,
53 const UBaseType_t uxItemSize,
54 uint8_t *pucQueueStorageBuffer,
55 StaticQueue_t *pxQueueBuffer );
56
57BaseType_t xQueueGetStaticBuffers( QueueHandle_t xQueue,
58 uint8_t ** ppucQueueStorage,
59 StaticQueue_t ** ppxStaticQueue );
60
61QueueHandle_t xQueueCreateCountingSemaphore (const UBaseType_t uxMaxCount,
62 const UBaseType_t uxInitialCount);
63
64QueueHandle_t xQueueCreateCountingSemaphoreStatic(const UBaseType_t uxMaxCount,
65 const UBaseType_t uxInitialCount,
66 StaticQueue_t *pxStaticQueue);
67
68QueueHandle_t xQueueCreateWithCaps(const UBaseType_t uxQueueLength,
69 const UBaseType_t uxItemSize,
70 const UBaseType_t uxMemoryCaps);
71
72void vQueueDelete (QueueHandle_t xQueue);
73
74#define vQueueDeleteWithCaps vQueueDelete
75
76BaseType_t xQueueReset (QueueHandle_t xQueue);
77
78BaseType_t xQueueGenericReceive (QueueHandle_t xQueue,
79 void * const pvBuffer,
80 TickType_t xTicksToWait,
81 const BaseType_t xJustPeeking);
82
83BaseType_t xQueueGenericSend (QueueHandle_t xQueue,
84 const void * const pvItemToQueue,
85 TickType_t xTicksToWait,
86 const BaseType_t xCopyPosition);
87
88BaseType_t xQueueReceiveFromISR (QueueHandle_t xQueue, void * const pvBuffer,
89 BaseType_t * const pxHigherPriorityTaskWoken);
90
91BaseType_t xQueueGenericSendFromISR (QueueHandle_t xQueue,
92 const void * const pvItemToQueue,
93 BaseType_t * const pxHigherPriorityTaskWoken,
94 const BaseType_t xCopyPosition );
95
96BaseType_t xQueueGiveFromISR (QueueHandle_t xQueue,
97 BaseType_t * const pxHigherPriorityTaskWoken);
98
99UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue );
100
101/*
102 * PLEASE NOTE: Following definitions were copied directly from the FreeRTOS
103 * distribution and are under the following copyright:
104 *
105 * FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd.
106 * All rights reserved
107 *
108 * FreeRTOS is free software; you can redistribute it and/or modify it under
109 * the terms of the GNU General Public License (version 2) as published by the
110 * Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
111 *
112 * Full license text is available on the following
113 * link: http://www.freertos.org/a00114.html
114 */
115
116#define queueSEND_TO_BACK ( ( BaseType_t ) 0 )
117#define queueSEND_TO_FRONT ( ( BaseType_t ) 1 )
118#define queueOVERWRITE ( ( BaseType_t ) 2 )
119
120#define queueQUEUE_TYPE_BASE ( ( uint8_t ) 0U )
121#define queueQUEUE_TYPE_SET ( ( uint8_t ) 0U )
122#define queueQUEUE_TYPE_MUTEX ( ( uint8_t ) 1U )
123#define queueQUEUE_TYPE_COUNTING_SEMAPHORE ( ( uint8_t ) 2U )
124#define queueQUEUE_TYPE_BINARY_SEMAPHORE ( ( uint8_t ) 3U )
125#define queueQUEUE_TYPE_RECURSIVE_MUTEX ( ( uint8_t ) 4U )
126
127#define errQUEUE_EMPTY ( ( BaseType_t ) 0 )
128#define errQUEUE_FULL ( ( BaseType_t ) 0 )
129#define errQUEUE_BLOCKED ( -4 )
130#define errQUEUE_YIELD ( -5 )
131
132#define xQueueCreate( uxQueueLength, uxItemSize ) \
133 xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )
134
135#define xQueueReceive( xQueue, pvBuffer, xTicksToWait ) \
136 xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), \
137 pdFALSE )
138
139#define xQueueSend( xQueue, pvItemToQueue, xTicksToWait ) \
140 xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), \
141 queueSEND_TO_BACK )
142
143#define xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) \
144 xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), \
145 queueSEND_TO_BACK )
146
147#define xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) \
148 xQueueGenericSend( ( xQueue ), ( pvItemToQueue ), ( xTicksToWait ), \
149 queueSEND_TO_FRONT )
150
151#define xQueueSendFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
152 xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), \
153 ( pxHigherPriorityTaskWoken ), \
154 queueSEND_TO_BACK )
155
156#define xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
157 xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), \
158 ( pxHigherPriorityTaskWoken ), \
159 queueSEND_TO_BACK )
160
161#define xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
162 xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), \
163 ( pxHigherPriorityTaskWoken ), \
164 queueSEND_TO_FRONT )
165
166#define xQueueOverwriteFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) \
167 xQueueGenericSendFromISR( ( xQueue ), ( pvItemToQueue ), \
168 ( pxHigherPriorityTaskWoken ), \
169 queueOVERWRITE )
170
171#ifdef __cplusplus
172}
173#endif
174
175#endif /* DOXYGEN */
Intrusive linked list.
struct list_node list_node_t
List node structure.