mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-04-19 21:11:57 -04:00
First pass at updating from MISRA 2004 to MISRA 2012:
Updated pvContainer member of list items to List_t * rather than void * as they are always contained in a list if anywhere. Made EventGroupHandle_t typesafe pointer to forward referenced struct rather than void pointer. Made TaskHandle_t typesafe pointer to forward referenced struct, rather than a void pointer.
This commit is contained in:
parent
5bebf10fa4
commit
390fb06b49
|
@ -260,7 +260,7 @@ CRCB_t *pxCRCB;
|
||||||
( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );
|
( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );
|
||||||
|
|
||||||
/* Is the co-routine waiting on an event also? */
|
/* Is the co-routine waiting on an event also? */
|
||||||
if( pxCRCB->xEventListItem.pvContainer )
|
if( pxCRCB->xEventListItem.pxContainer )
|
||||||
{
|
{
|
||||||
( void ) uxListRemove( &( pxCRCB->xEventListItem ) );
|
( void ) uxListRemove( &( pxCRCB->xEventListItem ) );
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,11 +39,11 @@ task.h is included from an application file. */
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
#include "event_groups.h"
|
#include "event_groups.h"
|
||||||
|
|
||||||
/* Lint e961 and e750 are suppressed as a MISRA exception justified because the
|
/* Lint e961, e750 and e9021 are suppressed as a MISRA exception justified
|
||||||
MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the
|
because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined
|
||||||
header files above, but not in this file, in order to generate the correct
|
for the header files above, but not in this file, in order to generate the
|
||||||
privileged Vs unprivileged linkage and placement. */
|
correct privileged Vs unprivileged linkage and placement. */
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021 See comment above. */
|
||||||
|
|
||||||
/* The following bit fields convey control information in a task's event list
|
/* The following bit fields convey control information in a task's event list
|
||||||
item value. It is important they don't clash with the
|
item value. It is important they don't clash with the
|
||||||
|
@ -60,7 +60,7 @@ taskEVENT_LIST_ITEM_VALUE_IN_USE definition. */
|
||||||
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
|
#define eventEVENT_BITS_CONTROL_BYTES 0xff000000UL
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct xEventGroupDefinition
|
typedef struct xEventGroup
|
||||||
{
|
{
|
||||||
EventBits_t uxEventBits;
|
EventBits_t uxEventBits;
|
||||||
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
|
List_t xTasksWaitingForBits; /*< List of tasks waiting for a bit to be set. */
|
||||||
|
@ -104,11 +104,11 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
event group structure. */
|
event group structure. */
|
||||||
volatile size_t xSize = sizeof( StaticEventGroup_t );
|
volatile size_t xSize = sizeof( StaticEventGroup_t );
|
||||||
configASSERT( xSize == sizeof( EventGroup_t ) );
|
configASSERT( xSize == sizeof( EventGroup_t ) );
|
||||||
}
|
} /*lint !e529 xSize is referenced if configASSERT() is defined. */
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
|
|
||||||
/* The user has provided a statically allocated event group - use it. */
|
/* The user has provided a statically allocated event group - use it. */
|
||||||
pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 EventGroup_t and StaticEventGroup_t are guaranteed to have the same size and alignment requirement - checked by configASSERT(). */
|
pxEventBits = ( EventGroup_t * ) pxEventGroupBuffer; /*lint !e740 !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */
|
||||||
|
|
||||||
if( pxEventBits != NULL )
|
if( pxEventBits != NULL )
|
||||||
{
|
{
|
||||||
|
@ -128,10 +128,13 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
/* xEventGroupCreateStatic should only ever be called with
|
||||||
|
pxEventGroupBuffer pointing to a pre-allocated (compile time
|
||||||
|
allocated) StaticEventGroup_t variable. */
|
||||||
traceEVENT_GROUP_CREATE_FAILED();
|
traceEVENT_GROUP_CREATE_FAILED();
|
||||||
}
|
}
|
||||||
|
|
||||||
return ( EventGroupHandle_t ) pxEventBits;
|
return ( EventGroupHandle_t ) pxEventBits; /*lint !e9087 EventGroup_t and StaticEventGroup_t are deliberately aliased for data hiding purposes and guaranteed to have the same size and alignment requirement - checked by configASSERT(). */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
|
@ -143,8 +146,20 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
{
|
{
|
||||||
EventGroup_t *pxEventBits;
|
EventGroup_t *pxEventBits;
|
||||||
|
|
||||||
/* Allocate the event group. */
|
/* Allocate the event group. Justification for MISRA deviation as
|
||||||
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) );
|
follows: pvPortMalloc() always ensures returned memory blocks are
|
||||||
|
aligned per the requirements of the MCU stack. In this case
|
||||||
|
pvPortMalloc() must return a pointer that is guaranteed to meet the
|
||||||
|
alignment requirements of the EventGroup_t structure - which (if you
|
||||||
|
follow it through) is the alignment requirements of the TickType_t type
|
||||||
|
(EventBits_t being of TickType_t itself). Therefore, whenever the
|
||||||
|
stack alignment requirements are greater than or equal to the
|
||||||
|
TickType_t alignment requirements the cast is safe. In other cases,
|
||||||
|
where the natural word size of the architecture is less than
|
||||||
|
sizeof( TickType_t ), the TickType_t variables will be accessed in two
|
||||||
|
or more reads operations, and the alignment requirements is only that
|
||||||
|
of each individual read. */
|
||||||
|
pxEventBits = ( EventGroup_t * ) pvPortMalloc( sizeof( EventGroup_t ) ); /*lint !e9087 !e9079 see comment above. */
|
||||||
|
|
||||||
if( pxEventBits != NULL )
|
if( pxEventBits != NULL )
|
||||||
{
|
{
|
||||||
|
@ -164,10 +179,10 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
traceEVENT_GROUP_CREATE_FAILED();
|
traceEVENT_GROUP_CREATE_FAILED(); /*lint !e9063 Else branch only exists to allow tracing and does not generate code if trace macros are not defined. */
|
||||||
}
|
}
|
||||||
|
|
||||||
return ( EventGroupHandle_t ) pxEventBits;
|
return ( EventGroupHandle_t ) pxEventBits; /*lint !e9087 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
#endif /* configSUPPORT_DYNAMIC_ALLOCATION */
|
||||||
|
@ -176,7 +191,7 @@ static BaseType_t prvTestWaitCondition( const EventBits_t uxCurrentEventBits, co
|
||||||
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )
|
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait )
|
||||||
{
|
{
|
||||||
EventBits_t uxOriginalBitValue, uxReturn;
|
EventBits_t uxOriginalBitValue, uxReturn;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t. It is opaque outside of this file for data hiding purposes. */
|
||||||
BaseType_t xAlreadyYielded;
|
BaseType_t xAlreadyYielded;
|
||||||
BaseType_t xTimeoutOccurred = pdFALSE;
|
BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
|
||||||
|
@ -295,7 +310,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
|
||||||
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )
|
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait )
|
||||||
{
|
{
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t. It is opaque outside of this file for data hiding purposes. */
|
||||||
EventBits_t uxReturn, uxControlBits = 0;
|
EventBits_t uxReturn, uxControlBits = 0;
|
||||||
BaseType_t xWaitConditionMet, xAlreadyYielded;
|
BaseType_t xWaitConditionMet, xAlreadyYielded;
|
||||||
BaseType_t xTimeoutOccurred = pdFALSE;
|
BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
@ -445,7 +460,7 @@ BaseType_t xTimeoutOccurred = pdFALSE;
|
||||||
|
|
||||||
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
|
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear )
|
||||||
{
|
{
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
EventBits_t uxReturn;
|
EventBits_t uxReturn;
|
||||||
|
|
||||||
/* Check the user is not attempting to clear the bits used by the kernel
|
/* Check the user is not attempting to clear the bits used by the kernel
|
||||||
|
@ -477,7 +492,7 @@ EventBits_t uxReturn;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );
|
traceEVENT_GROUP_CLEAR_BITS_FROM_ISR( xEventGroup, uxBitsToClear );
|
||||||
xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL );
|
xReturn = xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
@ -488,7 +503,7 @@ EventBits_t uxReturn;
|
||||||
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
|
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup )
|
||||||
{
|
{
|
||||||
UBaseType_t uxSavedInterruptStatus;
|
UBaseType_t uxSavedInterruptStatus;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t const * const pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
EventBits_t uxReturn;
|
EventBits_t uxReturn;
|
||||||
|
|
||||||
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
|
@ -498,16 +513,16 @@ EventBits_t uxReturn;
|
||||||
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
|
portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );
|
||||||
|
|
||||||
return uxReturn;
|
return uxReturn;
|
||||||
}
|
} /*lint !e818 EventGroupHandle_t is a typedef used in other functions to so can't be pointer to const. */
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
|
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet )
|
||||||
{
|
{
|
||||||
ListItem_t *pxListItem, *pxNext;
|
ListItem_t *pxListItem, *pxNext;
|
||||||
ListItem_t const *pxListEnd;
|
ListItem_t const *pxListEnd;
|
||||||
List_t *pxList;
|
List_t const * pxList;
|
||||||
EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;
|
EventBits_t uxBitsToClear = 0, uxBitsWaitedFor, uxControlBits;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
BaseType_t xMatchFound = pdFALSE;
|
BaseType_t xMatchFound = pdFALSE;
|
||||||
|
|
||||||
/* Check the user is not attempting to set the bits used by the kernel
|
/* Check the user is not attempting to set the bits used by the kernel
|
||||||
|
@ -516,7 +531,7 @@ BaseType_t xMatchFound = pdFALSE;
|
||||||
configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
configASSERT( ( uxBitsToSet & eventEVENT_BITS_CONTROL_BYTES ) == 0 );
|
||||||
|
|
||||||
pxList = &( pxEventBits->xTasksWaitingForBits );
|
pxList = &( pxEventBits->xTasksWaitingForBits );
|
||||||
pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxListEnd = listGET_END_MARKER( pxList ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
{
|
{
|
||||||
traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );
|
traceEVENT_GROUP_SET_BITS( xEventGroup, uxBitsToSet );
|
||||||
|
@ -597,7 +612,7 @@ BaseType_t xMatchFound = pdFALSE;
|
||||||
|
|
||||||
void vEventGroupDelete( EventGroupHandle_t xEventGroup )
|
void vEventGroupDelete( EventGroupHandle_t xEventGroup )
|
||||||
{
|
{
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
|
|
||||||
vTaskSuspendAll();
|
vTaskSuspendAll();
|
||||||
|
@ -641,7 +656,7 @@ const List_t *pxTasksWaitingForBits = &( pxEventBits->xTasksWaitingForBits );
|
||||||
an interrupt. */
|
an interrupt. */
|
||||||
void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet )
|
void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet )
|
||||||
{
|
{
|
||||||
( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet );
|
( void ) xEventGroupSetBits( pvEventGroup, ( EventBits_t ) ulBitsToSet ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -649,7 +664,7 @@ void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet
|
||||||
an interrupt. */
|
an interrupt. */
|
||||||
void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear )
|
void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear )
|
||||||
{
|
{
|
||||||
( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear );
|
( void ) xEventGroupClearBits( pvEventGroup, ( EventBits_t ) ulBitsToClear ); /*lint !e9079 Can't avoid cast to void* as a generic timer callback prototype. Callback casts back to original type so safe. */
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
@ -695,7 +710,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
|
traceEVENT_GROUP_SET_BITS_FROM_ISR( xEventGroup, uxBitsToSet );
|
||||||
xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken );
|
xReturn = xTimerPendFunctionCallFromISR( vEventGroupSetBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToSet, pxHigherPriorityTaskWoken ); /*lint !e9087 Can't avoid cast to void* as a generic callback function not specific to this use case. Callback casts back to original type so safe. */
|
||||||
|
|
||||||
return xReturn;
|
return xReturn;
|
||||||
}
|
}
|
||||||
|
@ -708,7 +723,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
UBaseType_t uxEventGroupGetNumber( void* xEventGroup )
|
UBaseType_t uxEventGroupGetNumber( void* xEventGroup )
|
||||||
{
|
{
|
||||||
UBaseType_t xReturn;
|
UBaseType_t xReturn;
|
||||||
EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;
|
EventGroup_t const *pxEventBits = ( EventGroup_t * ) xEventGroup; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
|
|
||||||
if( xEventGroup == NULL )
|
if( xEventGroup == NULL )
|
||||||
{
|
{
|
||||||
|
@ -729,7 +744,7 @@ BaseType_t xWaitConditionMet = pdFALSE;
|
||||||
|
|
||||||
void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber )
|
void vEventGroupSetNumber( void * xEventGroup, UBaseType_t uxEventGroupNumber )
|
||||||
{
|
{
|
||||||
( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber;
|
( ( EventGroup_t * ) xEventGroup )->uxEventGroupNumber = uxEventGroupNumber; /*lint !e9087 !e9079 EventGroupHandle_t is a pointer to an EventGroup_t, but EventGroupHandle_t is kept opaque outside of this file for data hiding purposes. */
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* configUSE_TRACE_FACILITY */
|
#endif /* configUSE_TRACE_FACILITY */
|
||||||
|
|
|
@ -78,7 +78,8 @@ extern "C" {
|
||||||
* \defgroup EventGroupHandle_t EventGroupHandle_t
|
* \defgroup EventGroupHandle_t EventGroupHandle_t
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
typedef void * EventGroupHandle_t;
|
struct xEventGroup;
|
||||||
|
typedef struct xEventGroup * EventGroupHandle_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The type that holds event bits always matches TickType_t - therefore the
|
* The type that holds event bits always matches TickType_t - therefore the
|
||||||
|
@ -404,7 +405,7 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
||||||
* \ingroup EventGroup
|
* \ingroup EventGroup
|
||||||
*/
|
*/
|
||||||
#if( configUSE_TRACE_FACILITY == 1 )
|
#if( configUSE_TRACE_FACILITY == 1 )
|
||||||
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;
|
BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
|
||||||
#else
|
#else
|
||||||
#define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL )
|
#define xEventGroupClearBitsFromISR( xEventGroup, uxBitsToClear ) xTimerPendFunctionCallFromISR( vEventGroupClearBitsCallback, ( void * ) xEventGroup, ( uint32_t ) uxBitsToClear, NULL )
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -136,6 +136,7 @@ use of FreeRTOS.*/
|
||||||
/*
|
/*
|
||||||
* Definition of the only type of object that a list can contain.
|
* Definition of the only type of object that a list can contain.
|
||||||
*/
|
*/
|
||||||
|
struct xLIST;
|
||||||
struct xLIST_ITEM
|
struct xLIST_ITEM
|
||||||
{
|
{
|
||||||
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
|
@ -143,7 +144,7 @@ struct xLIST_ITEM
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */
|
struct xLIST_ITEM * configLIST_VOLATILE pxNext; /*< Pointer to the next ListItem_t in the list. */
|
||||||
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */
|
struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; /*< Pointer to the previous ListItem_t in the list. */
|
||||||
void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */
|
void * pvOwner; /*< Pointer to the object (normally a TCB) that contains the list item. There is therefore a two way link between the object containing the list item and the list item itself. */
|
||||||
void * configLIST_VOLATILE pvContainer; /*< Pointer to the list in which this list item is placed (if any). */
|
struct xLIST * configLIST_VOLATILE pxContainer; /*< Pointer to the list in which this list item is placed (if any). */
|
||||||
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE /*< Set to a known value if configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
};
|
};
|
||||||
typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */
|
typedef struct xLIST_ITEM ListItem_t; /* For some reason lint wants this as two separate definitions. */
|
||||||
|
@ -246,7 +247,7 @@ typedef struct xLIST
|
||||||
* \page listLIST_IS_EMPTY listLIST_IS_EMPTY
|
* \page listLIST_IS_EMPTY listLIST_IS_EMPTY
|
||||||
* \ingroup LinkedList
|
* \ingroup LinkedList
|
||||||
*/
|
*/
|
||||||
#define listLIST_IS_EMPTY( pxList ) ( ( BaseType_t ) ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) )
|
#define listLIST_IS_EMPTY( pxList ) ( ( ( pxList )->uxNumberOfItems == ( UBaseType_t ) 0 ) ? pdTRUE : pdFALSE )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Access macro to return the number of items in the list.
|
* Access macro to return the number of items in the list.
|
||||||
|
@ -314,7 +315,7 @@ List_t * const pxConstList = ( pxList ); \
|
||||||
* @param pxListItem The list item we want to know if is in the list.
|
* @param pxListItem The list item we want to know if is in the list.
|
||||||
* @return pdTRUE if the list item is in the list, otherwise pdFALSE.
|
* @return pdTRUE if the list item is in the list, otherwise pdFALSE.
|
||||||
*/
|
*/
|
||||||
#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( BaseType_t ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) ) )
|
#define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( ( pxListItem )->pxContainer == ( pxList ) ) ? pdTRUE : pdFALSE )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Return the list a list item is contained within (referenced from).
|
* Return the list a list item is contained within (referenced from).
|
||||||
|
@ -322,7 +323,7 @@ List_t * const pxConstList = ( pxList ); \
|
||||||
* @param pxListItem The list item being queried.
|
* @param pxListItem The list item being queried.
|
||||||
* @return A pointer to the List_t object that references the pxListItem
|
* @return A pointer to the List_t object that references the pxListItem
|
||||||
*/
|
*/
|
||||||
#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pvContainer )
|
#define listLIST_ITEM_CONTAINER( pxListItem ) ( ( pxListItem )->pxContainer )
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This provides a crude means of knowing if a list has been initialised, as
|
* This provides a crude means of knowing if a list has been initialised, as
|
||||||
|
|
|
@ -47,7 +47,7 @@ void MPU_vTaskDelete( TaskHandle_t xTaskToDelete );
|
||||||
void MPU_vTaskDelay( const TickType_t xTicksToDelay );
|
void MPU_vTaskDelay( const TickType_t xTicksToDelay );
|
||||||
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );
|
void MPU_vTaskDelayUntil( TickType_t * const pxPreviousWakeTime, const TickType_t xTimeIncrement );
|
||||||
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask );
|
BaseType_t MPU_xTaskAbortDelay( TaskHandle_t xTask );
|
||||||
UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t xTask );
|
UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t xTask );
|
||||||
eTaskState MPU_eTaskGetState( TaskHandle_t xTask );
|
eTaskState MPU_eTaskGetState( TaskHandle_t xTask );
|
||||||
void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
|
void MPU_vTaskGetInfo( TaskHandle_t xTask, TaskStatus_t *pxTaskStatus, BaseType_t xGetFreeStackSpace, eTaskState eState );
|
||||||
void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
|
void MPU_vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
|
||||||
|
|
|
@ -58,7 +58,8 @@ extern "C" {
|
||||||
* \defgroup TaskHandle_t TaskHandle_t
|
* \defgroup TaskHandle_t TaskHandle_t
|
||||||
* \ingroup Tasks
|
* \ingroup Tasks
|
||||||
*/
|
*/
|
||||||
typedef void * TaskHandle_t;
|
struct xTaskControlBlock;
|
||||||
|
typedef struct xTaskControlBlock* TaskHandle_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Defines the prototype to which the application task hook function must
|
* Defines the prototype to which the application task hook function must
|
||||||
|
@ -74,7 +75,7 @@ typedef enum
|
||||||
eBlocked, /* The task being queried is in the Blocked state. */
|
eBlocked, /* The task being queried is in the Blocked state. */
|
||||||
eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
|
eSuspended, /* The task being queried is in the Suspended state, or is in the Blocked state with an infinite time out. */
|
||||||
eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */
|
eDeleted, /* The task being queried has been deleted, but its TCB has not yet been freed. */
|
||||||
eInvalid /* Used as an 'invalid state' value. */
|
eInvalid /* Used as an 'invalid state' value. */
|
||||||
} eTaskState;
|
} eTaskState;
|
||||||
|
|
||||||
/* Actions that can be performed when vTaskNotify() is called. */
|
/* Actions that can be performed when vTaskNotify() is called. */
|
||||||
|
@ -834,7 +835,7 @@ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
* <pre>UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask );</pre>
|
* <pre>UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );</pre>
|
||||||
*
|
*
|
||||||
* INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available.
|
* INCLUDE_uxTaskPriorityGet must be defined as 1 for this function to be available.
|
||||||
* See the configuration section for more information.
|
* See the configuration section for more information.
|
||||||
|
@ -877,15 +878,15 @@ BaseType_t xTaskAbortDelay( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
* \defgroup uxTaskPriorityGet uxTaskPriorityGet
|
* \defgroup uxTaskPriorityGet uxTaskPriorityGet
|
||||||
* \ingroup TaskCtrl
|
* \ingroup TaskCtrl
|
||||||
*/
|
*/
|
||||||
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
* <pre>UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask );</pre>
|
* <pre>UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask );</pre>
|
||||||
*
|
*
|
||||||
* A version of uxTaskPriorityGet() that can be used from an ISR.
|
* A version of uxTaskPriorityGet() that can be used from an ISR.
|
||||||
*/
|
*/
|
||||||
UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* task. h
|
* task. h
|
||||||
|
|
|
@ -39,7 +39,7 @@ void vListInitialise( List_t * const pxList )
|
||||||
/* The list structure contains a list item which is used to mark the
|
/* The list structure contains a list item which is used to mark the
|
||||||
end of the list. To initialise the list the list end is inserted
|
end of the list. To initialise the list the list end is inserted
|
||||||
as the only list entry. */
|
as the only list entry. */
|
||||||
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
|
|
||||||
/* The list end value is the highest possible value in the list to
|
/* The list end value is the highest possible value in the list to
|
||||||
ensure it remains at the end of the list. */
|
ensure it remains at the end of the list. */
|
||||||
|
@ -47,8 +47,8 @@ void vListInitialise( List_t * const pxList )
|
||||||
|
|
||||||
/* The list end next and previous pointers point to itself so we know
|
/* The list end next and previous pointers point to itself so we know
|
||||||
when the list is empty. */
|
when the list is empty. */
|
||||||
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd ); /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
||||||
|
|
||||||
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
|
pxList->uxNumberOfItems = ( UBaseType_t ) 0U;
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ void vListInitialise( List_t * const pxList )
|
||||||
void vListInitialiseItem( ListItem_t * const pxItem )
|
void vListInitialiseItem( ListItem_t * const pxItem )
|
||||||
{
|
{
|
||||||
/* Make sure the list item is not recorded as being on a list. */
|
/* Make sure the list item is not recorded as being on a list. */
|
||||||
pxItem->pvContainer = NULL;
|
pxItem->pxContainer = NULL;
|
||||||
|
|
||||||
/* Write known values into the list item if
|
/* Write known values into the list item if
|
||||||
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */
|
||||||
|
@ -94,7 +94,7 @@ ListItem_t * const pxIndex = pxList->pxIndex;
|
||||||
pxIndex->pxPrevious = pxNewListItem;
|
pxIndex->pxPrevious = pxNewListItem;
|
||||||
|
|
||||||
/* Remember which list the item is in. */
|
/* Remember which list the item is in. */
|
||||||
pxNewListItem->pvContainer = ( void * ) pxList;
|
pxNewListItem->pxContainer = pxList;
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
( pxList->uxNumberOfItems )++;
|
||||||
}
|
}
|
||||||
|
@ -127,18 +127,18 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
{
|
{
|
||||||
/* *** NOTE ***********************************************************
|
/* *** NOTE ***********************************************************
|
||||||
If you find your application is crashing here then likely causes are
|
If you find your application is crashing here then likely causes are
|
||||||
listed below. In addition see http://www.freertos.org/FAQHelp.html for
|
listed below. In addition see https://www.freertos.org/FAQHelp.html for
|
||||||
more tips, and ensure configASSERT() is defined!
|
more tips, and ensure configASSERT() is defined!
|
||||||
http://www.freertos.org/a00110.html#configASSERT
|
https://www.freertos.org/a00110.html#configASSERT
|
||||||
|
|
||||||
1) Stack overflow -
|
1) Stack overflow -
|
||||||
see http://www.freertos.org/Stacks-and-stack-overflow-checking.html
|
see https://www.freertos.org/Stacks-and-stack-overflow-checking.html
|
||||||
2) Incorrect interrupt priority assignment, especially on Cortex-M
|
2) Incorrect interrupt priority assignment, especially on Cortex-M
|
||||||
parts where numerically high priority values denote low actual
|
parts where numerically high priority values denote low actual
|
||||||
interrupt priorities, which can seem counter intuitive. See
|
interrupt priorities, which can seem counter intuitive. See
|
||||||
http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition
|
https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition
|
||||||
of configMAX_SYSCALL_INTERRUPT_PRIORITY on
|
of configMAX_SYSCALL_INTERRUPT_PRIORITY on
|
||||||
http://www.freertos.org/a00110.html
|
https://www.freertos.org/a00110.html
|
||||||
3) Calling an API function from within a critical section or when
|
3) Calling an API function from within a critical section or when
|
||||||
the scheduler is suspended, or calling an API function that does
|
the scheduler is suspended, or calling an API function that does
|
||||||
not end in "FromISR" from an interrupt.
|
not end in "FromISR" from an interrupt.
|
||||||
|
@ -147,7 +147,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
before vTaskStartScheduler() has been called?).
|
before vTaskStartScheduler() has been called?).
|
||||||
**********************************************************************/
|
**********************************************************************/
|
||||||
|
|
||||||
for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM. This is checked and valid. */
|
for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM. This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */
|
||||||
{
|
{
|
||||||
/* There is nothing to do here, just iterating to the wanted
|
/* There is nothing to do here, just iterating to the wanted
|
||||||
insertion position. */
|
insertion position. */
|
||||||
|
@ -161,7 +161,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
|
||||||
|
|
||||||
/* Remember which list the item is in. This allows fast removal of the
|
/* Remember which list the item is in. This allows fast removal of the
|
||||||
item later. */
|
item later. */
|
||||||
pxNewListItem->pvContainer = ( void * ) pxList;
|
pxNewListItem->pxContainer = pxList;
|
||||||
|
|
||||||
( pxList->uxNumberOfItems )++;
|
( pxList->uxNumberOfItems )++;
|
||||||
}
|
}
|
||||||
|
@ -171,7 +171,7 @@ UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
|
||||||
{
|
{
|
||||||
/* The list item knows which list it is in. Obtain the list from the list
|
/* The list item knows which list it is in. Obtain the list from the list
|
||||||
item. */
|
item. */
|
||||||
List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
|
List_t * const pxList = pxItemToRemove->pxContainer;
|
||||||
|
|
||||||
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
|
||||||
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
|
pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
|
||||||
|
@ -189,7 +189,7 @@ List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
pxItemToRemove->pvContainer = NULL;
|
pxItemToRemove->pxContainer = NULL;
|
||||||
( pxList->uxNumberOfItems )--;
|
( pxList->uxNumberOfItems )--;
|
||||||
|
|
||||||
return pxList->uxNumberOfItems;
|
return pxList->uxNumberOfItems;
|
||||||
|
|
|
@ -163,7 +163,7 @@ BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
||||||
UBaseType_t MPU_uxTaskPriorityGet( TaskHandle_t pxTask )
|
UBaseType_t MPU_uxTaskPriorityGet( const TaskHandle_t pxTask )
|
||||||
{
|
{
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
BaseType_t xRunningPrivileged = xPortRaisePrivilege();
|
||||||
|
|
|
@ -40,11 +40,11 @@ task.h is included from an application file. */
|
||||||
#include "timers.h"
|
#include "timers.h"
|
||||||
#include "stack_macros.h"
|
#include "stack_macros.h"
|
||||||
|
|
||||||
/* Lint e961 and e750 are suppressed as a MISRA exception justified because the
|
/* Lint e9021, e961 and e750 are suppressed as a MISRA exception justified
|
||||||
MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined for the
|
because the MPU ports require MPU_WRAPPERS_INCLUDED_FROM_API_FILE to be defined
|
||||||
header files above, but not in this file, in order to generate the correct
|
for the header files above, but not in this file, in order to generate the
|
||||||
privileged Vs unprivileged linkage and placement. */
|
correct privileged Vs unprivileged linkage and placement. */
|
||||||
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750. */
|
#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE /*lint !e961 !e750 !e9021. */
|
||||||
|
|
||||||
/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting
|
/* Set configUSE_STATS_FORMATTING_FUNCTIONS to 2 to include the stats formatting
|
||||||
functions but without including stdio.h here. */
|
functions but without including stdio.h here. */
|
||||||
|
@ -245,7 +245,7 @@ count overflows. */
|
||||||
* task should be used in place of the parameter. This macro simply checks to
|
* task should be used in place of the parameter. This macro simply checks to
|
||||||
* see if the parameter is NULL and returns a pointer to the appropriate TCB.
|
* see if the parameter is NULL and returns a pointer to the appropriate TCB.
|
||||||
*/
|
*/
|
||||||
#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) )
|
#define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? pxCurrentTCB : ( pxHandle ) )
|
||||||
|
|
||||||
/* The item value of the event list item is normally used to hold the priority
|
/* The item value of the event list item is normally used to hold the priority
|
||||||
of the task to which it belongs (coded to allow it to be held in reverse
|
of the task to which it belongs (coded to allow it to be held in reverse
|
||||||
|
@ -266,7 +266,7 @@ to its original value when it is released. */
|
||||||
* and stores task state information, including a pointer to the task's context
|
* and stores task state information, including a pointer to the task's context
|
||||||
* (the task's run time environment, including register values)
|
* (the task's run time environment, including register values)
|
||||||
*/
|
*/
|
||||||
typedef struct tskTaskControlBlock
|
typedef struct xTaskControlBlock
|
||||||
{
|
{
|
||||||
volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */
|
volatile StackType_t *pxTopOfStack; /*< Points to the location of the last item placed on the tasks stack. THIS MUST BE THE FIRST MEMBER OF THE TCB STRUCT. */
|
||||||
|
|
||||||
|
@ -328,7 +328,7 @@ typedef struct tskTaskControlBlock
|
||||||
|
|
||||||
/* See the comments above the definition of
|
/* See the comments above the definition of
|
||||||
tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */
|
tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE. */
|
||||||
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */
|
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
|
||||||
uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */
|
uint8_t ucStaticallyAllocated; /*< Set to pdTRUE if the task is a statically allocated to ensure no attempt is made to free the memory. */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -344,13 +344,10 @@ typedef tskTCB TCB_t;
|
||||||
|
|
||||||
/*lint -save -e956 A manual analysis and inspection has been used to determine
|
/*lint -save -e956 A manual analysis and inspection has been used to determine
|
||||||
which static variables must be declared volatile. */
|
which static variables must be declared volatile. */
|
||||||
|
|
||||||
PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;
|
PRIVILEGED_DATA TCB_t * volatile pxCurrentTCB = NULL;
|
||||||
|
|
||||||
/* Lists for ready and blocked tasks. --------------------*/
|
/* Lists for ready and blocked tasks. --------------------*/
|
||||||
PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */
|
PRIVILEGED_DATA static List_t pxReadyTasksLists[ configMAX_PRIORITIES ];/*< Prioritised ready tasks. */
|
||||||
PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */
|
|
||||||
PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */
|
|
||||||
PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */
|
PRIVILEGED_DATA static List_t * volatile pxDelayedTaskList; /*< Points to the delayed task list currently being used. */
|
||||||
PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
|
PRIVILEGED_DATA static List_t * volatile pxOverflowDelayedTaskList; /*< Points to the delayed task list currently being used to hold tasks that have overflowed the current tick count. */
|
||||||
PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */
|
PRIVILEGED_DATA static List_t xPendingReadyList; /*< Tasks that have been readied while the scheduler was suspended. They will be moved to the ready list when the scheduler is resumed. */
|
||||||
|
@ -390,13 +387,6 @@ when the scheduler is unsuspended. The pending ready list itself can only be
|
||||||
accessed from a critical section. */
|
accessed from a critical section. */
|
||||||
PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE;
|
PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t ) pdFALSE;
|
||||||
|
|
||||||
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
|
||||||
|
|
||||||
PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */
|
|
||||||
PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*lint -restore */
|
/*lint -restore */
|
||||||
|
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
@ -410,13 +400,13 @@ PRIVILEGED_DATA static volatile UBaseType_t uxSchedulerSuspended = ( UBaseType_t
|
||||||
|
|
||||||
#if( configUSE_TICK_HOOK > 0 )
|
#if( configUSE_TICK_HOOK > 0 )
|
||||||
|
|
||||||
extern void vApplicationTickHook( void );
|
extern void vApplicationTickHook( void ); /*lint !e526 Symbol not defined as it is an application callback. */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
|
|
||||||
extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize );
|
extern void vApplicationGetIdleTaskMemory( StaticTask_t **ppxIdleTaskTCBBuffer, StackType_t **ppxIdleTaskStackBuffer, uint32_t *pulIdleTaskStackSize ); /*lint !e526 Symbol not defined as it is an application callback. */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -599,6 +589,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION;
|
||||||
structure. */
|
structure. */
|
||||||
volatile size_t xSize = sizeof( StaticTask_t );
|
volatile size_t xSize = sizeof( StaticTask_t );
|
||||||
configASSERT( xSize == sizeof( TCB_t ) );
|
configASSERT( xSize == sizeof( TCB_t ) );
|
||||||
|
( void ) xSize; /* Prevent lint warning when configASSERT() is not used. */
|
||||||
}
|
}
|
||||||
#endif /* configASSERT_DEFINED */
|
#endif /* configASSERT_DEFINED */
|
||||||
|
|
||||||
|
@ -607,10 +598,10 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION;
|
||||||
{
|
{
|
||||||
/* The memory used for the task's TCB and stack are passed into this
|
/* The memory used for the task's TCB and stack are passed into this
|
||||||
function - use them. */
|
function - use them. */
|
||||||
pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */
|
pxNewTCB = ( TCB_t * ) pxTaskBuffer; /*lint !e740 !e9087 Unusual cast is ok as the structures are designed to have the same alignment, and the size is checked by an assert. */
|
||||||
pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer;
|
pxNewTCB->pxStack = ( StackType_t * ) puxStackBuffer;
|
||||||
|
|
||||||
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */
|
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
|
||||||
{
|
{
|
||||||
/* Tasks can be created statically or dynamically, so note this
|
/* Tasks can be created statically or dynamically, so note this
|
||||||
task was created statically in case the task is later deleted. */
|
task was created statically in case the task is later deleted. */
|
||||||
|
@ -769,12 +760,12 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION;
|
||||||
StackType_t *pxStack;
|
StackType_t *pxStack;
|
||||||
|
|
||||||
/* Allocate space for the stack used by the task being created. */
|
/* Allocate space for the stack used by the task being created. */
|
||||||
pxStack = ( StackType_t * ) pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e961 MISRA exception as the casts are only redundant for some ports. */
|
pxStack = pvPortMalloc( ( ( ( size_t ) usStackDepth ) * sizeof( StackType_t ) ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation is the stack. */
|
||||||
|
|
||||||
if( pxStack != NULL )
|
if( pxStack != NULL )
|
||||||
{
|
{
|
||||||
/* Allocate space for the TCB. */
|
/* Allocate space for the TCB. */
|
||||||
pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e961 MISRA exception as the casts are only redundant for some paths. */
|
pxNewTCB = ( TCB_t * ) pvPortMalloc( sizeof( TCB_t ) ); /*lint !e9087 !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack, and the first member of TCB_t is always a pointer to the task's stack. */
|
||||||
|
|
||||||
if( pxNewTCB != NULL )
|
if( pxNewTCB != NULL )
|
||||||
{
|
{
|
||||||
|
@ -797,7 +788,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
if( pxNewTCB != NULL )
|
if( pxNewTCB != NULL )
|
||||||
{
|
{
|
||||||
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */
|
#if( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e9029 !e731 Macro has been consolidated for readability reasons. */
|
||||||
{
|
{
|
||||||
/* Tasks can be created statically or dynamically, so note this
|
/* Tasks can be created statically or dynamically, so note this
|
||||||
task was created dynamically in case it is later deleted. */
|
task was created dynamically in case it is later deleted. */
|
||||||
|
@ -862,8 +853,8 @@ UBaseType_t x;
|
||||||
by the port. */
|
by the port. */
|
||||||
#if( portSTACK_GROWTH < 0 )
|
#if( portSTACK_GROWTH < 0 )
|
||||||
{
|
{
|
||||||
pxTopOfStack = pxNewTCB->pxStack + ( ulStackDepth - ( uint32_t ) 1 );
|
pxTopOfStack = &( pxNewTCB->pxStack[ ulStackDepth - ( uint32_t ) 1 ] );
|
||||||
pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. */
|
pxTopOfStack = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); /*lint !e923 !e9033 !e9078 MISRA exception. Avoiding casts between pointers and integers is not practical. Size differences accounted for using portPOINTER_SIZE_TYPE type. Checked by assert(). */
|
||||||
|
|
||||||
/* Check the alignment of the calculated top of stack is correct. */
|
/* Check the alignment of the calculated top of stack is correct. */
|
||||||
configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
|
configASSERT( ( ( ( portPOINTER_SIZE_TYPE ) pxTopOfStack & ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
|
||||||
|
@ -897,7 +888,7 @@ UBaseType_t x;
|
||||||
/* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
|
/* Don't copy all configMAX_TASK_NAME_LEN if the string is shorter than
|
||||||
configMAX_TASK_NAME_LEN characters just in case the memory after the
|
configMAX_TASK_NAME_LEN characters just in case the memory after the
|
||||||
string is not accessible (extremely unlikely). */
|
string is not accessible (extremely unlikely). */
|
||||||
if( pcName[ x ] == 0x00 )
|
if( pcName[ x ] == ( char ) 0x00 )
|
||||||
{
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1013,7 +1004,7 @@ UBaseType_t x;
|
||||||
}
|
}
|
||||||
#endif /* portUSING_MPU_WRAPPERS */
|
#endif /* portUSING_MPU_WRAPPERS */
|
||||||
|
|
||||||
if( ( void * ) pxCreatedTask != NULL )
|
if( pxCreatedTask != NULL )
|
||||||
{
|
{
|
||||||
/* Pass the handle out in an anonymous way. The handle can be used to
|
/* Pass the handle out in an anonymous way. The handle can be used to
|
||||||
change the created task's priority, delete the created task, etc.*/
|
change the created task's priority, delete the created task, etc.*/
|
||||||
|
@ -1335,8 +1326,8 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
eTaskState eTaskGetState( TaskHandle_t xTask )
|
eTaskState eTaskGetState( TaskHandle_t xTask )
|
||||||
{
|
{
|
||||||
eTaskState eReturn;
|
eTaskState eReturn;
|
||||||
List_t *pxStateList;
|
List_t const * pxStateList, *pxDelayedList, *pxOverflowedDelayedList;
|
||||||
const TCB_t * const pxTCB = ( TCB_t * ) xTask;
|
const TCB_t * const pxTCB = xTask;
|
||||||
|
|
||||||
configASSERT( pxTCB );
|
configASSERT( pxTCB );
|
||||||
|
|
||||||
|
@ -1349,11 +1340,13 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
{
|
{
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
{
|
{
|
||||||
pxStateList = ( List_t * ) listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) );
|
pxStateList = listLIST_ITEM_CONTAINER( &( pxTCB->xStateListItem ) );
|
||||||
|
pxDelayedList = pxDelayedTaskList;
|
||||||
|
pxOverflowedDelayedList = pxOverflowDelayedTaskList;
|
||||||
}
|
}
|
||||||
taskEXIT_CRITICAL();
|
taskEXIT_CRITICAL();
|
||||||
|
|
||||||
if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) )
|
if( ( pxStateList == pxDelayedList ) || ( pxStateList == pxOverflowedDelayedList ) )
|
||||||
{
|
{
|
||||||
/* The task being queried is referenced from one of the Blocked
|
/* The task being queried is referenced from one of the Blocked
|
||||||
lists. */
|
lists. */
|
||||||
|
@ -1422,15 +1415,15 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
|
|
||||||
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
||||||
|
|
||||||
UBaseType_t uxTaskPriorityGet( TaskHandle_t xTask )
|
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask )
|
||||||
{
|
{
|
||||||
TCB_t *pxTCB;
|
TCB_t const *pxTCB;
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
|
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
{
|
{
|
||||||
/* If null is passed in here then it is the priority of the that
|
/* If null is passed in here then it is the priority of the task
|
||||||
called uxTaskPriorityGet() that is being queried. */
|
that called uxTaskPriorityGet() that is being queried. */
|
||||||
pxTCB = prvGetTCBFromHandle( xTask );
|
pxTCB = prvGetTCBFromHandle( xTask );
|
||||||
uxReturn = pxTCB->uxPriority;
|
uxReturn = pxTCB->uxPriority;
|
||||||
}
|
}
|
||||||
|
@ -1444,9 +1437,9 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
|
|
||||||
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
#if ( INCLUDE_uxTaskPriorityGet == 1 )
|
||||||
|
|
||||||
UBaseType_t uxTaskPriorityGetFromISR( TaskHandle_t xTask )
|
UBaseType_t uxTaskPriorityGetFromISR( const TaskHandle_t xTask )
|
||||||
{
|
{
|
||||||
TCB_t *pxTCB;
|
TCB_t const *pxTCB;
|
||||||
UBaseType_t uxReturn, uxSavedInterruptState;
|
UBaseType_t uxReturn, uxSavedInterruptState;
|
||||||
|
|
||||||
/* RTOS ports that support interrupt nesting have the concept of a
|
/* RTOS ports that support interrupt nesting have the concept of a
|
||||||
|
@ -1464,7 +1457,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
separate interrupt safe API to ensure interrupt entry is as fast and as
|
separate interrupt safe API to ensure interrupt entry is as fast and as
|
||||||
simple as possible. More information (albeit Cortex-M specific) is
|
simple as possible. More information (albeit Cortex-M specific) is
|
||||||
provided on the following link:
|
provided on the following link:
|
||||||
http://www.freertos.org/RTOS-Cortex-M3-M4.html */
|
https://www.freertos.org/RTOS-Cortex-M3-M4.html */
|
||||||
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
|
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
|
||||||
|
|
||||||
uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR();
|
uxSavedInterruptState = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
|
@ -1724,7 +1717,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
/* The scheduler is not running, but the task that was pointed
|
/* The scheduler is not running, but the task that was pointed
|
||||||
to by pxCurrentTCB has just been suspended and pxCurrentTCB
|
to by pxCurrentTCB has just been suspended and pxCurrentTCB
|
||||||
must be adjusted to point to a different task. */
|
must be adjusted to point to a different task. */
|
||||||
if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks )
|
if( listCURRENT_LIST_LENGTH( &xSuspendedTaskList ) == uxCurrentNumberOfTasks ) /*lint !e931 Right has no side effect, just volatile. */
|
||||||
{
|
{
|
||||||
/* No other tasks are ready, so set pxCurrentTCB back to
|
/* No other tasks are ready, so set pxCurrentTCB back to
|
||||||
NULL so when the next task is created pxCurrentTCB will
|
NULL so when the next task is created pxCurrentTCB will
|
||||||
|
@ -1752,7 +1745,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask )
|
static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask )
|
||||||
{
|
{
|
||||||
BaseType_t xReturn = pdFALSE;
|
BaseType_t xReturn = pdFALSE;
|
||||||
const TCB_t * const pxTCB = ( TCB_t * ) xTask;
|
const TCB_t * const pxTCB = xTask;
|
||||||
|
|
||||||
/* Accesses xPendingReadyList so must be called from a critical
|
/* Accesses xPendingReadyList so must be called from a critical
|
||||||
section. */
|
section. */
|
||||||
|
@ -1797,14 +1790,14 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
|
|
||||||
void vTaskResume( TaskHandle_t xTaskToResume )
|
void vTaskResume( TaskHandle_t xTaskToResume )
|
||||||
{
|
{
|
||||||
TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume;
|
TCB_t * const pxTCB = xTaskToResume;
|
||||||
|
|
||||||
/* It does not make sense to resume the calling task. */
|
/* It does not make sense to resume the calling task. */
|
||||||
configASSERT( xTaskToResume );
|
configASSERT( xTaskToResume );
|
||||||
|
|
||||||
/* The parameter cannot be NULL as it is impossible to resume the
|
/* The parameter cannot be NULL as it is impossible to resume the
|
||||||
currently executing task. */
|
currently executing task. */
|
||||||
if( ( pxTCB != NULL ) && ( pxTCB != pxCurrentTCB ) )
|
if( ( pxTCB != pxCurrentTCB ) && ( pxTCB != NULL ) )
|
||||||
{
|
{
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
{
|
{
|
||||||
|
@ -1852,7 +1845,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
|
BaseType_t xTaskResumeFromISR( TaskHandle_t xTaskToResume )
|
||||||
{
|
{
|
||||||
BaseType_t xYieldRequired = pdFALSE;
|
BaseType_t xYieldRequired = pdFALSE;
|
||||||
TCB_t * const pxTCB = ( TCB_t * ) xTaskToResume;
|
TCB_t * const pxTCB = xTaskToResume;
|
||||||
UBaseType_t uxSavedInterruptStatus;
|
UBaseType_t uxSavedInterruptStatus;
|
||||||
|
|
||||||
configASSERT( xTaskToResume );
|
configASSERT( xTaskToResume );
|
||||||
|
@ -1872,7 +1865,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB )
|
||||||
separate interrupt safe API to ensure interrupt entry is as fast and as
|
separate interrupt safe API to ensure interrupt entry is as fast and as
|
||||||
simple as possible. More information (albeit Cortex-M specific) is
|
simple as possible. More information (albeit Cortex-M specific) is
|
||||||
provided on the following link:
|
provided on the following link:
|
||||||
http://www.freertos.org/RTOS-Cortex-M3-M4.html */
|
https://www.freertos.org/RTOS-Cortex-M3-M4.html */
|
||||||
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
|
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
|
||||||
|
|
||||||
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();
|
||||||
|
@ -1937,7 +1930,7 @@ BaseType_t xReturn;
|
||||||
configIDLE_TASK_NAME,
|
configIDLE_TASK_NAME,
|
||||||
ulIdleTaskStackSize,
|
ulIdleTaskStackSize,
|
||||||
( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */
|
( void * ) NULL, /*lint !e961. The cast is not redundant for all compilers. */
|
||||||
( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),
|
portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */
|
||||||
pxIdleTaskStackBuffer,
|
pxIdleTaskStackBuffer,
|
||||||
pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
|
pxIdleTaskTCBBuffer ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
|
||||||
|
|
||||||
|
@ -1957,7 +1950,7 @@ BaseType_t xReturn;
|
||||||
configIDLE_TASK_NAME,
|
configIDLE_TASK_NAME,
|
||||||
configMINIMAL_STACK_SIZE,
|
configMINIMAL_STACK_SIZE,
|
||||||
( void * ) NULL,
|
( void * ) NULL,
|
||||||
( tskIDLE_PRIORITY | portPRIVILEGE_BIT ),
|
portPRIVILEGE_BIT, /* In effect ( tskIDLE_PRIORITY | portPRIVILEGE_BIT ), but tskIDLE_PRIORITY is zero. */
|
||||||
&xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
|
&xIdleTaskHandle ); /*lint !e961 MISRA exception, justified as it is not a redundant explicit cast to all supported compilers. */
|
||||||
}
|
}
|
||||||
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
#endif /* configSUPPORT_STATIC_ALLOCATION */
|
||||||
|
@ -2151,7 +2144,7 @@ BaseType_t xAlreadyYielded = pdFALSE;
|
||||||
appropriate ready list. */
|
appropriate ready list. */
|
||||||
while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
|
while( listLIST_IS_EMPTY( &xPendingReadyList ) == pdFALSE )
|
||||||
{
|
{
|
||||||
pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) );
|
pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xPendingReadyList ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
|
( void ) uxListRemove( &( pxTCB->xEventListItem ) );
|
||||||
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
|
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
|
||||||
prvAddTaskToReadyList( pxTCB );
|
prvAddTaskToReadyList( pxTCB );
|
||||||
|
@ -2268,7 +2261,7 @@ UBaseType_t uxSavedInterruptStatus;
|
||||||
system call interrupt priority. FreeRTOS maintains a separate interrupt
|
system call interrupt priority. FreeRTOS maintains a separate interrupt
|
||||||
safe API to ensure interrupt entry is as fast and as simple as possible.
|
safe API to ensure interrupt entry is as fast and as simple as possible.
|
||||||
More information (albeit Cortex-M specific) is provided on the following
|
More information (albeit Cortex-M specific) is provided on the following
|
||||||
link: http://www.freertos.org/RTOS-Cortex-M3-M4.html */
|
link: https://www.freertos.org/RTOS-Cortex-M3-M4.html */
|
||||||
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
|
portASSERT_IF_INTERRUPT_PRIORITY_INVALID();
|
||||||
|
|
||||||
uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR();
|
uxSavedInterruptStatus = portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR();
|
||||||
|
@ -2308,19 +2301,21 @@ TCB_t *pxTCB;
|
||||||
TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL;
|
TCB_t *pxNextTCB, *pxFirstTCB, *pxReturn = NULL;
|
||||||
UBaseType_t x;
|
UBaseType_t x;
|
||||||
char cNextChar;
|
char cNextChar;
|
||||||
|
BaseType_t xBreakLoop;
|
||||||
|
|
||||||
/* This function is called with the scheduler suspended. */
|
/* This function is called with the scheduler suspended. */
|
||||||
|
|
||||||
if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )
|
if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );
|
listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );
|
listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
|
|
||||||
/* Check each character in the name looking for a match or
|
/* Check each character in the name looking for a match or
|
||||||
mismatch. */
|
mismatch. */
|
||||||
|
xBreakLoop = pdFALSE;
|
||||||
for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
|
for( x = ( UBaseType_t ) 0; x < ( UBaseType_t ) configMAX_TASK_NAME_LEN; x++ )
|
||||||
{
|
{
|
||||||
cNextChar = pxNextTCB->pcTaskName[ x ];
|
cNextChar = pxNextTCB->pcTaskName[ x ];
|
||||||
|
@ -2328,19 +2323,24 @@ TCB_t *pxTCB;
|
||||||
if( cNextChar != pcNameToQuery[ x ] )
|
if( cNextChar != pcNameToQuery[ x ] )
|
||||||
{
|
{
|
||||||
/* Characters didn't match. */
|
/* Characters didn't match. */
|
||||||
break;
|
xBreakLoop = pdTRUE;
|
||||||
}
|
}
|
||||||
else if( cNextChar == 0x00 )
|
else if( cNextChar == ( char ) 0x00 )
|
||||||
{
|
{
|
||||||
/* Both strings terminated, a match must have been
|
/* Both strings terminated, a match must have been
|
||||||
found. */
|
found. */
|
||||||
pxReturn = pxNextTCB;
|
pxReturn = pxNextTCB;
|
||||||
break;
|
xBreakLoop = pdTRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if( xBreakLoop != pdFALSE )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( pxReturn != NULL )
|
if( pxReturn != NULL )
|
||||||
|
@ -2421,7 +2421,7 @@ TCB_t *pxTCB;
|
||||||
}
|
}
|
||||||
( void ) xTaskResumeAll();
|
( void ) xTaskResumeAll();
|
||||||
|
|
||||||
return ( TaskHandle_t ) pxTCB;
|
return pxTCB;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* INCLUDE_xTaskGetHandle */
|
#endif /* INCLUDE_xTaskGetHandle */
|
||||||
|
@ -2537,7 +2537,7 @@ implementations require configUSE_TICKLESS_IDLE to be set to a value other than
|
||||||
|
|
||||||
BaseType_t xTaskAbortDelay( TaskHandle_t xTask )
|
BaseType_t xTaskAbortDelay( TaskHandle_t xTask )
|
||||||
{
|
{
|
||||||
TCB_t *pxTCB = ( TCB_t * ) xTask;
|
TCB_t *pxTCB = xTask;
|
||||||
BaseType_t xReturn;
|
BaseType_t xReturn;
|
||||||
|
|
||||||
configASSERT( pxTCB );
|
configASSERT( pxTCB );
|
||||||
|
@ -2662,7 +2662,7 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
item at the head of the delayed list. This is the time
|
item at the head of the delayed list. This is the time
|
||||||
at which the task at the head of the delayed list must
|
at which the task at the head of the delayed list must
|
||||||
be removed from the Blocked state. */
|
be removed from the Blocked state. */
|
||||||
pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
|
pxTCB = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );
|
xItemValue = listGET_LIST_ITEM_VALUE( &( pxTCB->xStateListItem ) );
|
||||||
|
|
||||||
if( xConstTickCount < xItemValue )
|
if( xConstTickCount < xItemValue )
|
||||||
|
@ -2673,7 +2673,7 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
state - so record the item value in
|
state - so record the item value in
|
||||||
xNextTaskUnblockTime. */
|
xNextTaskUnblockTime. */
|
||||||
xNextTaskUnblockTime = xItemValue;
|
xNextTaskUnblockTime = xItemValue;
|
||||||
break;
|
break; /*lint !e9011 Code structure here is deedmed easier to understand with multiple breaks. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -2795,7 +2795,7 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
xTCB = ( TCB_t * ) xTask;
|
xTCB = xTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Save the hook function in the TCB. A critical section is required as
|
/* Save the hook function in the TCB. A critical section is required as
|
||||||
|
@ -2855,7 +2855,7 @@ BaseType_t xSwitchRequired = pdFALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
xTCB = ( TCB_t * ) xTask;
|
xTCB = xTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( xTCB->pxTaskTag != NULL )
|
if( xTCB->pxTaskTag != NULL )
|
||||||
|
@ -2888,6 +2888,9 @@ void vTaskSwitchContext( void )
|
||||||
|
|
||||||
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
#if ( configGENERATE_RUN_TIME_STATS == 1 )
|
||||||
{
|
{
|
||||||
|
PRIVILEGED_DATA static uint32_t ulTaskSwitchedInTime = 0UL; /*< Holds the value of a timer/counter the last time a task was switched in. */
|
||||||
|
PRIVILEGED_DATA static uint32_t ulTotalRunTime = 0UL; /*< Holds the total amount of execution time as defined by the run time counter clock. */
|
||||||
|
|
||||||
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
|
#ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
|
||||||
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );
|
portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );
|
||||||
#else
|
#else
|
||||||
|
@ -2918,7 +2921,7 @@ void vTaskSwitchContext( void )
|
||||||
|
|
||||||
/* Select a new task to run using either the generic C or port
|
/* Select a new task to run using either the generic C or port
|
||||||
optimised asm code. */
|
optimised asm code. */
|
||||||
taskSELECT_HIGHEST_PRIORITY_TASK();
|
taskSELECT_HIGHEST_PRIORITY_TASK(); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
traceTASK_SWITCHED_IN();
|
traceTASK_SWITCHED_IN();
|
||||||
|
|
||||||
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
#if ( configUSE_NEWLIB_REENTRANT == 1 )
|
||||||
|
@ -3024,7 +3027,7 @@ BaseType_t xReturn;
|
||||||
|
|
||||||
This function assumes that a check has already been made to ensure that
|
This function assumes that a check has already been made to ensure that
|
||||||
pxEventList is not empty. */
|
pxEventList is not empty. */
|
||||||
pxUnblockedTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
|
pxUnblockedTCB = listGET_OWNER_OF_HEAD_ENTRY( pxEventList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
configASSERT( pxUnblockedTCB );
|
configASSERT( pxUnblockedTCB );
|
||||||
( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );
|
( void ) uxListRemove( &( pxUnblockedTCB->xEventListItem ) );
|
||||||
|
|
||||||
|
@ -3087,7 +3090,7 @@ TCB_t *pxUnblockedTCB;
|
||||||
|
|
||||||
/* Remove the event list form the event flag. Interrupts do not access
|
/* Remove the event list form the event flag. Interrupts do not access
|
||||||
event flags. */
|
event flags. */
|
||||||
pxUnblockedTCB = ( TCB_t * ) listGET_LIST_ITEM_OWNER( pxEventListItem );
|
pxUnblockedTCB = listGET_LIST_ITEM_OWNER( pxEventListItem ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
configASSERT( pxUnblockedTCB );
|
configASSERT( pxUnblockedTCB );
|
||||||
( void ) uxListRemove( pxEventListItem );
|
( void ) uxListRemove( pxEventListItem );
|
||||||
|
|
||||||
|
@ -3142,7 +3145,7 @@ BaseType_t xReturn;
|
||||||
const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering;
|
const TickType_t xElapsedTime = xConstTickCount - pxTimeOut->xTimeOnEntering;
|
||||||
|
|
||||||
#if( INCLUDE_xTaskAbortDelay == 1 )
|
#if( INCLUDE_xTaskAbortDelay == 1 )
|
||||||
if( pxCurrentTCB->ucDelayAborted != pdFALSE )
|
if( pxCurrentTCB->ucDelayAborted != ( uint8_t ) pdFALSE )
|
||||||
{
|
{
|
||||||
/* The delay was aborted, which is not the same as a time out,
|
/* The delay was aborted, which is not the same as a time out,
|
||||||
but has the same result. */
|
but has the same result. */
|
||||||
|
@ -3202,7 +3205,7 @@ void vTaskMissedYield( void )
|
||||||
UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask )
|
UBaseType_t uxTaskGetTaskNumber( TaskHandle_t xTask )
|
||||||
{
|
{
|
||||||
UBaseType_t uxReturn;
|
UBaseType_t uxReturn;
|
||||||
TCB_t *pxTCB;
|
TCB_t const *pxTCB;
|
||||||
|
|
||||||
if( xTask != NULL )
|
if( xTask != NULL )
|
||||||
{
|
{
|
||||||
|
@ -3224,7 +3227,7 @@ void vTaskMissedYield( void )
|
||||||
|
|
||||||
void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle )
|
void vTaskSetTaskNumber( TaskHandle_t xTask, const UBaseType_t uxHandle )
|
||||||
{
|
{
|
||||||
TCB_t *pxTCB;
|
TCB_t * pxTCB;
|
||||||
|
|
||||||
if( xTask != NULL )
|
if( xTask != NULL )
|
||||||
{
|
{
|
||||||
|
@ -3461,6 +3464,8 @@ static portTASK_FUNCTION( prvIdleTask, pvParameters )
|
||||||
static void prvInitialiseTaskLists( void )
|
static void prvInitialiseTaskLists( void )
|
||||||
{
|
{
|
||||||
UBaseType_t uxPriority;
|
UBaseType_t uxPriority;
|
||||||
|
PRIVILEGED_DATA static List_t xDelayedTaskList1; /*< Delayed tasks. */
|
||||||
|
PRIVILEGED_DATA static List_t xDelayedTaskList2; /*< Delayed tasks (two lists are used - one for delays that have overflowed the current tick count. */
|
||||||
|
|
||||||
for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
|
for( uxPriority = ( UBaseType_t ) 0U; uxPriority < ( UBaseType_t ) configMAX_PRIORITIES; uxPriority++ )
|
||||||
{
|
{
|
||||||
|
@ -3505,7 +3510,7 @@ static void prvCheckTasksWaitingTermination( void )
|
||||||
{
|
{
|
||||||
taskENTER_CRITICAL();
|
taskENTER_CRITICAL();
|
||||||
{
|
{
|
||||||
pxTCB = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
|
pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
|
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
|
||||||
--uxCurrentNumberOfTasks;
|
--uxCurrentNumberOfTasks;
|
||||||
--uxDeletedTasksWaitingCleanUp;
|
--uxDeletedTasksWaitingCleanUp;
|
||||||
|
@ -3624,7 +3629,7 @@ static void prvCheckTasksWaitingTermination( void )
|
||||||
|
|
||||||
if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )
|
if( listCURRENT_LIST_LENGTH( pxList ) > ( UBaseType_t ) 0 )
|
||||||
{
|
{
|
||||||
listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList );
|
listGET_OWNER_OF_NEXT_ENTRY( pxFirstTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
|
|
||||||
/* Populate an TaskStatus_t structure within the
|
/* Populate an TaskStatus_t structure within the
|
||||||
pxTaskStatusArray array for each task that is referenced from
|
pxTaskStatusArray array for each task that is referenced from
|
||||||
|
@ -3632,7 +3637,7 @@ static void prvCheckTasksWaitingTermination( void )
|
||||||
meaning of each TaskStatus_t structure member. */
|
meaning of each TaskStatus_t structure member. */
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList );
|
listGET_OWNER_OF_NEXT_ENTRY( pxNextTCB, pxList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState );
|
vTaskGetInfo( ( TaskHandle_t ) pxNextTCB, &( pxTaskStatusArray[ uxTask ] ), pdTRUE, eState );
|
||||||
uxTask++;
|
uxTask++;
|
||||||
} while( pxNextTCB != pxFirstTCB );
|
} while( pxNextTCB != pxFirstTCB );
|
||||||
|
@ -3720,7 +3725,7 @@ static void prvCheckTasksWaitingTermination( void )
|
||||||
vPortFree( pxTCB->pxStack );
|
vPortFree( pxTCB->pxStack );
|
||||||
vPortFree( pxTCB );
|
vPortFree( pxTCB );
|
||||||
}
|
}
|
||||||
#elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 Macro has been consolidated for readability reasons. */
|
#elif( tskSTATIC_AND_DYNAMIC_ALLOCATION_POSSIBLE != 0 ) /*lint !e731 !e9029 Macro has been consolidated for readability reasons. */
|
||||||
{
|
{
|
||||||
/* The task could have been allocated statically or dynamically, so
|
/* The task could have been allocated statically or dynamically, so
|
||||||
check what was statically allocated before trying to free the
|
check what was statically allocated before trying to free the
|
||||||
|
@ -3770,7 +3775,7 @@ TCB_t *pxTCB;
|
||||||
the item at the head of the delayed list. This is the time at
|
the item at the head of the delayed list. This is the time at
|
||||||
which the task at the head of the delayed list should be removed
|
which the task at the head of the delayed list should be removed
|
||||||
from the Blocked state. */
|
from the Blocked state. */
|
||||||
( pxTCB ) = ( TCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList );
|
( pxTCB ) = listGET_OWNER_OF_HEAD_ENTRY( pxDelayedTaskList ); /*lint !e9079 void * is used as this macro is used with timers and co-routines too. Alignment is known to be fine as the type of the pointer stored and retrieved is the same. */
|
||||||
xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) );
|
xNextTaskUnblockTime = listGET_LIST_ITEM_VALUE( &( ( pxTCB )->xStateListItem ) );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3825,7 +3830,7 @@ TCB_t *pxTCB;
|
||||||
|
|
||||||
BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder )
|
BaseType_t xTaskPriorityInherit( TaskHandle_t const pxMutexHolder )
|
||||||
{
|
{
|
||||||
TCB_t * const pxMutexHolderTCB = ( TCB_t * ) pxMutexHolder;
|
TCB_t * const pxMutexHolderTCB = pxMutexHolder;
|
||||||
BaseType_t xReturn = pdFALSE;
|
BaseType_t xReturn = pdFALSE;
|
||||||
|
|
||||||
/* If the mutex was given back by an interrupt while the queue was
|
/* If the mutex was given back by an interrupt while the queue was
|
||||||
|
@ -3912,7 +3917,7 @@ TCB_t *pxTCB;
|
||||||
|
|
||||||
BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
|
BaseType_t xTaskPriorityDisinherit( TaskHandle_t const pxMutexHolder )
|
||||||
{
|
{
|
||||||
TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
|
TCB_t * const pxTCB = pxMutexHolder;
|
||||||
BaseType_t xReturn = pdFALSE;
|
BaseType_t xReturn = pdFALSE;
|
||||||
|
|
||||||
if( pxMutexHolder != NULL )
|
if( pxMutexHolder != NULL )
|
||||||
|
@ -3992,7 +3997,7 @@ TCB_t *pxTCB;
|
||||||
|
|
||||||
void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask )
|
void vTaskPriorityDisinheritAfterTimeout( TaskHandle_t const pxMutexHolder, UBaseType_t uxHighestPriorityWaitingTask )
|
||||||
{
|
{
|
||||||
TCB_t * const pxTCB = ( TCB_t * ) pxMutexHolder;
|
TCB_t * const pxTCB = pxMutexHolder;
|
||||||
UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse;
|
UBaseType_t uxPriorityUsedOnEntry, uxPriorityToUse;
|
||||||
const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1;
|
const UBaseType_t uxOnlyOneMutexHeld = ( UBaseType_t ) 1;
|
||||||
|
|
||||||
|
@ -4170,7 +4175,7 @@ TCB_t *pxTCB;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Terminate. */
|
/* Terminate. */
|
||||||
pcBuffer[ x ] = 0x00;
|
pcBuffer[ x ] = ( char ) 0x00;
|
||||||
|
|
||||||
/* Return the new end of string. */
|
/* Return the new end of string. */
|
||||||
return &( pcBuffer[ x ] );
|
return &( pcBuffer[ x ] );
|
||||||
|
@ -4184,7 +4189,7 @@ TCB_t *pxTCB;
|
||||||
void vTaskList( char * pcWriteBuffer )
|
void vTaskList( char * pcWriteBuffer )
|
||||||
{
|
{
|
||||||
TaskStatus_t *pxTaskStatusArray;
|
TaskStatus_t *pxTaskStatusArray;
|
||||||
volatile UBaseType_t uxArraySize, x;
|
UBaseType_t uxArraySize, x;
|
||||||
char cStatus;
|
char cStatus;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -4213,7 +4218,7 @@ TCB_t *pxTCB;
|
||||||
|
|
||||||
|
|
||||||
/* Make sure the write buffer does not contain a string. */
|
/* Make sure the write buffer does not contain a string. */
|
||||||
*pcWriteBuffer = 0x00;
|
*pcWriteBuffer = ( char ) 0x00;
|
||||||
|
|
||||||
/* Take a snapshot of the number of tasks in case it changes while this
|
/* Take a snapshot of the number of tasks in case it changes while this
|
||||||
function is executing. */
|
function is executing. */
|
||||||
|
@ -4222,7 +4227,7 @@ TCB_t *pxTCB;
|
||||||
/* Allocate an array index for each task. NOTE! if
|
/* Allocate an array index for each task. NOTE! if
|
||||||
configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will
|
configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will
|
||||||
equate to NULL. */
|
equate to NULL. */
|
||||||
pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) );
|
pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */
|
||||||
|
|
||||||
if( pxTaskStatusArray != NULL )
|
if( pxTaskStatusArray != NULL )
|
||||||
{
|
{
|
||||||
|
@ -4249,9 +4254,10 @@ TCB_t *pxTCB;
|
||||||
case eDeleted: cStatus = tskDELETED_CHAR;
|
case eDeleted: cStatus = tskDELETED_CHAR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case eInvalid: /* Fall through. */
|
||||||
default: /* Should not get here, but it is included
|
default: /* Should not get here, but it is included
|
||||||
to prevent static checking errors. */
|
to prevent static checking errors. */
|
||||||
cStatus = 0x00;
|
cStatus = ( char ) 0x00;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4260,8 +4266,8 @@ TCB_t *pxTCB;
|
||||||
pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );
|
pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );
|
||||||
|
|
||||||
/* Write the rest of the string. */
|
/* Write the rest of the string. */
|
||||||
sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );
|
sprintf( pcWriteBuffer, "\t%c\t%u\t%u\t%u\r\n", cStatus, ( unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, ( unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, ( unsigned int ) pxTaskStatusArray[ x ].xTaskNumber ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */
|
||||||
pcWriteBuffer += strlen( pcWriteBuffer );
|
pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers. */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION
|
/* Free the array again. NOTE! If configSUPPORT_DYNAMIC_ALLOCATION
|
||||||
|
@ -4282,7 +4288,7 @@ TCB_t *pxTCB;
|
||||||
void vTaskGetRunTimeStats( char *pcWriteBuffer )
|
void vTaskGetRunTimeStats( char *pcWriteBuffer )
|
||||||
{
|
{
|
||||||
TaskStatus_t *pxTaskStatusArray;
|
TaskStatus_t *pxTaskStatusArray;
|
||||||
volatile UBaseType_t uxArraySize, x;
|
UBaseType_t uxArraySize, x;
|
||||||
uint32_t ulTotalTime, ulStatsAsPercentage;
|
uint32_t ulTotalTime, ulStatsAsPercentage;
|
||||||
|
|
||||||
#if( configUSE_TRACE_FACILITY != 1 )
|
#if( configUSE_TRACE_FACILITY != 1 )
|
||||||
|
@ -4317,7 +4323,7 @@ TCB_t *pxTCB;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Make sure the write buffer does not contain a string. */
|
/* Make sure the write buffer does not contain a string. */
|
||||||
*pcWriteBuffer = 0x00;
|
*pcWriteBuffer = ( char ) 0x00;
|
||||||
|
|
||||||
/* Take a snapshot of the number of tasks in case it changes while this
|
/* Take a snapshot of the number of tasks in case it changes while this
|
||||||
function is executing. */
|
function is executing. */
|
||||||
|
@ -4326,7 +4332,7 @@ TCB_t *pxTCB;
|
||||||
/* Allocate an array index for each task. NOTE! If
|
/* Allocate an array index for each task. NOTE! If
|
||||||
configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will
|
configSUPPORT_DYNAMIC_ALLOCATION is set to 0 then pvPortMalloc() will
|
||||||
equate to NULL. */
|
equate to NULL. */
|
||||||
pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) );
|
pxTaskStatusArray = pvPortMalloc( uxCurrentNumberOfTasks * sizeof( TaskStatus_t ) ); /*lint !e9079 All values returned by pvPortMalloc() have at least the alignment required by the MCU's stack and this allocation allocates a struct that has the alignment requirements of a pointer. */
|
||||||
|
|
||||||
if( pxTaskStatusArray != NULL )
|
if( pxTaskStatusArray != NULL )
|
||||||
{
|
{
|
||||||
|
@ -4337,7 +4343,7 @@ TCB_t *pxTCB;
|
||||||
ulTotalTime /= 100UL;
|
ulTotalTime /= 100UL;
|
||||||
|
|
||||||
/* Avoid divide by zero errors. */
|
/* Avoid divide by zero errors. */
|
||||||
if( ulTotalTime > 0 )
|
if( ulTotalTime > 0UL )
|
||||||
{
|
{
|
||||||
/* Create a human readable table from the binary data. */
|
/* Create a human readable table from the binary data. */
|
||||||
for( x = 0; x < uxArraySize; x++ )
|
for( x = 0; x < uxArraySize; x++ )
|
||||||
|
@ -4362,7 +4368,7 @@ TCB_t *pxTCB;
|
||||||
{
|
{
|
||||||
/* sizeof( int ) == sizeof( long ) so a smaller
|
/* sizeof( int ) == sizeof( long ) so a smaller
|
||||||
printf() library can be used. */
|
printf() library can be used. */
|
||||||
sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage );
|
sprintf( pcWriteBuffer, "\t%u\t\t%u%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, ( unsigned int ) ulStatsAsPercentage ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -4378,12 +4384,12 @@ TCB_t *pxTCB;
|
||||||
{
|
{
|
||||||
/* sizeof( int ) == sizeof( long ) so a smaller
|
/* sizeof( int ) == sizeof( long ) so a smaller
|
||||||
printf() library can be used. */
|
printf() library can be used. */
|
||||||
sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter );
|
sprintf( pcWriteBuffer, "\t%u\t\t<1%%\r\n", ( unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter ); /*lint !e586 sprintf() allowed as this is compiled with many compilers and this is a utility function only - not part of the core kernel implementation. */
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
pcWriteBuffer += strlen( pcWriteBuffer );
|
pcWriteBuffer += strlen( pcWriteBuffer ); /*lint !e9016 Pointer arithmetic ok on char pointers. */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -4635,6 +4641,13 @@ TickType_t uxReturn;
|
||||||
/* The task is being notified without its notify value being
|
/* The task is being notified without its notify value being
|
||||||
updated. */
|
updated. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Should not get here if all enums are handled.
|
||||||
|
Artificially force an assert. */
|
||||||
|
configASSERT( ( volatile uint32_t ) 0 );
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
traceTASK_NOTIFY();
|
traceTASK_NOTIFY();
|
||||||
|
@ -4760,6 +4773,12 @@ TickType_t uxReturn;
|
||||||
/* The task is being notified without its notify value being
|
/* The task is being notified without its notify value being
|
||||||
updated. */
|
updated. */
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
/* Should not get here if all enums are handled.
|
||||||
|
Artificially force an assert. */
|
||||||
|
configASSERT( ( volatile uint32_t ) 0 );
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
traceTASK_NOTIFY_FROM_ISR();
|
traceTASK_NOTIFY_FROM_ISR();
|
||||||
|
@ -4950,7 +4969,7 @@ const TickType_t xConstTickCount = xTickCount;
|
||||||
{
|
{
|
||||||
/* The current task must be in a ready list, so there is no need to
|
/* The current task must be in a ready list, so there is no need to
|
||||||
check, and the port reset macro can be called directly. */
|
check, and the port reset macro can be called directly. */
|
||||||
portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority );
|
portRESET_READY_PRIORITY( pxCurrentTCB->uxPriority, uxTopReadyPriority ); /*lint !e931 pxCurrentTCB cannot change as it is the calling task. pxCurrentTCB->uxPriority and uxTopReadyPriority cannot change as called with scheduler suspended or in a critical section. */
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue