mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
Added xSemaphoreGetMutexHolder() macro and equivalent function.
This commit is contained in:
parent
6dc8b56cb6
commit
2658a3b6ef
|
@ -56,7 +56,7 @@
|
||||||
#define QUEUE_H
|
#define QUEUE_H
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
#ifndef INC_FREERTOS_H
|
||||||
#error "#include FreeRTOS.h" must appear in source files before "#include queue.h"
|
#error "include FreeRTOS.h" must appear in source files before "include queue.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -1221,11 +1221,13 @@ signed portBASE_TYPE xQueueCRSend( xQueueHandle pxQueue, const void *pvItemToQue
|
||||||
signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );
|
signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, portTickType xTicksToWait );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For internal use only. Use xSemaphoreCreateMutex() or
|
* For internal use only. Use xSemaphoreCreateMutex(),
|
||||||
* xSemaphoreCreateCounting() instead of calling these functions directly.
|
* xSemaphoreCreateCounting() or xSemaphoreGetMutexHolder() instead of calling
|
||||||
|
* these functions directly.
|
||||||
*/
|
*/
|
||||||
xQueueHandle xQueueCreateMutex( unsigned char ucQueueType );
|
xQueueHandle xQueueCreateMutex( unsigned char ucQueueType );
|
||||||
xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );
|
xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );
|
||||||
|
void* xQueueGetMutexHolder( xQueueHandle xSemaphore );
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* For internal use only. Use xSemaphoreTakeMutexRecursive() or
|
* For internal use only. Use xSemaphoreTakeMutexRecursive() or
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
#define SEMAPHORE_H
|
#define SEMAPHORE_H
|
||||||
|
|
||||||
#ifndef INC_FREERTOS_H
|
#ifndef INC_FREERTOS_H
|
||||||
#error "#include FreeRTOS.h" must appear in source files before "#include semphr.h"
|
#error "include FreeRTOS.h" must appear in source files before "include semphr.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "queue.h"
|
#include "queue.h"
|
||||||
|
@ -718,7 +718,22 @@ typedef xQueueHandle xSemaphoreHandle;
|
||||||
* \page vSemaphoreDelete vSemaphoreDelete
|
* \page vSemaphoreDelete vSemaphoreDelete
|
||||||
* \ingroup Semaphores
|
* \ingroup Semaphores
|
||||||
*/
|
*/
|
||||||
#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) xSemaphore )
|
#define vSemaphoreDelete( xSemaphore ) vQueueDelete( ( xQueueHandle ) ( xSemaphore ) )
|
||||||
|
|
||||||
|
/**
|
||||||
|
* semphr.h
|
||||||
|
* <pre>xTaskHandle xSemaphoreGetMutexHolder( xSemaphoreHandle xMutex );</pre>
|
||||||
|
*
|
||||||
|
* If xMutex is indeed a mutex type semaphore, return the current mutex holder.
|
||||||
|
* If xMutex is not a mutex type semaphore, or the mutex is available (not held
|
||||||
|
* by a task), return NULL.
|
||||||
|
*
|
||||||
|
* Note: This Is is a good way of determining if the calling task is the mutex
|
||||||
|
* holder, but not a good way of determining the identity of the mutex holder as
|
||||||
|
* the holder may change between the function exiting and the returned value
|
||||||
|
* being tested.
|
||||||
|
*/
|
||||||
|
#define xSemaphoreGetMutexHolder( xSemaphore ) xQueueGetMutexHolder( ( xSemaphore ) )
|
||||||
|
|
||||||
#endif /* SEMAPHORE_H */
|
#endif /* SEMAPHORE_H */
|
||||||
|
|
||||||
|
|
|
@ -164,6 +164,7 @@ unsigned char ucQueueGetQueueNumber( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;
|
||||||
void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION;
|
void vQueueSetQueueNumber( xQueueHandle pxQueue, unsigned char ucQueueNumber ) PRIVILEGED_FUNCTION;
|
||||||
unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;
|
unsigned char ucQueueGetQueueType( xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;
|
||||||
portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue ) PRIVILEGED_FUNCTION;
|
portBASE_TYPE xQueueGenericReset( xQueueHandle pxQueue, portBASE_TYPE xNewQueue ) PRIVILEGED_FUNCTION;
|
||||||
|
xTaskHandle xQueueGetMutexHolder( xQueueHandle xSemaphore ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Co-routine queue functions differ from task queue functions. Co-routines are
|
* Co-routine queue functions differ from task queue functions. Co-routines are
|
||||||
|
@ -307,7 +308,7 @@ xQUEUE *pxNewQueue;
|
||||||
size_t xQueueSizeInBytes;
|
size_t xQueueSizeInBytes;
|
||||||
xQueueHandle xReturn = NULL;
|
xQueueHandle xReturn = NULL;
|
||||||
|
|
||||||
/* Remove compiler warnings about unused parameters should
|
/* Remove compiler warnings about unused parameters should
|
||||||
configUSE_TRACE_FACILITY not be set to 1. */
|
configUSE_TRACE_FACILITY not be set to 1. */
|
||||||
( void ) ucQueueType;
|
( void ) ucQueueType;
|
||||||
|
|
||||||
|
@ -361,7 +362,7 @@ xQueueHandle xReturn = NULL;
|
||||||
/* Prevent compiler warnings about unused parameters if
|
/* Prevent compiler warnings about unused parameters if
|
||||||
configUSE_TRACE_FACILITY does not equal 1. */
|
configUSE_TRACE_FACILITY does not equal 1. */
|
||||||
( void ) ucQueueType;
|
( void ) ucQueueType;
|
||||||
|
|
||||||
/* Allocate the new queue structure. */
|
/* Allocate the new queue structure. */
|
||||||
pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) );
|
pxNewQueue = ( xQUEUE * ) pvPortMalloc( sizeof( xQUEUE ) );
|
||||||
if( pxNewQueue != NULL )
|
if( pxNewQueue != NULL )
|
||||||
|
@ -383,7 +384,7 @@ xQueueHandle xReturn = NULL;
|
||||||
pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U;
|
pxNewQueue->uxItemSize = ( unsigned portBASE_TYPE ) 0U;
|
||||||
pxNewQueue->xRxLock = queueUNLOCKED;
|
pxNewQueue->xRxLock = queueUNLOCKED;
|
||||||
pxNewQueue->xTxLock = queueUNLOCKED;
|
pxNewQueue->xTxLock = queueUNLOCKED;
|
||||||
|
|
||||||
#if ( configUSE_TRACE_FACILITY == 1 )
|
#if ( configUSE_TRACE_FACILITY == 1 )
|
||||||
{
|
{
|
||||||
pxNewQueue->ucQueueType = ucQueueType;
|
pxNewQueue->ucQueueType = ucQueueType;
|
||||||
|
@ -411,7 +412,37 @@ xQueueHandle xReturn = NULL;
|
||||||
#endif /* configUSE_MUTEXES */
|
#endif /* configUSE_MUTEXES */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if configUSE_RECURSIVE_MUTEXES == 1
|
#if ( configUSE_MUTEXES == 1 )
|
||||||
|
|
||||||
|
void* xQueueGetMutexHolder( xQueueHandle xSemaphore )
|
||||||
|
{
|
||||||
|
void *pxReturn;
|
||||||
|
|
||||||
|
/* This function is called by xSemaphoreGetMutexHolder(), and should not
|
||||||
|
be called directly. Note: This is is a good way of determining if the
|
||||||
|
calling task is the mutex holder, but not a good way of determining the
|
||||||
|
identity of the mutex holder, as the holder may change between the
|
||||||
|
following critical section exiting and the function returning. */
|
||||||
|
taskENTER_CRITICAL();
|
||||||
|
{
|
||||||
|
if( xSemaphore->uxQueueType == queueQUEUE_IS_MUTEX )
|
||||||
|
{
|
||||||
|
pxReturn = ( void * ) xSemaphore->pxMutexHolder;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pxReturn = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
|
return pxReturn;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
#if ( configUSE_RECURSIVE_MUTEXES == 1 )
|
||||||
|
|
||||||
portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex )
|
portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex )
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue