mirror of
https://github.com/espressif/esp-idf.git
synced 2025-09-30 19:19:21 +00:00
feat(rt/posix): Added FreeRTOS-Plus-POSIX message queues implementation
Note: The current mq_open() implementation is changed to match the POSIX standard.
This commit is contained in:
56
components/rt/private_include/FreeRTOS_POSIX.h
Normal file
56
components/rt/private_include/FreeRTOS_POSIX.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* Amazon FreeRTOS+POSIX V1.0.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* http://aws.amazon.com/freertos
|
||||
* http://www.FreeRTOS.org
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file FreeRTOS_POSIX.h
|
||||
* @brief FreeRTOS+POSIX header.
|
||||
*
|
||||
* This file must be included before all other FreeRTOS+POSIX includes.
|
||||
*/
|
||||
|
||||
#ifndef _FREERTOS_POSIX_H_
|
||||
#define _FREERTOS_POSIX_H_
|
||||
|
||||
/* FreeRTOS+POSIX platform-specific configuration headers. */
|
||||
#include "FreeRTOS_POSIX_portable.h"
|
||||
#include "portable/FreeRTOS_POSIX_portable_default.h"
|
||||
|
||||
/* FreeRTOS includes. */
|
||||
#include "freertos/FreeRTOS.h"
|
||||
#include "freertos/event_groups.h"
|
||||
#include "freertos/semphr.h"
|
||||
#include "freertos/task.h"
|
||||
|
||||
/* FreeRTOS+POSIX data types and internal structs. */
|
||||
#include <sys/types.h>
|
||||
#include "FreeRTOS_POSIX_internal.h"
|
||||
|
||||
#endif /* _FREERTOS_POSIX_H_ */
|
149
components/rt/private_include/FreeRTOS_POSIX/utils.h
Normal file
149
components/rt/private_include/FreeRTOS_POSIX/utils.h
Normal file
@@ -0,0 +1,149 @@
|
||||
/*
|
||||
* Amazon FreeRTOS+POSIX V1.0.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* http://aws.amazon.com/freertos
|
||||
* http://www.FreeRTOS.org
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file utils.h
|
||||
* @brief Utility functions used by FreeRTOS+POSIX.
|
||||
*/
|
||||
|
||||
#ifndef _FREERTOS_POSIX_UTILS_
|
||||
#define _FREERTOS_POSIX_UTILS_
|
||||
|
||||
/* C standard library includes. */
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <time.h>
|
||||
|
||||
#define MICROSECONDS_PER_SECOND ( 1000000LL ) /**< Microseconds per second. */
|
||||
#define NANOSECONDS_PER_SECOND ( 1000000000LL ) /**< Nanoseconds per second. */
|
||||
#define NANOSECONDS_PER_TICK ( NANOSECONDS_PER_SECOND / configTICK_RATE_HZ )
|
||||
|
||||
/**
|
||||
* @brief Calculates the length of pcString, up to xMaxLength.
|
||||
*
|
||||
* @param[in] pcString The string to find the length of.
|
||||
* @param[in] xMaxLength The limit when searching for the end of pcString.
|
||||
*
|
||||
* @return 0 if pcString is NULL; otherwise, the length of pcString or xMaxLength,
|
||||
* whichever is smaller.
|
||||
*/
|
||||
size_t UTILS_strnlen( const char * const pcString,
|
||||
size_t xMaxLength );
|
||||
|
||||
/**
|
||||
* @brief Calculates the number of ticks between now and a given timespec.
|
||||
*
|
||||
* @param[in] pxAbsoluteTime A time in the future, specified as seconds and
|
||||
* nanoseconds since CLOCK_REALTIME's 0.
|
||||
* @param[out] pxResult Where the result of the conversion is stored. The result
|
||||
* is rounded up for fractional ticks.
|
||||
*
|
||||
* @return 0 on success. Otherwise, ETIMEDOUT if pxAbsoluteTime is in the past,
|
||||
* or EINVAL for invalid parameters.
|
||||
*/
|
||||
int UTILS_AbsoluteTimespecToTicks( const struct timespec * const pxAbsoluteTime,
|
||||
TickType_t * const pxResult );
|
||||
|
||||
/**
|
||||
* @brief Converts a struct timespec to FreeRTOS ticks.
|
||||
*
|
||||
* @param[in] pxTimespec The timespec to convert.
|
||||
* @param[out] pxResult Where the result of the conversion is stored. The result is rounded
|
||||
* up for fractional ticks.
|
||||
*
|
||||
* @return 0 on success. Otherwise, EINVAL for invalid parameters.
|
||||
*/
|
||||
int UTILS_TimespecToTicks( const struct timespec * const pxTimespec,
|
||||
TickType_t * const pxResult );
|
||||
|
||||
/**
|
||||
* @brief Converts an integer value to a timespec.
|
||||
*
|
||||
* @param[in] llSource The value to convert.
|
||||
* @param[out] pxDestination Where to store the converted value.
|
||||
*
|
||||
* @return No return value.
|
||||
*/
|
||||
void UTILS_NanosecondsToTimespec( int64_t llSource,
|
||||
struct timespec * const pxDestination );
|
||||
|
||||
/**
|
||||
* @brief Calculates pxResult = x + y.
|
||||
*
|
||||
* @param[out] pxResult Where the result of the calculation is stored.
|
||||
* @param[in] x The first argument for addition.
|
||||
* @param[in] y The second argument for addition.
|
||||
*
|
||||
* @return -1 if any argument was NULL; 1 if result is negative; otherwise, 0.
|
||||
*/
|
||||
int UTILS_TimespecAdd( struct timespec * const pxResult,
|
||||
const struct timespec * const x,
|
||||
const struct timespec * const y );
|
||||
|
||||
/**
|
||||
* @brief Calculates pxResult = x + ( struct timespec ) nanosec.
|
||||
*
|
||||
* @param[out] pxResult Where the result of the calculation is stored.
|
||||
* @param[in] x The first argument for addition.
|
||||
* @param[in] llNanoseconds The second argument for addition.
|
||||
*
|
||||
* @return -1 if pxResult or x was NULL; 1 if result is negative; otherwise, 0.
|
||||
*/
|
||||
int UTILS_TimespecAddNanoseconds( struct timespec * const pxResult,
|
||||
const struct timespec * const x,
|
||||
int64_t llNanoseconds );
|
||||
|
||||
/**
|
||||
* @brief Calculates pxResult = x - y.
|
||||
*
|
||||
* @param[out] pxResult Where the result of the calculation is stored.
|
||||
* @param[in] x The first argument for subtraction.
|
||||
* @param[in] y The second argument for subtraction.
|
||||
*
|
||||
* @return -1 if any argument was NULL; 1 if result is negative; otherwise, 0.
|
||||
*/
|
||||
int UTILS_TimespecSubtract( struct timespec * const pxResult,
|
||||
const struct timespec * const x,
|
||||
const struct timespec * const y );
|
||||
|
||||
/**
|
||||
* @brief Checks that a timespec conforms to POSIX.
|
||||
*
|
||||
* A valid timespec must have 0 <= tv_nsec < 1000000000.
|
||||
*
|
||||
* @param[in] pxTimespec The timespec to validate.
|
||||
*
|
||||
* @return true if the pxTimespec is valid, false otherwise.
|
||||
*/
|
||||
bool UTILS_ValidateTimespec( const struct timespec * const pxTimespec );
|
||||
|
||||
#endif /* ifndef _FREERTOS_POSIX_UTILS_ */
|
101
components/rt/private_include/FreeRTOS_POSIX_internal.h
Normal file
101
components/rt/private_include/FreeRTOS_POSIX_internal.h
Normal file
@@ -0,0 +1,101 @@
|
||||
/*
|
||||
* Amazon FreeRTOS+POSIX V1.0.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* http://aws.amazon.com/freertos
|
||||
* http://www.FreeRTOS.org
|
||||
*/
|
||||
|
||||
#ifndef _FREERTOS_POSIX_INTERNAL_H_
|
||||
#define _FREERTOS_POSIX_INTERNAL_H_
|
||||
|
||||
/**
|
||||
* @file FreeRTOS_POSIX_internal.h
|
||||
* @brief Internal structs and initializers for FreeRTOS+POSIX.
|
||||
*/
|
||||
|
||||
/* Amazon FreeRTOS includes. */
|
||||
#include "aws_doubly_linked_list.h"
|
||||
|
||||
/**
|
||||
* @brief Mutex attribute object.
|
||||
*/
|
||||
typedef struct pthread_mutexattr_internal
|
||||
{
|
||||
int iType; /**< Mutex type. */
|
||||
} pthread_mutexattr_internal_t;
|
||||
|
||||
/**
|
||||
* @brief Mutex.
|
||||
*/
|
||||
typedef struct pthread_mutex_internal
|
||||
{
|
||||
BaseType_t xIsInitialized; /**< Set to pdTRUE if this mutex is initialized, pdFALSE otherwise. */
|
||||
StaticSemaphore_t xMutex; /**< FreeRTOS mutex. */
|
||||
TaskHandle_t xTaskOwner; /**< Owner; used for deadlock detection and permission checks. */
|
||||
pthread_mutexattr_internal_t xAttr; /**< Mutex attributes. */
|
||||
} pthread_mutex_internal_t;
|
||||
|
||||
/**
|
||||
* @brief Compile-time initializer of pthread_mutex_internal_t.
|
||||
*/
|
||||
#define FREERTOS_POSIX_MUTEX_INITIALIZER \
|
||||
( &( ( pthread_mutex_internal_t ) \
|
||||
{ \
|
||||
.xIsInitialized = pdFALSE, \
|
||||
.xMutex = { { 0 } }, \
|
||||
.xTaskOwner = NULL, \
|
||||
.xAttr = { .iType = 0 } \
|
||||
} \
|
||||
) \
|
||||
)
|
||||
|
||||
/**
|
||||
* @brief Condition variable.
|
||||
*/
|
||||
typedef struct pthread_cond_internal
|
||||
{
|
||||
BaseType_t xIsInitialized; /**< Set to pdTRUE if this condition variable is initialized, pdFALSE otherwise. */
|
||||
StaticSemaphore_t xCondMutex; /**< Prevents concurrent accesses to iWaitingThreads. */
|
||||
StaticSemaphore_t xCondWaitSemaphore; /**< Threads block on this semaphore in pthread_cond_wait. */
|
||||
int iWaitingThreads; /**< The number of threads currently waiting on this condition variable. */
|
||||
} pthread_cond_internal_t;
|
||||
|
||||
/**
|
||||
* @brief Compile-time initializer of pthread_cond_internal_t.
|
||||
*/
|
||||
#define FREERTOS_POSIX_COND_INITIALIZER \
|
||||
( &( ( pthread_cond_internal_t ) \
|
||||
{ \
|
||||
.xIsInitialized = pdFALSE, \
|
||||
.xCondMutex = { { 0 } }, \
|
||||
.xCondWaitSemaphore = { { 0 } }, \
|
||||
.iWaitingThreads = 0 \
|
||||
} \
|
||||
) \
|
||||
)
|
||||
|
||||
#endif /* _FREERTOS_POSIX_INTERNAL_H_ */
|
59
components/rt/private_include/FreeRTOS_POSIX_portable.h
Normal file
59
components/rt/private_include/FreeRTOS_POSIX_portable.h
Normal file
@@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Amazon FreeRTOS+POSIX V1.0.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* http://aws.amazon.com/freertos
|
||||
* http://www.FreeRTOS.org
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file FreeRTOS_POSIX_portable.h
|
||||
* @brief Port-specific configuration of FreeRTOS+POSIX.
|
||||
*/
|
||||
|
||||
#ifndef _FREERTOS_POSIX_PORTABLE_H_
|
||||
#define _FREERTOS_POSIX_PORTABLE_H_
|
||||
|
||||
/* ESP-IDF already defines the following types. */
|
||||
#define posixconfigENABLE_CLOCK_T 0
|
||||
#define posixconfigENABLE_CLOCKID_T 0
|
||||
#define posixconfigENABLE_MODE_T 0
|
||||
#define posixconfigENABLE_PTHREAD_ATTR_T 0
|
||||
#define posixconfigENABLE_PTHREAD_COND_T 0
|
||||
#define posixconfigENABLE_PTHREAD_CONDATTR_T 0
|
||||
#define posixconfigENABLE_PTHREAD_MUTEX_T 0
|
||||
#define posixconfigENABLE_PTHREAD_MUTEXATTR_T 0
|
||||
#define posixconfigENABLE_PTHREAD_T 0
|
||||
#define posixconfigENABLE_TIME_T 0
|
||||
#define posixconfigENABLE_TIMER_T 0
|
||||
#define posixconfigENABLE_TIMESPEC 0
|
||||
#define posixconfigENABLE_ITIMERSPEC 0
|
||||
|
||||
/* ESP-IDF already provides the header sched.h. Exclude them by
|
||||
* activating the double inclusion guards. */
|
||||
#define _FREERTOS_POSIX_SCHED_H_
|
||||
|
||||
#endif /* _FREERTOS_POSIX_PORTABLE_H_ */
|
249
components/rt/private_include/aws_doubly_linked_list.h
Normal file
249
components/rt/private_include/aws_doubly_linked_list.h
Normal file
@@ -0,0 +1,249 @@
|
||||
/*
|
||||
* Amazon FreeRTOS
|
||||
* Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* http://aws.amazon.com/freertos
|
||||
* http://www.FreeRTOS.org
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @file aws_doubly_linked_list.h
|
||||
* @brief Doubly Linked List implementation.
|
||||
*
|
||||
* A generic implementation of circular Doubly Linked List which consists of a
|
||||
* list head and some list entries (zero in case of an empty list).
|
||||
*
|
||||
* To start with, a structure of type Link_t should be embedded in the structure
|
||||
* which is to be organized as doubly linked list.
|
||||
* @code
|
||||
* typedef struct UserStruct
|
||||
* {
|
||||
* uint32_t ulField1;
|
||||
* uint32_t ulField2;
|
||||
* Link_t xLink;
|
||||
* } UserStruct_t;
|
||||
* @endcode
|
||||
*
|
||||
* A List head should then be defined and initialized.
|
||||
* @code
|
||||
* Link_t xListHead;
|
||||
* listINIT_HEAD( &xListHead );
|
||||
* @endcode
|
||||
*
|
||||
* listADD can then be used to add nodes to the list.
|
||||
* @code
|
||||
* listADD( &( xListHead ), &( pxUserStruct->xLink ) );
|
||||
* @endcode
|
||||
*
|
||||
* listFOR_EACH can be used for traversing the list.
|
||||
* @code
|
||||
* Link_t *pxLink;
|
||||
* UserStruct_t *pxUserStruct;
|
||||
* listFOR_EACH( pxLink, &( xListHead ) )
|
||||
* {
|
||||
* pxUserStruct = listCONTAINER( pxLink, UserStruct_t, xLink );
|
||||
* }
|
||||
* @endcode
|
||||
*
|
||||
* listFOR_EACH_SAFE should be used if you want to perform destructive operations
|
||||
* (like free) on nodes while traversing the list.
|
||||
* @code
|
||||
* Link_t *pxLink, *pxTempLink;
|
||||
* UserStruct_t *pxUserStruct;
|
||||
* listFOR_EACH( pxLink, pxTempLink, &( xListHead ) )
|
||||
* {
|
||||
* pxUserStruct = listCONTAINER( pxLink, UserStruct_t, xLink );
|
||||
* free( pxUserStruct );
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
|
||||
#ifndef _AWS_DOUBLY_LINKED_LIST_H_
|
||||
#define _AWS_DOUBLY_LINKED_LIST_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @brief Struct embedded in any struct to make it a doubly linked
|
||||
* list.
|
||||
*
|
||||
* pxNext in the head points to the first node in the list and pxPrev
|
||||
* in the head points to the last node in the list. In case of empty
|
||||
* list, both pxPrev and pxNext in the head point to the head node itself.
|
||||
*/
|
||||
typedef struct Link
|
||||
{
|
||||
struct Link * pxPrev; /**< Pointer to the previous node. */
|
||||
struct Link * pxNext; /**< Pointer to the next node. */
|
||||
} Link_t;
|
||||
|
||||
/**
|
||||
* @brief Initializes the given list head to an empty list.
|
||||
*
|
||||
* @param[in] pxHead The given list head to initialize.
|
||||
*/
|
||||
#define listINIT_HEAD( pxHead ) \
|
||||
{ \
|
||||
( pxHead )->pxPrev = ( pxHead ); \
|
||||
( pxHead )->pxNext = ( pxHead ); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Adds the given new node to the given list.
|
||||
*
|
||||
* @param[in] pxHead The head of the given list.
|
||||
* @param[in] pxLink The given new node to be added to the given
|
||||
* list.
|
||||
*/
|
||||
#define listADD( pxHead, pxLink ) \
|
||||
{ \
|
||||
Link_t * pxPrevLink = ( pxHead ); \
|
||||
Link_t * pxNextLink = ( ( pxHead )->pxNext ); \
|
||||
\
|
||||
( pxLink )->pxNext = pxNextLink; \
|
||||
pxNextLink->pxPrev = ( pxLink ); \
|
||||
pxPrevLink->pxNext = ( pxLink ); \
|
||||
( pxLink )->pxPrev = ( pxPrevLink ); \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Removes the given node from the list it is part of.
|
||||
*
|
||||
* If the given node is not a part of any list (i.e. next and previous
|
||||
* nodes are NULL), nothing happens.
|
||||
*
|
||||
* @param[in] pxLink The given node to remove from the list.
|
||||
*/
|
||||
#define listREMOVE( pxLink ) \
|
||||
{ \
|
||||
/* If the link is part of a list, remove it from the list. */ \
|
||||
if( ( pxLink )->pxNext != NULL && ( pxLink )->pxPrev != NULL ) \
|
||||
{ \
|
||||
( pxLink )->pxPrev->pxNext = ( pxLink )->pxNext; \
|
||||
( pxLink )->pxNext->pxPrev = ( pxLink )->pxPrev; \
|
||||
} \
|
||||
\
|
||||
/* Make sure that this link is not part of any list anymore. */ \
|
||||
( pxLink )->pxPrev = NULL; \
|
||||
( pxLink )->pxNext = NULL; \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Given the head of a list, checks if the list is empty.
|
||||
*
|
||||
* @param[in] pxHead The head of the given list.
|
||||
*/
|
||||
#define listIS_EMPTY( pxHead ) ( ( ( pxHead ) == NULL ) || ( ( pxHead )->pxNext == ( pxHead ) ) )
|
||||
|
||||
/**
|
||||
* @brief Removes the first node from the given list and returns it.
|
||||
*
|
||||
* Removes the first node from the given list and assigns it to the
|
||||
* pxLink parameter. If the list is empty, it assigns NULL to the
|
||||
* pxLink.
|
||||
*
|
||||
* @param[in] pxHead The head of the list from which to remove the
|
||||
* first node.
|
||||
* @param[out] pxLink The output parameter to receive the removed
|
||||
* node.
|
||||
*/
|
||||
#define listPOP( pxHead, pxLink ) \
|
||||
{ \
|
||||
if( listIS_EMPTY( ( pxHead ) ) ) \
|
||||
{ \
|
||||
( pxLink ) = NULL; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
( pxLink ) = ( pxHead )->pxNext; \
|
||||
/* If the link is part of a list, remove it from the list. */ \
|
||||
if( ( pxLink )->pxNext != NULL && ( pxLink )->pxPrev != NULL ) \
|
||||
{ \
|
||||
( pxLink )->pxPrev->pxNext = ( pxLink )->pxNext; \
|
||||
( pxLink )->pxNext->pxPrev = ( pxLink )->pxPrev; \
|
||||
} \
|
||||
\
|
||||
/* Make sure that this link is not part of any list anymore. */ \
|
||||
( pxLink )->pxPrev = NULL; \
|
||||
( pxLink )->pxNext = NULL; \
|
||||
} \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Merges a list into a given list.
|
||||
*
|
||||
* @param[in] pxHeadResultList The head of the given list into which the
|
||||
* other list should be merged.
|
||||
* @param[in] pxHeadListToMerge The head of the list to be merged into the
|
||||
* given list.
|
||||
*/
|
||||
#define listMERGE( pxHeadResultList, pxHeadListToMerge ) \
|
||||
{ \
|
||||
if( !listIS_EMPTY( ( pxHeadListToMerge ) ) ) \
|
||||
{ \
|
||||
/* Setup links between last node of listToMerge and first node of resultList. */ \
|
||||
( pxHeadListToMerge )->pxPrev->pxNext = ( pxHeadResultList )->pxNext; \
|
||||
( pxHeadResultList )->pxNext->pxPrev = ( pxHeadListToMerge )->pxPrev; \
|
||||
\
|
||||
/* Setup links between first node of listToMerge and the head of resultList. */ \
|
||||
( pxHeadListToMerge )->pxNext->pxPrev = ( pxHeadResultList ); \
|
||||
( pxHeadResultList )->pxNext = ( pxHeadListToMerge )->pxNext; \
|
||||
/* Empty the merged list. */ \
|
||||
listINIT_HEAD( ( pxHeadListToMerge ) ); \
|
||||
} \
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Helper macro to iterate over a list. pxLink contains the link node
|
||||
* in each iteration.
|
||||
*/
|
||||
#define listFOR_EACH( pxLink, pxHead ) \
|
||||
for( ( pxLink ) = ( pxHead )->pxNext; \
|
||||
( pxLink ) != ( pxHead ); \
|
||||
( pxLink ) = ( pxLink )->pxNext )
|
||||
|
||||
/**
|
||||
* @brief Helper macro to iterate over a list. It is safe to destroy/free the
|
||||
* nodes while iterating. pxLink contains the link node in each iteration.
|
||||
*/
|
||||
#define listFOR_EACH_SAFE( pxLink, pxTempLink, pxHead ) \
|
||||
for( ( pxLink ) = ( pxHead )->pxNext, ( pxTempLink ) = ( pxLink )->pxNext; \
|
||||
( pxLink ) != ( pxHead ); \
|
||||
( pxLink ) = ( pxTempLink ), ( pxTempLink ) = ( pxLink )->pxNext )
|
||||
|
||||
/**
|
||||
* @brief Given the pointer to the link member (of type Link_t) in a struct,
|
||||
* extracts the pointer to the containing struct.
|
||||
*
|
||||
* @param[in] pxLink The pointer to the link member.
|
||||
* @param[in] type The type of the containing struct.
|
||||
* @param[in] member Name of the link member in the containing struct.
|
||||
*/
|
||||
#define listCONTAINER( pxLink, type, member ) ( ( type * ) ( ( uint8_t * ) ( pxLink ) - ( uint8_t * ) ( &( ( type * ) 0 )->member ) ) )
|
||||
|
||||
#endif /* _AWS_DOUBLY_LINKED_LIST_H_ */
|
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
* Amazon FreeRTOS+POSIX V1.0.0
|
||||
* Copyright (C) 2018 Amazon.com, Inc. or its affiliates. All Rights Reserved.
|
||||
*
|
||||
* SPDX-FileCopyrightText: 2018 Amazon.com, Inc. or its affiliates
|
||||
*
|
||||
* SPDX-License-Identifier: MIT
|
||||
*
|
||||
* SPDX-FileContributor: 2024 Espressif Systems (Shanghai) CO LTD
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to
|
||||
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||
* the Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* http://aws.amazon.com/freertos
|
||||
* http://www.FreeRTOS.org
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file FreeRTOS_POSIX_portable_default.h
|
||||
* @brief Defaults for port-specific configuration of FreeRTOS+POSIX.
|
||||
*/
|
||||
|
||||
#ifndef _FREERTOS_POSIX_PORTABLE_DEFAULT_H_
|
||||
#define _FREERTOS_POSIX_PORTABLE_DEFAULT_H_
|
||||
|
||||
/**
|
||||
* @brief The FreeRTOS task name given to pthreads.
|
||||
*/
|
||||
#ifndef posixconfigPTHREAD_TASK_NAME
|
||||
#define posixconfigPTHREAD_TASK_NAME "pthread"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @brief the FreeRTOS timer name given to POSIX timers.
|
||||
*/
|
||||
#ifndef posixconfigTIMER_NAME
|
||||
#define posixconfigTIMER_NAME "timer"
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup Defaults for POSIX message queue implementation.
|
||||
*/
|
||||
/**@{ */
|
||||
#ifndef posixconfigMQ_MAX_MESSAGES
|
||||
#define posixconfigMQ_MAX_MESSAGES 10 /**< Maximum number of messages in an mq at one time. */
|
||||
#endif
|
||||
|
||||
#ifndef posixconfigMQ_MAX_SIZE
|
||||
#define posixconfigMQ_MAX_SIZE 128 /**< Maximum size (in bytes) of each message. */
|
||||
#endif
|
||||
/**@} */
|
||||
|
||||
/**
|
||||
* @defgroup POSIX implementation-dependent constants usually defined in limits.h.
|
||||
*
|
||||
* They are defined here to provide portability between platforms.
|
||||
*/
|
||||
/**@{ */
|
||||
#ifndef PTHREAD_STACK_MIN
|
||||
#define PTHREAD_STACK_MIN configMINIMAL_STACK_SIZE * sizeof( StackType_t ) /**< Minimum size in bytes of thread stack storage. */
|
||||
#endif
|
||||
#ifndef NAME_MAX
|
||||
#define NAME_MAX 64 /**< Maximum number of bytes in a filename (not including terminating null). */
|
||||
#endif
|
||||
#ifndef SEM_VALUE_MAX
|
||||
#define SEM_VALUE_MAX 0xFFFFU /**< Maximum value of a sem_t. */
|
||||
#endif
|
||||
/**@} */
|
||||
|
||||
/**
|
||||
* @defgroup Enable typedefs of POSIX types.
|
||||
*
|
||||
* Set these values to 1 or 0 to enable or disable the typedefs, respectively.
|
||||
* These typedefs should only be disabled if they conflict with system typedefs.
|
||||
*/
|
||||
/**@{ */
|
||||
#ifndef posixconfigENABLE_CLOCK_T
|
||||
#define posixconfigENABLE_CLOCK_T 1 /**< clock_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_CLOCKID_T
|
||||
#define posixconfigENABLE_CLOCKID_T 1 /**< clockid_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_MODE_T
|
||||
#define posixconfigENABLE_MODE_T 1 /**< mode_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PID_T
|
||||
#define posixconfigENABLE_PID_T 1 /**< pid_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PTHREAD_ATTR_T
|
||||
#define posixconfigENABLE_PTHREAD_ATTR_T 1 /**< pthread_attr_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PTHREAD_COND_T
|
||||
#define posixconfigENABLE_PTHREAD_COND_T 1 /**< pthread_cond_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PTHREAD_CONDATTR_T
|
||||
#define posixconfigENABLE_PTHREAD_CONDATTR_T 1 /**< pthread_condattr_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PTHREAD_MUTEX_T
|
||||
#define posixconfigENABLE_PTHREAD_MUTEX_T 1 /**< pthread_mutex_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PTHREAD_MUTEXATTR_T
|
||||
#define posixconfigENABLE_PTHREAD_MUTEXATTR_T 1 /**< pthread_mutexattr_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_PTHREAD_T
|
||||
#define posixconfigENABLE_PTHREAD_T 1 /**< pthread_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_SSIZE_T
|
||||
#define posixconfigENABLE_SSIZE_T 1 /**< ssize_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_TIME_T
|
||||
#define posixconfigENABLE_TIME_T 1 /**< time_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_TIMER_T
|
||||
#define posixconfigENABLE_TIMER_T 1 /**< timer_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_USECONDS_T
|
||||
#define posixconfigENABLE_USECONDS_T 1 /**< useconds_t in sys/types.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_TIMESPEC
|
||||
#define posixconfigENABLE_TIMESPEC 1 /**< struct timespec in time.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_ITIMERSPEC
|
||||
#define posixconfigENABLE_ITIMERSPEC 1 /**< struct itimerspec in time.h */
|
||||
#endif
|
||||
#ifndef posixconfigENABLE_TM
|
||||
#define posixconfigENABLE_TM 1 /**< struct tm in time.h */
|
||||
#endif
|
||||
/**@} */
|
||||
|
||||
#endif /* ifndef _FREERTOS_POSIX_PORTABLE_DEFAULT_H_ */
|
Reference in New Issue
Block a user