Periodic timer controller (#875)
* More than one aux pid #866 * More than one aux pid #866 * More than one aux pid #866 * More than one aux pid #866 * More than one aux pid #866
This commit is contained in:
parent
cf2dff461d
commit
2f68badc47
|
@ -5,7 +5,7 @@
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @date Feb 7, 2013
|
* @date Feb 7, 2013
|
||||||
* @author Andrey Belomutskiy, (c) 2012-2018
|
* @author Andrey Belomutskiy, (c) 2012-2019
|
||||||
*
|
*
|
||||||
* This file is part of rusEfi - see http://rusefi.com
|
* This file is part of rusEfi - see http://rusefi.com
|
||||||
*
|
*
|
||||||
|
@ -65,6 +65,14 @@
|
||||||
#include "AdcConfiguration.h"
|
#include "AdcConfiguration.h"
|
||||||
#endif /* HAL_USE_ADC */
|
#endif /* HAL_USE_ADC */
|
||||||
|
|
||||||
|
#if defined(EFI_BOOTLOADER_INCLUDE_CODE)
|
||||||
|
#include "bootloader/bootloader.h"
|
||||||
|
#endif /* EFI_BOOTLOADER_INCLUDE_CODE */
|
||||||
|
|
||||||
|
#if EFI_PROD_CODE || EFI_SIMULATOR
|
||||||
|
#include "periodic_task.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
#if EFI_PROD_CODE
|
#if EFI_PROD_CODE
|
||||||
#include "pwm_generator.h"
|
#include "pwm_generator.h"
|
||||||
#include "adc_inputs.h"
|
#include "adc_inputs.h"
|
||||||
|
@ -78,7 +86,7 @@
|
||||||
|
|
||||||
#if EFI_CJ125
|
#if EFI_CJ125
|
||||||
#include "cj125.h"
|
#include "cj125.h"
|
||||||
#endif
|
#endif /* EFI_CJ125 */
|
||||||
|
|
||||||
// this method is used by real firmware and simulator and unit test
|
// this method is used by real firmware and simulator and unit test
|
||||||
void mostCommonInitEngineController(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
void mostCommonInitEngineController(Logging *sharedLogger DECLARE_ENGINE_PARAMETER_SUFFIX) {
|
||||||
|
@ -91,21 +99,37 @@ void mostCommonInitEngineController(Logging *sharedLogger DECLARE_ENGINE_PARAMET
|
||||||
|
|
||||||
#if !EFI_UNIT_TEST
|
#if !EFI_UNIT_TEST
|
||||||
|
|
||||||
#if defined(EFI_BOOTLOADER_INCLUDE_CODE)
|
|
||||||
#include "bootloader/bootloader.h"
|
|
||||||
#endif /* EFI_BOOTLOADER_INCLUDE_CODE */
|
|
||||||
|
|
||||||
extern bool hasFirmwareErrorFlag;
|
extern bool hasFirmwareErrorFlag;
|
||||||
extern EnginePins enginePins;
|
extern EnginePins enginePins;
|
||||||
|
|
||||||
EXTERN_ENGINE;
|
EXTERN_ENGINE;
|
||||||
|
|
||||||
/**
|
static void doPeriodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE);
|
||||||
* CH_FREQUENCY is the number of system ticks in a second
|
|
||||||
*/
|
|
||||||
|
|
||||||
static virtual_timer_t periodicSlowTimer; // 20Hz
|
class PeriodicFastController : public PeriodicTimerController {
|
||||||
static virtual_timer_t periodicFastTimer; // 50Hz
|
void PeriodicTask() override {
|
||||||
|
engine->periodicFastCallback();
|
||||||
|
}
|
||||||
|
|
||||||
|
int getPeriodMs() override {
|
||||||
|
return FAST_CALLBACK_PERIOD_MS;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
class PeriodicSlowController : public PeriodicTimerController {
|
||||||
|
void PeriodicTask() override {
|
||||||
|
doPeriodicSlowCallback(PASS_ENGINE_PARAMETER_SIGNATURE);
|
||||||
|
}
|
||||||
|
|
||||||
|
int getPeriodMs() override {
|
||||||
|
// we need at least protection from zero value while resetting configuration
|
||||||
|
int periodMs = maxI(50, CONFIGB(generalPeriodicThreadPeriodMs));
|
||||||
|
return periodMs;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static PeriodicFastController fastController;
|
||||||
|
static PeriodicSlowController slowController;
|
||||||
|
|
||||||
static LoggingWithStorage logger("Engine Controller");
|
static LoggingWithStorage logger("Engine Controller");
|
||||||
|
|
||||||
|
@ -226,15 +250,6 @@ efitimesec_t getTimeNowSeconds(void) {
|
||||||
|
|
||||||
#endif /* EFI_PROD_CODE */
|
#endif /* EFI_PROD_CODE */
|
||||||
|
|
||||||
static void periodicFastCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
||||||
engine->periodicFastCallback();
|
|
||||||
/**
|
|
||||||
* not many reasons why we use ChibiOS timer and not say a dedicated thread here
|
|
||||||
* the only down-side of a dedicated thread is the cost of thread stack
|
|
||||||
*/
|
|
||||||
chVTSetAny(&periodicFastTimer, TIME_MS2I(FAST_CALLBACK_PERIOD_MS), (vtfunc_t) &periodicFastCallback, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void resetAccel(void) {
|
static void resetAccel(void) {
|
||||||
engine->engineLoadAccelEnrichment.reset();
|
engine->engineLoadAccelEnrichment.reset();
|
||||||
engine->tpsAccelEnrichment.reset();
|
engine->tpsAccelEnrichment.reset();
|
||||||
|
@ -321,17 +336,9 @@ static void doPeriodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void periodicSlowCallback(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
|
||||||
doPeriodicSlowCallback(PASS_ENGINE_PARAMETER_SIGNATURE);
|
|
||||||
// schedule next invocation
|
|
||||||
// we need at least protection from zero value while resetting configuration
|
|
||||||
int periodMs = maxI(50, CONFIGB(generalPeriodicThreadPeriodMs));
|
|
||||||
chVTSetAny(&periodicSlowTimer, TIME_MS2I(periodMs), (vtfunc_t) &periodicSlowCallback, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void initPeriodicEvents(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
void initPeriodicEvents(DECLARE_ENGINE_PARAMETER_SIGNATURE) {
|
||||||
periodicSlowCallback(PASS_ENGINE_PARAMETER_SIGNATURE);
|
slowController.start();
|
||||||
periodicFastCallback(PASS_ENGINE_PARAMETER_SIGNATURE);
|
fastController.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
char * getPinNameByAdcChannel(const char *msg, adc_channel_e hwChannel, char *buffer) {
|
char * getPinNameByAdcChannel(const char *msg, adc_channel_e hwChannel, char *buffer) {
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
/*
|
||||||
|
* @file periodic_task.cpp
|
||||||
|
*
|
||||||
|
* @date: Jul 8, 2019
|
||||||
|
* @author Andrey Belomutskiy, (c) 2012-2019
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "periodic_task.h"
|
||||||
|
#include "os_util.h"
|
||||||
|
|
||||||
|
void runAndScheduleNext(PeriodicTimerController *controller) {
|
||||||
|
#if !EFI_UNIT_TEST
|
||||||
|
controller->PeriodicTask();
|
||||||
|
chVTSetAny(&controller->timer, TIME_MS2I(controller->getPeriodMs()), (vtfunc_t) &runAndScheduleNext, controller);
|
||||||
|
#endif /* EFI_UNIT_TEST */
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*
|
||||||
|
* @file periodic_task.h
|
||||||
|
*
|
||||||
|
* @date Jul 8, 2019
|
||||||
|
* @author Andrey Belomutskiy, (c) 2012-2019
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "global.h"
|
||||||
|
|
||||||
|
class PeriodicTimerController;
|
||||||
|
|
||||||
|
void runAndScheduleNext(PeriodicTimerController *controller);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* this is an intermediate implementation - we should probably move from using virtual_timer_t which works on interrupts
|
||||||
|
* into sharing one thread with potentially lower priority instead
|
||||||
|
*/
|
||||||
|
|
||||||
|
class PeriodicTimerController {
|
||||||
|
|
||||||
|
public:
|
||||||
|
#if !EFI_UNIT_TEST
|
||||||
|
virtual_timer_t timer;
|
||||||
|
#endif /* EFI_UNIT_TEST */
|
||||||
|
virtual int getPeriodMs() = 0;
|
||||||
|
|
||||||
|
virtual void PeriodicTask() = 0;
|
||||||
|
|
||||||
|
void start() {
|
||||||
|
runAndScheduleNext(this);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
|
@ -3,6 +3,7 @@ SYSTEMSRC =
|
||||||
|
|
||||||
SYSTEMSRC_CPP = \
|
SYSTEMSRC_CPP = \
|
||||||
$(PROJECT_DIR)/controllers/system/efi_gpio.cpp \
|
$(PROJECT_DIR)/controllers/system/efi_gpio.cpp \
|
||||||
|
$(PROJECT_DIR)/controllers/system/periodic_task.cpp \
|
||||||
$(PROJECT_DIR)/controllers/system/dc_motor.cpp \
|
$(PROJECT_DIR)/controllers/system/dc_motor.cpp \
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue