76 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE 83 #if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 ) 84 #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available. 91 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE 98 #if ( configUSE_TIMERS == 1 ) 101 #define tmrNO_DELAY ( TickType_t ) 0U 104 typedef struct tmrTimerControl
106 const char *pcTimerName;
112 #if( configUSE_TRACE_FACILITY == 1 ) 119 typedef xTIMER Timer_t;
126 typedef struct tmrTimerParameters
133 typedef struct tmrCallbackParameters
137 uint32_t ulParameter2;
138 } CallbackParameters_t;
142 typedef struct tmrTimerQueueMessage
147 TimerParameter_t xTimerParameters;
151 #if ( INCLUDE_xTimerPendFunctionCall == 1 ) 152 CallbackParameters_t xCallbackParameters;
155 } DaemonTaskMessage_t;
171 #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) 248 prvCheckForValidListAndQueue();
250 if( xTimerQueue !=
NULL )
252 #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) 280 if( xTimerPeriodInTicks == (
TickType_t ) 0U )
286 pxNewTimer = ( Timer_t * )
pvPortMalloc(
sizeof( Timer_t ) );
287 if( pxNewTimer !=
NULL )
291 prvCheckForValidListAndQueue();
294 pxNewTimer->pcTimerName = pcTimerName;
295 pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
296 pxNewTimer->uxAutoReload = uxAutoReload;
297 pxNewTimer->pvTimerID = pvTimerID;
298 pxNewTimer->pxCallbackFunction = pxCallbackFunction;
319 DaemonTaskMessage_t xMessage;
325 if( xTimerQueue !=
NULL )
328 xMessage.xMessageID = xCommandID;
329 xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
330 xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
359 #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 ) 366 return xTimerTaskHandle;
374 Timer_t *pxTimer = ( Timer_t * ) xTimer;
377 return pxTimer->pcTimerName;
381 static void prvProcessExpiredTimer(
const TickType_t xNextExpireTime,
const TickType_t xTimeNow )
398 if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE )
421 static void prvTimerTask(
void *pvParameters )
427 ( void ) pvParameters;
433 xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );
437 prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty );
440 prvProcessReceivedCommands();
445 static void prvProcessTimerOrBlockTask(
const TickType_t xNextExpireTime,
BaseType_t xListWasEmpty )
457 xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
458 if( xTimerListsWereSwitched ==
pdFALSE )
461 if( ( xListWasEmpty ==
pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )
464 prvProcessExpiredTimer( xNextExpireTime, xTimeNow );
517 if( *pxListWasEmpty ==
pdFALSE )
527 return xNextExpireTime;
538 if( xTimeNow < xLastTime )
540 prvSwitchTimerLists();
541 *pxTimerListsWereSwitched =
pdTRUE;
545 *pxTimerListsWereSwitched =
pdFALSE;
548 xLastTime = xTimeNow;
561 if( xNextExpiryTime <= xTimeNow )
565 if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks )
569 xProcessTimerNow =
pdTRUE;
573 vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );
578 if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )
583 xProcessTimerNow =
pdTRUE;
587 vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
591 return xProcessTimerNow;
595 static void prvProcessReceivedCommands(
void )
597 DaemonTaskMessage_t xMessage;
604 #if ( INCLUDE_xTimerPendFunctionCall == 1 ) 610 const CallbackParameters_t *
const pxCallback = &( xMessage.u.xCallbackParameters );
617 pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 );
632 pxTimer = xMessage.u.xTimerParameters.pxTimer;
652 xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
654 switch( xMessage.xMessageID )
662 if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) ==
pdTRUE )
694 pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;
703 ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );
721 static void prvSwitchTimerLists(
void )
754 xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks );
755 if( xReloadTime > xNextExpireTime )
759 vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
774 pxTemp = pxCurrentTimerList;
775 pxCurrentTimerList = pxOverflowTimerList;
776 pxOverflowTimerList = pxTemp;
780 static void prvCheckForValidListAndQueue(
void )
787 if( xTimerQueue ==
NULL )
791 pxCurrentTimerList = &xActiveTimerList1;
792 pxOverflowTimerList = &xActiveTimerList2;
796 #if ( configQUEUE_REGISTRY_SIZE > 0 ) 798 if( xTimerQueue !=
NULL )
821 Timer_t *pxTimer = ( Timer_t * ) xTimer;
835 return xTimerIsInActiveList;
841 Timer_t *
const pxTimer = ( Timer_t * ) xTimer;
848 pvReturn = pxTimer->pvTimerID;
858 Timer_t *
const pxTimer = ( Timer_t * ) xTimer;
864 pxTimer->pvTimerID = pvNewID;
870 #if( INCLUDE_xTimerPendFunctionCall == 1 ) 874 DaemonTaskMessage_t xMessage;
880 xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;
881 xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;
882 xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;
884 xReturn =
xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );
894 #if( INCLUDE_xTimerPendFunctionCall == 1 ) 898 DaemonTaskMessage_t xMessage;
909 xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;
910 xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;
911 xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;
#define tmrCOMMAND_RESET_FROM_ISR
void vPortFree(void *pv) PRIVILEGED_FUNCTION
#define configTIMER_QUEUE_LENGTH
BaseType_t xTimerPendFunctionCallFromISR(PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken) PRIVILEGED_FUNCTION
TaskHandle_t xTimerGetTimerDaemonTaskHandle(void) PRIVILEGED_FUNCTION
#define traceTIMER_COMMAND_RECEIVED(pxTimer, xMessageID, xMessageValue)
#define listIS_CONTAINED_WITHIN(pxList, pxListItem)
#define traceTIMER_CREATE(pxNewTimer)
#define mtCOVERAGE_TEST_MARKER()
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove) PRIVILEGED_FUNCTION
#define tracePEND_FUNC_CALL(xFunctionToPend, pvParameter1, ulParameter2, ret)
#define listGET_ITEM_VALUE_OF_HEAD_ENTRY(pxList)
#define tmrCOMMAND_STOP_FROM_ISR
#define taskEXIT_CRITICAL()
void vTaskSuspendAll(void) PRIVILEGED_FUNCTION
#define vQueueAddToRegistry(xQueue, pcName)
#define configTIMER_TASK_PRIORITY
TimerHandle_t xTimerCreate(const char *const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void *const pvTimerID, TimerCallbackFunction_t pxCallbackFunction) PRIVILEGED_FUNCTION
#define tmrCOMMAND_CHANGE_PERIOD
#define traceTIMER_CREATE_FAILED()
#define taskSCHEDULER_RUNNING
void * pvPortMalloc(size_t xSize) PRIVILEGED_FUNCTION
#define listSET_LIST_ITEM_VALUE(pxListItem, xValue)
#define portYIELD_WITHIN_API
const char * pcTimerGetTimerName(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
void(* PendedFunction_t)(void *, uint32_t)
#define tmrCOMMAND_DELETE
#define listLIST_IS_EMPTY(pxList)
BaseType_t xTimerGenericCommand(TimerHandle_t xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t *const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait) PRIVILEGED_FUNCTION
#define xQueueReceive(xQueue, pvBuffer, xTicksToWait)
unsigned long UBaseType_t
void * pvTimerGetTimerID(const TimerHandle_t xTimer) PRIVILEGED_FUNCTION
#define xQueueSendToBackFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)
#define configTIMER_TASK_STACK_DEPTH
#define listSET_LIST_ITEM_OWNER(pxListItem, pxOwner)
#define traceTIMER_COMMAND_SEND(xTimer, xMessageID, xMessageValueValue, xReturn)
TickType_t xTaskGetTickCount(void) PRIVILEGED_FUNCTION
#define portPRIVILEGE_BIT
#define tracePEND_FUNC_CALL_FROM_ISR(xFunctionToPend, pvParameter1, ulParameter2, ret)
#define tmrCOMMAND_START_DONT_TRACE
void vQueueWaitForMessageRestricted(QueueHandle_t xQueue, TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely) PRIVILEGED_FUNCTION
void(* TimerCallbackFunction_t)(TimerHandle_t xTimer)
BaseType_t xTimerPendFunctionCall(PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait) PRIVILEGED_FUNCTION
#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR
#define listGET_OWNER_OF_HEAD_ENTRY(pxList)
#define tmrCOMMAND_START_FROM_ISR
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem) PRIVILEGED_FUNCTION
#define tmrCOMMAND_EXECUTE_CALLBACK
#define tmrFIRST_FROM_ISR_COMMAND
BaseType_t xTaskResumeAll(void) PRIVILEGED_FUNCTION
BaseType_t xTaskGetSchedulerState(void) PRIVILEGED_FUNCTION
#define taskENTER_CRITICAL()
#define PRIVILEGED_FUNCTION
void vTimerSetTimerID(TimerHandle_t xTimer, void *pvNewID) PRIVILEGED_FUNCTION
BaseType_t xTimerCreateTimerTask(void) PRIVILEGED_FUNCTION
#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR
#define xQueueCreate(uxQueueLength, uxItemSize)
BaseType_t xTimerIsTimerActive(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
#define xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask)
#define traceTIMER_EXPIRED(pxTimer)
#define xQueueSendFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)
void vListInitialise(List_t *const pxList) PRIVILEGED_FUNCTION
void vListInitialiseItem(ListItem_t *const pxItem) PRIVILEGED_FUNCTION
#define xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait)