diff --git a/firmware/config/boards/st_stm32f4/board.h b/firmware/config/boards/st_stm32f4/board.h index b5e7fe62b8..4a100ba869 100644 --- a/firmware/config/boards/st_stm32f4/board.h +++ b/firmware/config/boards/st_stm32f4/board.h @@ -45,12 +45,6 @@ #define EFI_PIN_MODE_DEFAULT PIN_MODE_INPUT #define EFI_DR_DEFAULT PIN_PUPDR_FLOATING -// older Frankenso does not have pull-downs on hi-side drivers and this affects rusEfi primary test mules -// https://github.com/rusefi/rusefi/issues/1051 -#define FRANKENSO_0_4_ISSUE_1051_MODE PIN_MODE_OUTPUT -#define FRANKENSO_0_4_ISSUE_1051_OTYPE PIN_OTYPE_PUSHPULL -#define FRANKENSO_0_4_ISSUE_1051_PUD PIN_PUPDR_PULLDOWN -#define FRANKENSO_0_4_ISSUE_1051_ODR PIN_ODR_LOW /* * Board oscillators-related settings. @@ -550,9 +544,9 @@ EFI_PIN_MODE_DEFAULT(GPIOC_PIN4) | \ EFI_PIN_MODE_DEFAULT(GPIOC_PIN5) | \ EFI_PIN_MODE_DEFAULT(GPIOC_PIN6) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOC_PIN7) | \ + EFI_PIN_MODE_DEFAULT(GPIOC_PIN7) | \ EFI_PIN_MODE_DEFAULT(GPIOC_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOC_PIN9) | \ + EFI_PIN_MODE_DEFAULT(GPIOC_PIN9) | \ EFI_PIN_MODE_DEFAULT(GPIOC_PIN10) | \ EFI_PIN_MODE_DEFAULT(GPIOC_PIN11) | \ EFI_PIN_MODE_DEFAULT(GPIOC_PIN12) | \ @@ -566,9 +560,9 @@ PIN_OTYPE_PUSHPULL(GPIOC_PIN4) | \ PIN_OTYPE_PUSHPULL(GPIOC_PIN5) | \ PIN_OTYPE_PUSHPULL(GPIOC_PIN6) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOC_PIN7) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN7) | \ PIN_OTYPE_PUSHPULL(GPIOC_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOC_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOC_PIN9) | \ PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ PIN_OTYPE_PUSHPULL(GPIOC_PIN11) | \ PIN_OTYPE_PUSHPULL(GPIOC_PIN10) | \ @@ -592,21 +586,21 @@ DEFAULT_GPIO_SPEED(GPIOC_PIN14) | \ DEFAULT_GPIO_SPEED(GPIOC_PIN15)) #define VAL_GPIOC_PUPDR (EFI_DR_DEFAULT(GPIOC_OTG_FS_POWER_ON) |\ - EFI_DR_DEFAULT(GPIOC_PIN1) | \ - EFI_DR_DEFAULT(GPIOC_PIN2) | \ - EFI_DR_DEFAULT(GPIOC_PIN3) | \ - EFI_DR_DEFAULT(GPIOC_PIN4) | \ - EFI_DR_DEFAULT(GPIOC_PIN5) | \ - EFI_DR_DEFAULT(GPIOC_PIN6) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOC_PIN7) | \ - EFI_DR_DEFAULT(GPIOC_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOC_PIN9) | \ - EFI_DR_DEFAULT(GPIOC_PIN10) | \ - EFI_DR_DEFAULT(GPIOC_PIN11) | \ - EFI_DR_DEFAULT(GPIOC_PIN12) | \ - EFI_DR_DEFAULT(GPIOC_PIN13) | \ - EFI_DR_DEFAULT(GPIOC_PIN14) | \ - EFI_DR_DEFAULT(GPIOC_PIN15)) + PIN_PUPDR_PULLDOWN(GPIOC_PIN1) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN2) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN3) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN4) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN5) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN6) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN7) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN8) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN9) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN10) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN11) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN12) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN13) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN14) | \ + PIN_PUPDR_PULLDOWN(GPIOC_PIN15)) #define VAL_GPIOC_ODR (PIN_ODR_HIGH(GPIOC_OTG_FS_POWER_ON) | \ PIN_ODR_HIGH(GPIOC_PIN1) | \ PIN_ODR_HIGH(GPIOC_PIN2) | \ @@ -614,9 +608,9 @@ PIN_ODR_HIGH(GPIOC_PIN4) | \ PIN_ODR_HIGH(GPIOC_PIN5) | \ PIN_ODR_HIGH(GPIOC_PIN6) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOC_PIN7) | \ + PIN_ODR_HIGH(GPIOC_PIN7) | \ PIN_ODR_HIGH(GPIOC_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOC_PIN9) | \ + PIN_ODR_HIGH(GPIOC_PIN9) | \ PIN_ODR_HIGH(GPIOC_PIN10) | \ PIN_ODR_HIGH(GPIOC_PIN11) | \ PIN_ODR_HIGH(GPIOC_PIN12) | \ @@ -668,8 +662,8 @@ EFI_PIN_MODE_DEFAULT(GPIOD_OVER_CURRENT) | \ EFI_PIN_MODE_DEFAULT(GPIOD_PIN6) | \ EFI_PIN_MODE_DEFAULT(GPIOD_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOD_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOD_PIN9) | \ + EFI_PIN_MODE_DEFAULT(GPIOD_PIN8) | \ + EFI_PIN_MODE_DEFAULT(GPIOD_PIN9) | \ EFI_PIN_MODE_DEFAULT(GPIOD_PIN10) | \ EFI_PIN_MODE_DEFAULT(GPIOD_PIN11) | \ PIN_MODE_OUTPUT(GPIOD_LED4) | \ @@ -684,8 +678,8 @@ PIN_OTYPE_PUSHPULL(GPIOD_OVER_CURRENT) |\ PIN_OTYPE_PUSHPULL(GPIOD_PIN6) | \ PIN_OTYPE_PUSHPULL(GPIOD_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOD_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOD_PIN9) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOD_PIN9) | \ PIN_OTYPE_PUSHPULL(GPIOD_PIN10) | \ PIN_OTYPE_PUSHPULL(GPIOD_PIN11) | \ PIN_OTYPE_PUSHPULL(GPIOD_LED4) | \ @@ -716,8 +710,8 @@ EFI_DR_DEFAULT(GPIOD_OVER_CURRENT) |\ PIN_PUPDR_PULLUP(GPIOD_PIN6) | \ PIN_PUPDR_PULLUP(GPIOD_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOD_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOD_PIN9) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN8) | \ + PIN_PUPDR_PULLUP(GPIOD_PIN9) | \ PIN_PUPDR_PULLUP(GPIOD_PIN10) | \ PIN_PUPDR_PULLUP(GPIOD_PIN11) | \ EFI_DR_DEFAULT(GPIOD_LED4) | \ @@ -732,8 +726,8 @@ PIN_ODR_HIGH(GPIOD_OVER_CURRENT) | \ PIN_ODR_HIGH(GPIOD_PIN6) | \ PIN_ODR_HIGH(GPIOD_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOD_PIN8) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOD_PIN9) | \ + PIN_ODR_HIGH(GPIOD_PIN8) | \ + PIN_ODR_HIGH(GPIOD_PIN9) | \ PIN_ODR_HIGH(GPIOD_PIN10) | \ PIN_ODR_HIGH(GPIOD_PIN11) | \ PIN_ODR_LOW(GPIOD_LED4) | \ @@ -785,13 +779,13 @@ EFI_PIN_MODE_DEFAULT(GPIOE_PIN5) | \ EFI_PIN_MODE_DEFAULT(GPIOE_PIN6) | \ EFI_PIN_MODE_DEFAULT(GPIOE_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOE_PIN8) | \ + EFI_PIN_MODE_DEFAULT(GPIOE_PIN8) | \ EFI_PIN_MODE_DEFAULT(GPIOE_PIN9) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOE_PIN10) | \ + EFI_PIN_MODE_DEFAULT(GPIOE_PIN10) | \ EFI_PIN_MODE_DEFAULT(GPIOE_PIN11) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOE_PIN12) | \ + EFI_PIN_MODE_DEFAULT(GPIOE_PIN12) | \ EFI_PIN_MODE_DEFAULT(GPIOE_PIN13) | \ - FRANKENSO_0_4_ISSUE_1051_MODE(GPIOE_PIN14) | \ + EFI_PIN_MODE_DEFAULT(GPIOE_PIN14) | \ EFI_PIN_MODE_DEFAULT(GPIOE_PIN15)) #define VAL_GPIOE_OTYPER (PIN_OTYPE_PUSHPULL(GPIOE_PIN0) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN1) | \ @@ -801,13 +795,13 @@ PIN_OTYPE_PUSHPULL(GPIOE_PIN5) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN6) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOE_PIN8) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN8) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN9) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOE_PIN10) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN10) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN11) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOE_PIN12) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN12) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN13) | \ - FRANKENSO_0_4_ISSUE_1051_OTYPE(GPIOE_PIN14) | \ + PIN_OTYPE_PUSHPULL(GPIOE_PIN14) | \ PIN_OTYPE_PUSHPULL(GPIOE_PIN15)) #define VAL_GPIOE_OSPEEDR (DEFAULT_GPIO_SPEED(GPIOE_PIN0) | \ DEFAULT_GPIO_SPEED(GPIOE_PIN1) | \ @@ -833,13 +827,13 @@ EFI_DR_DEFAULT(GPIOE_PIN5) | \ EFI_DR_DEFAULT(GPIOE_PIN6) | \ EFI_DR_DEFAULT(GPIOE_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOE_PIN8) | \ + EFI_DR_DEFAULT(GPIOE_PIN8) | \ EFI_DR_DEFAULT(GPIOE_PIN9) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOE_PIN10) | \ + EFI_DR_DEFAULT(GPIOE_PIN10) | \ EFI_DR_DEFAULT(GPIOE_PIN11) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOE_PIN12) | \ + EFI_DR_DEFAULT(GPIOE_PIN12) | \ EFI_DR_DEFAULT(GPIOE_PIN13) | \ - FRANKENSO_0_4_ISSUE_1051_PUD(GPIOE_PIN14) | \ + EFI_DR_DEFAULT(GPIOE_PIN14) | \ EFI_DR_DEFAULT(GPIOE_PIN15)) #define VAL_GPIOE_ODR (PIN_ODR_HIGH(GPIOE_PIN0) | \ PIN_ODR_HIGH(GPIOE_PIN1) | \ @@ -849,13 +843,13 @@ PIN_ODR_HIGH(GPIOE_PIN5) | \ PIN_ODR_HIGH(GPIOE_PIN6) | \ PIN_ODR_HIGH(GPIOE_PIN7) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOE_PIN8) | \ + PIN_ODR_HIGH(GPIOE_PIN8) | \ PIN_ODR_HIGH(GPIOE_PIN9) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOE_PIN10) | \ + PIN_ODR_HIGH(GPIOE_PIN10) | \ PIN_ODR_HIGH(GPIOE_PIN11) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOE_PIN12) | \ + PIN_ODR_HIGH(GPIOE_PIN12) | \ PIN_ODR_HIGH(GPIOE_PIN13) | \ - FRANKENSO_0_4_ISSUE_1051_ODR(GPIOE_PIN14) | \ + PIN_ODR_HIGH(GPIOE_PIN14) | \ PIN_ODR_HIGH(GPIOE_PIN15)) #define VAL_GPIOE_AFRL (PIN_AFIO_AF(GPIOE_PIN0, 0U) | \ PIN_AFIO_AF(GPIOE_PIN1, 0U) | \ diff --git a/firmware/controllers/actuators/electronic_throttle.cpp b/firmware/controllers/actuators/electronic_throttle.cpp index b1f53ac66e..9458d266df 100644 --- a/firmware/controllers/actuators/electronic_throttle.cpp +++ b/firmware/controllers/actuators/electronic_throttle.cpp @@ -388,7 +388,7 @@ static void showEthInfo(void) { for (int i = 0 ; i < engine->etbActualCount; i++) { EtbHardware *etb = &etbHardware[i]; - scheduleMsg(&logger, "ETB %%d", i); + scheduleMsg(&logger, "ETB %d", i); scheduleMsg(&logger, "Motor: dir=%d DC=%f", etb->dcMotor.isOpenDirection(), etb->dcMotor.get()); etbControllers[i].showStatus(&logger); } diff --git a/firmware/controllers/system/timer/event_queue.cpp b/firmware/controllers/system/timer/event_queue.cpp index 47260cb044..994afa9f60 100644 --- a/firmware/controllers/system/timer/event_queue.cpp +++ b/firmware/controllers/system/timer/event_queue.cpp @@ -122,72 +122,52 @@ static uint32_t lastEventCallbackDuration; int EventQueue::executeAll(efitime_t now) { ScopePerf perf(PE::EventQueueExecuteAll); - - scheduling_s * current, *tmp; - - scheduling_s * executionList = nullptr; - scheduling_s * lastInExecutionList = nullptr; - - int listIterationCounter = 0; int executionCounter = 0; - // we need safe iteration because we are removing elements inside the loop - LL_FOREACH_SAFE2(head, current, tmp, nextScheduling_s) - { - if (++listIterationCounter > QUEUE_LENGTH_LIMIT) { - firmwareError(CUSTOM_LIST_LOOP, "Is this list looped?"); - return false; - } - if (current->momentX <= now) { - executionCounter++; - efiAssert(CUSTOM_ERR_ASSERT, head == current, "removing from head", -1); - //LL_DELETE(head, current); - head = head->nextScheduling_s; - if (executionList == NULL) { - lastInExecutionList = executionList = current; - } else { - lastInExecutionList->nextScheduling_s = current; - lastInExecutionList = current; - } - current->nextScheduling_s = nullptr; - } else { - /** - * The list is sorted. Once we find one action in the future, all the remaining ones - * are also in the future. - */ - break; - } - } + #if EFI_UNIT_TEST assertListIsSorted(); #endif - /* - * we need safe iteration here because 'callback' might change change 'current->next' - * while re-inserting it into the queue from within the callback - */ - LL_FOREACH_SAFE2(executionList, current, tmp, nextScheduling_s) { - uint32_t before = getTimeNowLowerNt(); + while (true) { + // Read the head every time - a previously executed event could + // have inserted something new at the head + scheduling_s* current = head; + + // Queue is empty - bail + if (!current) { + break; + } + + // Only execute events that occured in the past. + // The list is sorted, so as soon as we see an event + // in the future, we're done. + if (current->momentX > now) { + break; + } + + executionCounter++; + + // step the head forward, unlink this element, clear scheduled flag + head = current->nextScheduling_s; + current->nextScheduling_s = nullptr; current->isScheduled = false; - uint32_t howFarOff = now - current->momentX; - maxSchedulingPrecisionLoss = maxI(maxSchedulingPrecisionLoss, howFarOff); + #if EFI_UNIT_TEST printf("QUEUE: execute current=%d param=%d\r\n", (long)current, (long)current->action.getArgument()); #endif + // Execute the current element { ScopePerf perf2(PE::EventQueueExecuteCallback); current->action.execute(); } - // even with overflow it's safe to subtract here - lastEventCallbackDuration = getTimeNowLowerNt() - before; - if (lastEventCallbackDuration > maxEventCallbackDuration) - maxEventCallbackDuration = lastEventCallbackDuration; - if (lastEventCallbackDuration > 2000) { - longScheduling = current; -// what is this line about? lastEventCallbackDuration++; - } +#if EFI_UNIT_TEST + // (tests only) Ensure we didn't break anything + assertListIsSorted(); +#endif } + return executionCounter; } @@ -198,7 +178,6 @@ int EventQueue::size(void) const { return result; } -#if EFI_UNIT_TEST void EventQueue::assertListIsSorted() const { scheduling_s *current = head; while (current != NULL && current->nextScheduling_s != NULL) { @@ -206,7 +185,6 @@ void EventQueue::assertListIsSorted() const { current = current->nextScheduling_s; } } -#endif void EventQueue::setLateDelay(int value) { lateDelay = value;