vTimerSetTimerNumber (struct tmrTimerControl * xTimer, UBaseType_t uxTimerNumber) { : MEM[(struct Timer_t *)xTimer].uxTimerNumber = uxTimerNumber; return; } uxTimerGetTimerNumber (struct tmrTimerControl * xTimer) { UBaseType_t D.6791; : D.6791 = MEM[(struct Timer_t *)xTimer].uxTimerNumber; : : return D.6791; } xTimerPendFunctionCall (void (*PendedFunction_t) (void *, uint32_t) xFunctionToPend, void * pvParameter1, uint32_t ulParameter2, TickType_t xTicksToWait) { BaseType_t xReturn; struct DaemonTaskMessage_t xMessage; BaseType_t D.6788; : xTimerQueue.26_1 = xTimerQueue; if (xTimerQueue.26_1 == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : xMessage.xMessageID = -1; xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; xTimerQueue.27_2 = xTimerQueue; xReturn = xQueueGenericSend (xTimerQueue.27_2, &xMessage, xTicksToWait, 0); D.6788 = xReturn; xMessage = {CLOBBER}; : : return D.6788; } xTimerPendFunctionCallFromISR (void (*PendedFunction_t) (void *, uint32_t) xFunctionToPend, void * pvParameter1, uint32_t ulParameter2, BaseType_t * pxHigherPriorityTaskWoken) { BaseType_t xReturn; struct DaemonTaskMessage_t xMessage; BaseType_t D.6783; : xMessage.xMessageID = -2; xMessage.u.xCallbackParameters.pxCallbackFunction = xFunctionToPend; xMessage.u.xCallbackParameters.pvParameter1 = pvParameter1; xMessage.u.xCallbackParameters.ulParameter2 = ulParameter2; xTimerQueue.25_1 = xTimerQueue; xReturn = xQueueGenericSendFromISR (xTimerQueue.25_1, &xMessage, pxHigherPriorityTaskWoken, 0); D.6783 = xReturn; xMessage = {CLOBBER}; : : return D.6783; } vTimerSetTimerID (struct tmrTimerControl * xTimer, void * pvNewID) { struct Timer_t * const pxTimer; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : vPortEnterCritical (); pxTimer->pvTimerID = pvNewID; vPortExitCritical (); return; } pvTimerGetTimerID (struct tmrTimerControl * const xTimer) { void * pvReturn; struct Timer_t * const pxTimer; void * D.6779; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : vPortEnterCritical (); pvReturn = pxTimer->pvTimerID; vPortExitCritical (); D.6779 = pvReturn; : : return D.6779; } xTimerIsTimerActive (struct tmrTimerControl * xTimer) { struct Timer_t * pxTimer; BaseType_t xReturn; BaseType_t D.6775; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : vPortEnterCritical (); _1 = pxTimer->ucStatus; _2 = (int) _1; _3 = _2 & 1; if (_3 == 0) goto ; [INV] else goto ; [INV] : xReturn = 0; goto ; [INV] : xReturn = 1; : vPortExitCritical (); D.6775 = xReturn; : : return D.6775; } prvCheckForValidListAndQueue () { : vPortEnterCritical (); xTimerQueue.22_1 = xTimerQueue; if (xTimerQueue.22_1 == 0B) goto ; [INV] else goto ; [INV] : vListInitialise (&xActiveTimerList1); vListInitialise (&xActiveTimerList2); pxCurrentTimerList = &xActiveTimerList1; pxOverflowTimerList = &xActiveTimerList2; _2 = xQueueGenericCreate (10, 16, 0); xTimerQueue = _2; xTimerQueue.23_3 = xTimerQueue; if (xTimerQueue.23_3 != 0B) goto ; [INV] else goto ; [INV] : xTimerQueue.24_4 = xTimerQueue; vQueueAddToRegistry (xTimerQueue.24_4, "TmrQ"); : vPortExitCritical (); return; } prvSwitchTimerLists () { struct List_t * pxTemp; TickType_t xNextExpireTime; : goto ; [INV] : pxCurrentTimerList.19_1 = pxCurrentTimerList; _2 = pxCurrentTimerList.19_1->xListEnd.pxNext; xNextExpireTime = _2->xItemValue; prvProcessExpiredTimer (xNextExpireTime, 4294967295); : pxCurrentTimerList.20_3 = pxCurrentTimerList; _4 = pxCurrentTimerList.20_3->uxNumberOfItems; if (_4 != 0) goto ; [INV] else goto ; [INV] : pxTemp = pxCurrentTimerList; pxOverflowTimerList.21_5 = pxOverflowTimerList; pxCurrentTimerList = pxOverflowTimerList.21_5; pxOverflowTimerList = pxTemp; return; } prvProcessReceivedCommands () { const struct CallbackParameters_t * const pxCallback; TickType_t xTimeNow; BaseType_t xTimerListsWereSwitched; struct Timer_t * pxTimer; struct DaemonTaskMessage_t xMessage; : goto ; [INV] : _1 = xMessage.xMessageID; if (_1 < 0) goto ; [INV] else goto ; [INV] : pxCallback = &xMessage.u.xCallbackParameters; if (pxCallback == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : _2 = pxCallback->pxCallbackFunction; _3 = pxCallback->pvParameter1; _4 = pxCallback->ulParameter2; _2 (_3, _4); : _5 = xMessage.xMessageID; if (_5 >= 0) goto ; [INV] else goto ; [INV] : pxTimer = xMessage.u.xTimerParameters.pxTimer; _6 = pxTimer->xTimerListItem.pvContainer; if (_6 != 0B) goto ; [INV] else goto ; [INV] : _7 = &pxTimer->xTimerListItem; uxListRemove (_7); : xTimeNow = prvSampleTimeNow (&xTimerListsWereSwitched); _8 = xMessage.xMessageID; switch (_8) [INV], case 1 ... 2: [INV], case 3: [INV], case 4: [INV], case 5: [INV], case 6 ... 7: [INV], case 8: [INV], case 9: [INV]> : : _9 = pxTimer->ucStatus; _10 = _9 | 1; pxTimer->ucStatus = _10; _11 = xMessage.u.xTimerParameters.xMessageValue; _12 = pxTimer->xTimerPeriodInTicks; _13 = _11 + _12; _14 = xMessage.u.xTimerParameters.xMessageValue; _15 = prvInsertTimerInActiveList (pxTimer, _13, xTimeNow, _14); if (_15 != 0) goto ; [INV] else goto ; [INV] : _16 = pxTimer->ucStatus; _17 = (int) _16; _18 = _17 & 4; if (_18 != 0) goto ; [INV] else goto ; [INV] : _19 = xMessage.u.xTimerParameters.xMessageValue; _20 = pxTimer->xTimerPeriodInTicks; _21 = _19 + _20; prvReloadTimer (pxTimer, _21, xTimeNow); goto ; [INV] : _22 = pxTimer->ucStatus; _23 = _22 & 254; pxTimer->ucStatus = _23; : _24 = pxTimer->pxCallbackFunction; _24 (pxTimer); : goto ; [INV] : : _25 = pxTimer->ucStatus; _26 = _25 & 254; pxTimer->ucStatus = _26; goto ; [INV] : : _27 = pxTimer->ucStatus; _28 = _27 | 1; pxTimer->ucStatus = _28; _29 = xMessage.u.xTimerParameters.xMessageValue; pxTimer->xTimerPeriodInTicks = _29; _30 = pxTimer->xTimerPeriodInTicks; if (_30 == 0) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : _31 = pxTimer->xTimerPeriodInTicks; _32 = xTimeNow + _31; prvInsertTimerInActiveList (pxTimer, _32, xTimeNow, xTimeNow); goto ; [INV] : : _33 = pxTimer->ucStatus; _34 = (int) _33; _35 = _34 & 2; if (_35 == 0) goto ; [INV] else goto ; [INV] : vPortFree (pxTimer); goto ; [INV] : _36 = pxTimer->ucStatus; _37 = _36 & 254; pxTimer->ucStatus = _37; : goto ; [INV] : : : xTimerQueue.18_38 = xTimerQueue; _39 = xQueueReceive (xTimerQueue.18_38, &xMessage, 0); if (_39 != 0) goto ; [INV] else goto ; [INV] : xMessage = {CLOBBER}; xTimerListsWereSwitched = {CLOBBER}; return; } prvInsertTimerInActiveList (struct Timer_t * const pxTimer, const TickType_t xNextExpiryTime, const TickType_t xTimeNow, const TickType_t xCommandTime) { BaseType_t xProcessTimerNow; BaseType_t D.6741; : xProcessTimerNow = 0; pxTimer->xTimerListItem.xItemValue = xNextExpiryTime; pxTimer->xTimerListItem.pvOwner = pxTimer; if (xNextExpiryTime <= xTimeNow) goto ; [INV] else goto ; [INV] : _1 = xTimeNow - xCommandTime; _2 = pxTimer->xTimerPeriodInTicks; if (_1 >= _2) goto ; [INV] else goto ; [INV] : xProcessTimerNow = 1; goto ; [INV] : pxOverflowTimerList.16_3 = pxOverflowTimerList; _4 = &pxTimer->xTimerListItem; vListInsert (pxOverflowTimerList.16_3, _4); goto ; [INV] : if (xTimeNow < xCommandTime) goto ; [INV] else goto ; [INV] : if (xNextExpiryTime >= xCommandTime) goto ; [INV] else goto ; [INV] : xProcessTimerNow = 1; goto ; [INV] : pxCurrentTimerList.17_5 = pxCurrentTimerList; _6 = &pxTimer->xTimerListItem; vListInsert (pxCurrentTimerList.17_5, _6); : D.6741 = xProcessTimerNow; : : return D.6741; } prvSampleTimeNow (BaseType_t * const pxTimerListsWereSwitched) { static TickType_t xLastTime = 0; TickType_t xTimeNow; TickType_t D.6729; : xTimeNow = xTaskGetTickCount (); xLastTime.15_1 = xLastTime; if (xTimeNow < xLastTime.15_1) goto ; [INV] else goto ; [INV] : prvSwitchTimerLists (); *pxTimerListsWereSwitched = 1; goto ; [INV] : *pxTimerListsWereSwitched = 0; : xLastTime = xTimeNow; D.6729 = xTimeNow; : : return D.6729; } prvGetNextExpireTime (BaseType_t * const pxListWasEmpty) { TickType_t xNextExpireTime; TickType_t D.6724; long int iftmp.12; : pxCurrentTimerList.13_1 = pxCurrentTimerList; _2 = pxCurrentTimerList.13_1->uxNumberOfItems; if (_2 == 0) goto ; [INV] else goto ; [INV] : iftmp.12 = 1; goto ; [INV] : iftmp.12 = 0; : *pxListWasEmpty = iftmp.12; _3 = *pxListWasEmpty; if (_3 == 0) goto ; [INV] else goto ; [INV] : pxCurrentTimerList.14_4 = pxCurrentTimerList; _5 = pxCurrentTimerList.14_4->xListEnd.pxNext; xNextExpireTime = _5->xItemValue; goto ; [INV] : xNextExpireTime = 0; : D.6724 = xNextExpireTime; : : return D.6724; } prvProcessTimerOrBlockTask (const TickType_t xNextExpireTime, BaseType_t xListWasEmpty) { BaseType_t xTimerListsWereSwitched; TickType_t xTimeNow; long int iftmp.9; : vTaskSuspendAll (); xTimeNow = prvSampleTimeNow (&xTimerListsWereSwitched); xTimerListsWereSwitched.8_1 = xTimerListsWereSwitched; if (xTimerListsWereSwitched.8_1 == 0) goto ; [INV] else goto ; [INV] : if (xListWasEmpty == 0) goto ; [INV] else goto ; [INV] : if (xNextExpireTime <= xTimeNow) goto ; [INV] else goto ; [INV] : xTaskResumeAll (); prvProcessExpiredTimer (xNextExpireTime, xTimeNow); goto ; [INV] : if (xListWasEmpty != 0) goto ; [INV] else goto ; [INV] : pxOverflowTimerList.10_2 = pxOverflowTimerList; _3 = pxOverflowTimerList.10_2->uxNumberOfItems; if (_3 == 0) goto ; [INV] else goto ; [INV] : iftmp.9 = 1; goto ; [INV] : iftmp.9 = 0; : xListWasEmpty = iftmp.9; : xTimerQueue.11_4 = xTimerQueue; _5 = xNextExpireTime - xTimeNow; vQueueWaitForMessageRestricted (xTimerQueue.11_4, _5, xListWasEmpty); _6 = xTaskResumeAll (); if (_6 == 0) goto ; [INV] else goto ; [INV] : _7 = 3758157060B; *_7 = 268435456; __asm__ __volatile__("dsb" : : : "memory"); __asm__ __volatile__("isb"); : goto ; [INV] : xTaskResumeAll (); : xTimerListsWereSwitched = {CLOBBER}; return; } prvTimerTask (void * pvParameters) { BaseType_t xListWasEmpty; TickType_t xNextExpireTime; : xNextExpireTime = prvGetNextExpireTime (&xListWasEmpty); xListWasEmpty.7_1 = xListWasEmpty; prvProcessTimerOrBlockTask (xNextExpireTime, xListWasEmpty.7_1); prvProcessReceivedCommands (); goto ; [INV] } prvProcessExpiredTimer (const TickType_t xNextExpireTime, const TickType_t xTimeNow) { struct Timer_t * const pxTimer; : pxCurrentTimerList.6_1 = pxCurrentTimerList; _2 = pxCurrentTimerList.6_1->xListEnd.pxNext; pxTimer = _2->pvOwner; _3 = &pxTimer->xTimerListItem; uxListRemove (_3); _4 = pxTimer->ucStatus; _5 = (int) _4; _6 = _5 & 4; if (_6 != 0) goto ; [INV] else goto ; [INV] : prvReloadTimer (pxTimer, xNextExpireTime, xTimeNow); goto ; [INV] : _7 = pxTimer->ucStatus; _8 = _7 & 254; pxTimer->ucStatus = _8; : _9 = pxTimer->pxCallbackFunction; _9 (pxTimer); return; } prvReloadTimer (struct Timer_t * const pxTimer, TickType_t xExpiredTime, const TickType_t xTimeNow) { : goto ; [INV] : _1 = pxTimer->xTimerPeriodInTicks; xExpiredTime = xExpiredTime + _1; _2 = pxTimer->pxCallbackFunction; _2 (pxTimer); : _3 = pxTimer->xTimerPeriodInTicks; _4 = xExpiredTime + _3; _5 = prvInsertTimerInActiveList (pxTimer, _4, xTimeNow, xExpiredTime); if (_5 != 0) goto ; [INV] else goto ; [INV] : return; } pcTimerGetName (struct tmrTimerControl * xTimer) { struct Timer_t * pxTimer; const char * D.6696; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : D.6696 = pxTimer->pcTimerName; : : return D.6696; } xTimerGetExpiryTime (struct tmrTimerControl * xTimer) { TickType_t xReturn; struct Timer_t * pxTimer; TickType_t D.6692; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : xReturn = pxTimer->xTimerListItem.xItemValue; D.6692 = xReturn; : : return D.6692; } uxTimerGetReloadMode (struct tmrTimerControl * xTimer) { UBaseType_t uxReturn; struct Timer_t * pxTimer; UBaseType_t D.6688; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : vPortEnterCritical (); _1 = pxTimer->ucStatus; _2 = (int) _1; _3 = _2 & 4; if (_3 == 0) goto ; [INV] else goto ; [INV] : uxReturn = 0; goto ; [INV] : uxReturn = 1; : vPortExitCritical (); D.6688 = uxReturn; : : return D.6688; } vTimerSetReloadMode (struct tmrTimerControl * xTimer, const UBaseType_t uxAutoReload) { struct Timer_t * pxTimer; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : vPortEnterCritical (); if (uxAutoReload != 0) goto ; [INV] else goto ; [INV] : _1 = pxTimer->ucStatus; _2 = _1 | 4; pxTimer->ucStatus = _2; goto ; [INV] : _3 = pxTimer->ucStatus; _4 = _3 & 251; pxTimer->ucStatus = _4; : vPortExitCritical (); return; } xTimerGetPeriod (struct tmrTimerControl * xTimer) { struct Timer_t * pxTimer; TickType_t D.6676; : pxTimer = xTimer; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : D.6676 = pxTimer->xTimerPeriodInTicks; : : return D.6676; } xTimerGetTimerDaemonTaskHandle () { struct tskTaskControlBlock * D.6672; : xTimerTaskHandle.5_1 = xTimerTaskHandle; if (xTimerTaskHandle.5_1 == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : D.6672 = xTimerTaskHandle; : : return D.6672; } xTimerGenericCommand (struct tmrTimerControl * xTimer, const BaseType_t xCommandID, const TickType_t xOptionalValue, BaseType_t * const pxHigherPriorityTaskWoken, const TickType_t xTicksToWait) { struct DaemonTaskMessage_t xMessage; BaseType_t xReturn; BaseType_t D.6667; : xReturn = 0; if (xTimer == 0B) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : xTimerQueue.1_1 = xTimerQueue; if (xTimerQueue.1_1 != 0B) goto ; [INV] else goto ; [INV] : xMessage.xMessageID = xCommandID; xMessage.u.xTimerParameters.xMessageValue = xOptionalValue; xMessage.u.xTimerParameters.pxTimer = xTimer; if (xCommandID <= 5) goto ; [INV] else goto ; [INV] : _2 = xTaskGetSchedulerState (); if (_2 == 2) goto ; [INV] else goto ; [INV] : xTimerQueue.2_3 = xTimerQueue; xReturn = xQueueGenericSend (xTimerQueue.2_3, &xMessage, xTicksToWait, 0); goto ; [INV] : xTimerQueue.3_4 = xTimerQueue; xReturn = xQueueGenericSend (xTimerQueue.3_4, &xMessage, 0, 0); goto ; [INV] : xTimerQueue.4_5 = xTimerQueue; xReturn = xQueueGenericSendFromISR (xTimerQueue.4_5, &xMessage, pxHigherPriorityTaskWoken, 0); : D.6667 = xReturn; xMessage = {CLOBBER}; : : return D.6667; } prvInitialiseNewTimer (const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, void (*TimerCallbackFunction_t) (struct tmrTimerControl *) pxCallbackFunction, struct Timer_t * pxNewTimer) { : if (xTimerPeriodInTicks == 0) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : prvCheckForValidListAndQueue (); pxNewTimer->pcTimerName = pcTimerName; pxNewTimer->xTimerPeriodInTicks = xTimerPeriodInTicks; pxNewTimer->pvTimerID = pvTimerID; pxNewTimer->pxCallbackFunction = pxCallbackFunction; _1 = &pxNewTimer->xTimerListItem; vListInitialiseItem (_1); if (uxAutoReload != 0) goto ; [INV] else goto ; [INV] : _2 = pxNewTimer->ucStatus; _3 = _2 | 4; pxNewTimer->ucStatus = _3; : return; } xTimerCreate (const char * const pcTimerName, const TickType_t xTimerPeriodInTicks, const UBaseType_t uxAutoReload, void * const pvTimerID, void (*TimerCallbackFunction_t) (struct tmrTimerControl *) pxCallbackFunction) { struct Timer_t * pxNewTimer; struct tmrTimerControl * D.6650; : pxNewTimer = pvPortMalloc (44); if (pxNewTimer != 0B) goto ; [INV] else goto ; [INV] : pxNewTimer->ucStatus = 0; prvInitialiseNewTimer (pcTimerName, xTimerPeriodInTicks, uxAutoReload, pvTimerID, pxCallbackFunction, pxNewTimer); : D.6650 = pxNewTimer; : : return D.6650; } xTimerCreateTimerTask () { BaseType_t xReturn; BaseType_t D.6646; : xReturn = 0; prvCheckForValidListAndQueue (); xTimerQueue.0_1 = xTimerQueue; if (xTimerQueue.0_1 != 0B) goto ; [INV] else goto ; [INV] : xReturn = xTaskCreate (prvTimerTask, "Tmr Svc", 180, 0B, 2, &xTimerTaskHandle); : if (xReturn == 0) goto ; [INV] else goto ; [INV] : vPortRaiseBASEPRI (); : goto ; [INV] : D.6646 = xReturn; : : return D.6646; } __attribute__((always_inline)) vPortRaiseBASEPRI () { uint32_t ulNewBASEPRI; : __asm__ __volatile__(" mov %0, %1 msr basepri, %0 isb dsb " : "=r" ulNewBASEPRI : "i" 16 : "memory"); return; }