35#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
42#if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 )
43 #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available.
50#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
57#if ( configUSE_TIMERS == 1 )
60 #define tmrNO_DELAY ( ( TickType_t ) 0U )
61 #define tmrMAX_TIME_BEFORE_OVERFLOW ( ( TickType_t ) -1 )
65 #ifndef configTIMER_SERVICE_TASK_NAME
66 #define configTIMER_SERVICE_TASK_NAME "Tmr Svc"
70 #define tmrSTATUS_IS_ACTIVE ( ( uint8_t ) 0x01 )
71 #define tmrSTATUS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 0x02 )
72 #define tmrSTATUS_IS_AUTORELOAD ( ( uint8_t ) 0x04 )
75 typedef struct tmrTimerControl
77 const char * pcTimerName;
82 #if ( configUSE_TRACE_FACILITY == 1 )
90 typedef xTIMER Timer_t;
97 typedef struct tmrTimerParameters
104 typedef struct tmrCallbackParameters
108 uint32_t ulParameter2;
109 } CallbackParameters_t;
113 typedef struct tmrTimerQueueMessage
118 TimerParameter_t xTimerParameters;
122 #if ( INCLUDE_xTimerPendFunctionCall == 1 )
123 CallbackParameters_t xCallbackParameters;
126 } DaemonTaskMessage_t;
173 static BaseType_t prvInsertTimerInActiveList( Timer_t *
const pxTimer,
183 static void prvReloadTimer( Timer_t *
const pxTimer,
191 static void prvProcessExpiredTimer(
const TickType_t xNextExpireTime,
218 static void prvProcessTimerOrBlockTask(
const TickType_t xNextExpireTime,
225 static void prvInitialiseNewTimer(
const char *
const pcTimerName,
228 void *
const pvTimerID,
241 prvCheckForValidListAndQueue();
243 if( xTimerQueue !=
NULL )
245 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
249 uint32_t ulTimerTaskStackSize;
251 vApplicationGetTimerTaskMemory( &pxTimerTaskTCBBuffer, &pxTimerTaskStackBuffer, &ulTimerTaskStackSize );
252 xTimerTaskHandle = xTaskCreateStatic( prvTimerTask,
253 configTIMER_SERVICE_TASK_NAME,
254 ulTimerTaskStackSize,
257 pxTimerTaskStackBuffer,
258 pxTimerTaskTCBBuffer );
260 if( xTimerTaskHandle !=
NULL )
267 xReturn = xTaskCreate( prvTimerTask,
268 configTIMER_SERVICE_TASK_NAME,
286 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
291 void *
const pvTimerID,
294 Timer_t * pxNewTimer;
296 pxNewTimer = ( Timer_t * )
pvPortMalloc(
sizeof( Timer_t ) );
298 if( pxNewTimer !=
NULL )
303 pxNewTimer->ucStatus = 0x00;
304 prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
313 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
315 TimerHandle_t xTimerCreateStatic(
const char *
const pcTimerName,
318 void *
const pvTimerID,
322 Timer_t * pxNewTimer;
324 #if ( configASSERT_DEFINED == 1 )
337 pxNewTimer = ( Timer_t * ) pxTimerBuffer;
339 if( pxNewTimer !=
NULL )
344 pxNewTimer->ucStatus = tmrSTATUS_IS_STATICALLY_ALLOCATED;
346 prvInitialiseNewTimer( pcTimerName, xTimerPeriodInTicks, xAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer );
355 static void prvInitialiseNewTimer(
const char *
const pcTimerName,
358 void *
const pvTimerID,
360 Timer_t * pxNewTimer )
367 prvCheckForValidListAndQueue();
371 pxNewTimer->pcTimerName = pcTimerName;
372 pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
373 pxNewTimer->pvTimerID = pvTimerID;
374 pxNewTimer->pxCallbackFunction = pxCallbackFunction;
379 pxNewTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD;
393 DaemonTaskMessage_t xMessage;
399 if( xTimerQueue !=
NULL )
402 xMessage.xMessageID = xCommandID;
403 xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
404 xMessage.u.xTimerParameters.pxTimer = xTimer;
438 return xTimerTaskHandle;
444 Timer_t * pxTimer = xTimer;
447 return pxTimer->xTimerPeriodInTicks;
454 Timer_t * pxTimer = xTimer;
461 pxTimer->ucStatus |= tmrSTATUS_IS_AUTORELOAD;
465 pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_AUTORELOAD );
474 Timer_t * pxTimer = xTimer;
480 if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) == 0 )
504 Timer_t * pxTimer = xTimer;
513 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
518 Timer_t * pxTimer = xTimer;
522 if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) != 0 )
539 Timer_t * pxTimer = xTimer;
542 return pxTimer->pcTimerName;
546 static void prvReloadTimer( Timer_t *
const pxTimer,
553 while( prvInsertTimerInActiveList( pxTimer, ( xExpiredTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xExpiredTime ) !=
pdFALSE )
556 xExpiredTime += pxTimer->xTimerPeriodInTicks;
565 static void prvProcessExpiredTimer(
const TickType_t xNextExpireTime,
577 if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
579 prvReloadTimer( pxTimer, xNextExpireTime, xTimeNow );
583 pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );
598 ( void ) pvParameters;
600 #if ( configUSE_DAEMON_TASK_STARTUP_HOOK == 1 )
614 xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );
618 prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty );
621 prvProcessReceivedCommands();
626 static void prvProcessTimerOrBlockTask(
const TickType_t xNextExpireTime,
639 xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
641 if( xTimerListsWereSwitched ==
pdFALSE )
644 if( ( xListWasEmpty ==
pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )
647 prvProcessExpiredTimer( xNextExpireTime, xTimeNow );
701 if( *pxListWasEmpty ==
pdFALSE )
711 return xNextExpireTime;
722 if( xTimeNow < xLastTime )
724 prvSwitchTimerLists();
725 *pxTimerListsWereSwitched =
pdTRUE;
729 *pxTimerListsWereSwitched =
pdFALSE;
732 xLastTime = xTimeNow;
738 static BaseType_t prvInsertTimerInActiveList( Timer_t *
const pxTimer,
748 if( xNextExpiryTime <= xTimeNow )
752 if( ( (
TickType_t ) ( xTimeNow - xCommandTime ) ) >= pxTimer->xTimerPeriodInTicks )
756 xProcessTimerNow =
pdTRUE;
760 vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );
765 if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )
770 xProcessTimerNow =
pdTRUE;
774 vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
778 return xProcessTimerNow;
782 static void prvProcessReceivedCommands(
void )
784 DaemonTaskMessage_t xMessage;
791 #if ( INCLUDE_xTimerPendFunctionCall == 1 )
797 const CallbackParameters_t *
const pxCallback = &( xMessage.u.xCallbackParameters );
804 pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 );
819 pxTimer = xMessage.u.xTimerParameters.pxTimer;
839 xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
841 switch( xMessage.xMessageID )
848 pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE;
850 if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) !=
pdFALSE )
854 if( ( pxTimer->ucStatus & tmrSTATUS_IS_AUTORELOAD ) != 0 )
856 prvReloadTimer( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow );
860 pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );
877 pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );
882 pxTimer->ucStatus |= tmrSTATUS_IS_ACTIVE;
883 pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;
892 ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );
896 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
901 if( ( pxTimer->ucStatus & tmrSTATUS_IS_STATICALLY_ALLOCATED ) == ( uint8_t ) 0 )
907 pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );
916 pxTimer->ucStatus &= ( ( uint8_t ) ~tmrSTATUS_IS_ACTIVE );
930 static void prvSwitchTimerLists(
void )
946 prvProcessExpiredTimer( xNextExpireTime, tmrMAX_TIME_BEFORE_OVERFLOW );
949 pxTemp = pxCurrentTimerList;
950 pxCurrentTimerList = pxOverflowTimerList;
951 pxOverflowTimerList = pxTemp;
955 static void prvCheckForValidListAndQueue(
void )
962 if( xTimerQueue ==
NULL )
966 pxCurrentTimerList = &xActiveTimerList1;
967 pxOverflowTimerList = &xActiveTimerList2;
969 #if ( configSUPPORT_STATIC_ALLOCATION == 1 )
984 #if ( configQUEUE_REGISTRY_SIZE > 0 )
986 if( xTimerQueue !=
NULL )
1009 Timer_t * pxTimer = xTimer;
1016 if( ( pxTimer->ucStatus & tmrSTATUS_IS_ACTIVE ) == 0 )
1033 Timer_t *
const pxTimer = xTimer;
1040 pvReturn = pxTimer->pvTimerID;
1051 Timer_t *
const pxTimer = xTimer;
1057 pxTimer->pvTimerID = pvNewID;
1063 #if ( INCLUDE_xTimerPendFunctionCall == 1 )
1066 void * pvParameter1,
1067 uint32_t ulParameter2,
1070 DaemonTaskMessage_t xMessage;
1076 xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;
1077 xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;
1078 xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;
1080 xReturn =
xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );
1090 #if ( INCLUDE_xTimerPendFunctionCall == 1 )
1093 void * pvParameter1,
1094 uint32_t ulParameter2,
1097 DaemonTaskMessage_t xMessage;
1108 xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;
1109 xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;
1110 xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;
1122 #if ( configUSE_TRACE_FACILITY == 1 )
1126 return ( ( Timer_t * ) xTimer )->uxTimerNumber;
1132 #if ( configUSE_TRACE_FACILITY == 1 )
1137 ( ( Timer_t * ) xTimer )->uxTimerNumber = uxTimerNumber;
#define configTIMER_TASK_PRIORITY
#define configTIMER_QUEUE_LENGTH
#define configTIMER_TASK_STACK_DEPTH
#define traceTIMER_CREATE(pxNewTimer)
struct xSTATIC_QUEUE StaticQueue_t
#define portPRIVILEGE_BIT
#define vQueueAddToRegistry(xQueue, pcName)
#define traceTIMER_COMMAND_RECEIVED(pxTimer, xMessageID, xMessageValue)
#define traceTIMER_EXPIRED(pxTimer)
struct xSTATIC_TIMER StaticTimer_t
#define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret)
#define traceTIMER_COMMAND_SEND(xTimer, xMessageID, xMessageValueValue, xReturn)
#define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret)
#define mtCOVERAGE_TEST_MARKER()
struct xSTATIC_TCB StaticTask_t
#define portYIELD_WITHIN_API
void vApplicationDaemonTaskStartupHook(void)
struct xLIST_ITEM ListItem_t
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove) PRIVILEGED_FUNCTION
#define listIS_CONTAINED_WITHIN(pxList, pxListItem)
#define listGET_ITEM_VALUE_OF_HEAD_ENTRY(pxList)
#define listGET_OWNER_OF_HEAD_ENTRY(pxList)
#define listSET_LIST_ITEM_VALUE(pxListItem, xValue)
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem) PRIVILEGED_FUNCTION
#define listGET_LIST_ITEM_VALUE(pxListItem)
#define listLIST_IS_EMPTY(pxList)
void vListInitialiseItem(ListItem_t *const pxItem) PRIVILEGED_FUNCTION
#define listSET_LIST_ITEM_OWNER(pxListItem, pxOwner)
void vListInitialise(List_t *const pxList) PRIVILEGED_FUNCTION
#define PRIVILEGED_FUNCTION
void vPortFree(void *pv) PRIVILEGED_FUNCTION
void * pvPortMalloc(size_t xSize) PRIVILEGED_FUNCTION
#define portTASK_FUNCTION_PROTO(vFunction, pvParameters)
#define portTASK_FUNCTION(vFunction, pvParameters)
unsigned long UBaseType_t
portSTACK_TYPE StackType_t
#define xQueueSendFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)
#define xQueueSendToBackFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)
struct QueueDefinition * QueueHandle_t
#define xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait)
void vQueueWaitForMessageRestricted(QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely) PRIVILEGED_FUNCTION
BaseType_t xQueueReceive(QueueHandle_t xQueue, void *const pvBuffer, TickType_t xTicksToWait) PRIVILEGED_FUNCTION
BaseType_t xTaskResumeAll(void) PRIVILEGED_FUNCTION
BaseType_t xTaskGetSchedulerState(void) PRIVILEGED_FUNCTION
struct tskTaskControlBlock * TaskHandle_t
void vTaskSuspendAll(void) PRIVILEGED_FUNCTION
TickType_t xTaskGetTickCount(void) PRIVILEGED_FUNCTION
#define taskEXIT_CRITICAL()
#define taskENTER_CRITICAL()
#define taskSCHEDULER_RUNNING
BaseType_t xTimerPendFunctionCall(PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait) PRIVILEGED_FUNCTION
BaseType_t xTimerPendFunctionCall( PendedFunction_t xFunctionToPend, ...
TickType_t xTimerGetExpiryTime(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
TickType_t xTimerGetExpiryTime( TimerHandle_t xTimer );.
UBaseType_t uxTimerGetReloadMode(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
UBaseType_t uxTimerGetReloadMode( TimerHandle_t xTimer );.
void * pvTimerGetTimerID(const TimerHandle_t xTimer) PRIVILEGED_FUNCTION
TimerHandle_t xTimerCreate( const char * const pcTimerName, TickType_t...
BaseType_t xTimerGetReloadMode(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
BaseType_t xTimerGetReloadMode( TimerHandle_t xTimer );.
#define tmrCOMMAND_RESET_FROM_ISR
BaseType_t xTimerGenericCommand(TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t *const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait) PRIVILEGED_FUNCTION
void vTimerSetTimerID(TimerHandle_t xTimer, void *pvNewID) PRIVILEGED_FUNCTION
void vTimerSetTimerID( TimerHandle_t xTimer, void *pvNewID );
TickType_t xTimerGetPeriod(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
TickType_t xTimerGetPeriod( TimerHandle_t xTimer );.
BaseType_t xTimerIsTimerActive(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
BaseType_t xTimerIsTimerActive( TimerHandle_t xTimer );.
const char * pcTimerGetName(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
const char * const pcTimerGetName( TimerHandle_t xTimer );
void vTimerSetReloadMode(TimerHandle_t xTimer, const BaseType_t xAutoReload) PRIVILEGED_FUNCTION
void vTimerSetReloadMode( TimerHandle_t xTimer, const BaseType_t xAutoReload );
#define tmrCOMMAND_DELETE
void(* TimerCallbackFunction_t)(TimerHandle_t xTimer)
#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR
#define tmrCOMMAND_EXECUTE_CALLBACK
#define tmrCOMMAND_STOP_FROM_ISR
TaskHandle_t xTimerGetTimerDaemonTaskHandle(void) PRIVILEGED_FUNCTION
TaskHandle_t xTimerGetTimerDaemonTaskHandle( void );.
#define tmrCOMMAND_CHANGE_PERIOD
#define tmrCOMMAND_START_FROM_ISR
BaseType_t xTimerPendFunctionCallFromISR(PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken) PRIVILEGED_FUNCTION
BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t xFunctionToPend, ...
struct tmrTimerControl * TimerHandle_t
void(* PendedFunction_t)(void *, uint32_t)
BaseType_t xTimerCreateTimerTask(void) PRIVILEGED_FUNCTION
BaseType_t xTimerGetStaticBuffer( TimerHandle_t xTimer, StaticTimer_...
#define tmrFIRST_FROM_ISR_COMMAND
#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR