72 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
79 #if ( INCLUDE_xTimerPendFunctionCall == 1 ) && ( configUSE_TIMERS == 0 )
80 #error configUSE_TIMERS must be set to 1 to make the xTimerPendFunctionCall() function available.
87 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
94 #if ( configUSE_TIMERS == 1 )
97 #define tmrNO_DELAY ( TickType_t ) 0U
100 typedef struct tmrTimerControl
102 const char *pcTimerName;
108 #if( configUSE_TRACE_FACILITY == 1 )
115 typedef xTIMER Timer_t;
122 typedef struct tmrTimerParameters
129 typedef struct tmrCallbackParameters
133 uint32_t ulParameter2;
134 } CallbackParameters_t;
138 typedef struct tmrTimerQueueMessage
143 TimerParameter_t xTimerParameters;
147 #if ( INCLUDE_xTimerPendFunctionCall == 1 )
148 CallbackParameters_t xCallbackParameters;
151 } DaemonTaskMessage_t;
167 #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )
188 static
void prvTimerTask(
void *pvParameters ) PRIVILEGED_FUNCTION;
194 static
void prvProcessReceivedCommands(
void ) PRIVILEGED_FUNCTION;
206 static
void prvProcessExpiredTimer( const
TickType_t xNextExpireTime, const
TickType_t xTimeNow ) PRIVILEGED_FUNCTION;
212 static
void prvSwitchTimerLists(
void ) PRIVILEGED_FUNCTION;
218 static
TickType_t prvSampleTimeNow(
BaseType_t * const pxTimerListsWereSwitched ) PRIVILEGED_FUNCTION;
226 static
TickType_t prvGetNextExpireTime(
BaseType_t * const pxListWasEmpty ) PRIVILEGED_FUNCTION;
232 static
void prvProcessTimerOrBlockTask( const
TickType_t xNextExpireTime, const
BaseType_t xListWasEmpty ) PRIVILEGED_FUNCTION;
244 prvCheckForValidListAndQueue();
246 if( xTimerQueue != NULL )
248 #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )
276 if( xTimerPeriodInTicks == (
TickType_t ) 0U )
282 pxNewTimer = ( Timer_t * )
pvPortMalloc(
sizeof( Timer_t ) );
283 if( pxNewTimer != NULL )
287 prvCheckForValidListAndQueue();
290 pxNewTimer->pcTimerName = pcTimerName;
291 pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks;
292 pxNewTimer->uxAutoReload = uxAutoReload;
293 pxNewTimer->pvTimerID = pvTimerID;
294 pxNewTimer->pxCallbackFunction = pxCallbackFunction;
315 DaemonTaskMessage_t xMessage;
319 if( xTimerQueue != NULL )
322 xMessage.xMessageID = xCommandID;
323 xMessage.u.xTimerParameters.xMessageValue = xOptionalValue;
324 xMessage.u.xTimerParameters.pxTimer = ( Timer_t * ) xTimer;
353 #if ( INCLUDE_xTimerGetTimerDaemonTaskHandle == 1 )
360 return xTimerTaskHandle;
368 Timer_t *pxTimer = ( Timer_t * ) xTimer;
370 return pxTimer->pcTimerName;
374 static void prvProcessExpiredTimer(
const TickType_t xNextExpireTime,
const TickType_t xTimeNow )
391 if( prvInsertTimerInActiveList( pxTimer, ( xNextExpireTime + pxTimer->xTimerPeriodInTicks ), xTimeNow, xNextExpireTime ) == pdTRUE )
414 static void prvTimerTask(
void *pvParameters )
420 ( void ) pvParameters;
426 xNextExpireTime = prvGetNextExpireTime( &xListWasEmpty );
430 prvProcessTimerOrBlockTask( xNextExpireTime, xListWasEmpty );
433 prvProcessReceivedCommands();
438 static void prvProcessTimerOrBlockTask(
const TickType_t xNextExpireTime,
const BaseType_t xListWasEmpty )
450 xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
451 if( xTimerListsWereSwitched ==
pdFALSE )
454 if( ( xListWasEmpty ==
pdFALSE ) && ( xNextExpireTime <= xTimeNow ) )
457 prvProcessExpiredTimer( xNextExpireTime, xTimeNow );
503 if( *pxListWasEmpty ==
pdFALSE )
513 return xNextExpireTime;
524 if( xTimeNow < xLastTime )
526 prvSwitchTimerLists();
527 *pxTimerListsWereSwitched =
pdTRUE;
531 *pxTimerListsWereSwitched =
pdFALSE;
534 xLastTime = xTimeNow;
547 if( xNextExpiryTime <= xTimeNow )
551 if( ( xTimeNow - xCommandTime ) >= pxTimer->xTimerPeriodInTicks )
555 xProcessTimerNow =
pdTRUE;
559 vListInsert( pxOverflowTimerList, &( pxTimer->xTimerListItem ) );
564 if( ( xTimeNow < xCommandTime ) && ( xNextExpiryTime >= xCommandTime ) )
569 xProcessTimerNow =
pdTRUE;
573 vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
577 return xProcessTimerNow;
581 static void prvProcessReceivedCommands(
void )
583 DaemonTaskMessage_t xMessage;
590 #if ( INCLUDE_xTimerPendFunctionCall == 1 )
594 if( xMessage.xMessageID < 0 )
596 const CallbackParameters_t *
const pxCallback = &( xMessage.u.xCallbackParameters );
603 pxCallback->pxCallbackFunction( pxCallback->pvParameter1, pxCallback->ulParameter2 );
618 pxTimer = xMessage.u.xTimerParameters.pxTimer;
638 xTimeNow = prvSampleTimeNow( &xTimerListsWereSwitched );
640 switch( xMessage.xMessageID )
648 if( prvInsertTimerInActiveList( pxTimer, xMessage.u.xTimerParameters.xMessageValue + pxTimer->xTimerPeriodInTicks, xTimeNow, xMessage.u.xTimerParameters.xMessageValue ) == pdTRUE )
655 if( pxTimer->uxAutoReload == (
UBaseType_t ) pdTRUE )
680 pxTimer->xTimerPeriodInTicks = xMessage.u.xTimerParameters.xMessageValue;
689 ( void ) prvInsertTimerInActiveList( pxTimer, ( xTimeNow + pxTimer->xTimerPeriodInTicks ), xTimeNow, xTimeNow );
707 static void prvSwitchTimerLists(
void )
732 if( pxTimer->uxAutoReload == (
UBaseType_t ) pdTRUE )
740 xReloadTime = ( xNextExpireTime + pxTimer->xTimerPeriodInTicks );
741 if( xReloadTime > xNextExpireTime )
745 vListInsert( pxCurrentTimerList, &( pxTimer->xTimerListItem ) );
760 pxTemp = pxCurrentTimerList;
761 pxCurrentTimerList = pxOverflowTimerList;
762 pxOverflowTimerList = pxTemp;
766 static void prvCheckForValidListAndQueue(
void )
773 if( xTimerQueue == NULL )
777 pxCurrentTimerList = &xActiveTimerList1;
778 pxOverflowTimerList = &xActiveTimerList2;
782 #if ( configQUEUE_REGISTRY_SIZE > 0 )
784 if( xTimerQueue != NULL )
807 Timer_t *pxTimer = ( Timer_t * ) xTimer;
819 return xTimerIsInActiveList;
825 Timer_t *
const pxTimer = ( Timer_t * ) xTimer;
827 return pxTimer->pvTimerID;
831 #if( INCLUDE_xTimerPendFunctionCall == 1 )
835 DaemonTaskMessage_t xMessage;
841 xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;
842 xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;
843 xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;
845 xReturn =
xQueueSendFromISR( xTimerQueue, &xMessage, pxHigherPriorityTaskWoken );
855 #if( INCLUDE_xTimerPendFunctionCall == 1 )
859 DaemonTaskMessage_t xMessage;
865 xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend;
866 xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1;
867 xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2;
#define tmrCOMMAND_RESET_FROM_ISR
void vPortFree(void *pv) PRIVILEGED_FUNCTION
#define configTIMER_QUEUE_LENGTH
const char * pcTimerGetTimerName(TimerHandle_t xTimer)
#define traceTIMER_COMMAND_RECEIVED(pxTimer, xMessageID, xMessageValue)
#define listIS_CONTAINED_WITHIN(pxList, pxListItem)
void(* TimerCallbackFunction_t)(TimerHandle_t xTimer)
#define traceTIMER_CREATE(pxNewTimer)
#define mtCOVERAGE_TEST_MARKER()
#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
#define tmrCOMMAND_DELETE
#define listLIST_IS_EMPTY(pxList)
BaseType_t xTimerPendFunctionCall(PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait)
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
#define xQueueSendToBackFromISR(xQueue, pvItemToQueue, pxHigherPriorityTaskWoken)
void(* PendedFunction_t)(void *, uint32_t)
#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
#define tmrCOMMAND_CHANGE_PERIOD_FROM_ISR
#define listGET_OWNER_OF_HEAD_ENTRY(pxList)
#define tmrCOMMAND_START_FROM_ISR
void vQueueWaitForMessageRestricted(QueueHandle_t xQueue, TickType_t xTicksToWait) PRIVILEGED_FUNCTION
void * pvTimerGetTimerID(TimerHandle_t xTimer) PRIVILEGED_FUNCTION
BaseType_t xTimerPendFunctionCallFromISR(PendedFunction_t xFunctionToPend, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken)
#define tmrCOMMAND_EXECUTE_CALLBACK
#define tmrFIRST_FROM_ISR_COMMAND
BaseType_t xTaskResumeAll(void) PRIVILEGED_FUNCTION
BaseType_t xTaskGetSchedulerState(void) PRIVILEGED_FUNCTION
#define taskENTER_CRITICAL()
TaskHandle_t xTimerGetTimerDaemonTaskHandle(void)
#define PRIVILEGED_FUNCTION
BaseType_t xTimerCreateTimerTask(void) PRIVILEGED_FUNCTION
#define tmrCOMMAND_EXECUTE_CALLBACK_FROM_ISR
#define xQueueCreate(uxQueueLength, uxItemSize)
void vListInitialise(List_t *const pxList)
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)
#define xQueueSendToBack(xQueue, pvItemToQueue, xTicksToWait)
void vListInitialiseItem(ListItem_t *const pxItem)
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem)
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove)