diff --git a/firmware/controllers/core/error_handling.cpp b/firmware/controllers/core/error_handling.cpp index 930d2637b5..48ac1035fc 100644 --- a/firmware/controllers/core/error_handling.cpp +++ b/firmware/controllers/core/error_handling.cpp @@ -181,8 +181,13 @@ void onUnlockHook(void) { #endif /* EFI_CLOCK_LOCKS */ - -void initErrorHandling(void) { +/** + * This method should be invoked really early in firmware initialization cycle. + * + * Implementation can only do trivial things like changing memory state. No hardware or OS access allowed + * within this method. + */ +void initErrorHandlingDataStructures(void) { #if EFI_SIMULATOR || EFI_PROD_CODE msObjectInit(&warningStream, (uint8_t *) warningBuffer, WARNING_BUFFER_SIZE, 0); msObjectInit(&firmwareErrorMessageStream, errorMessageBuffer, sizeof(errorMessageBuffer), 0); diff --git a/firmware/controllers/core/error_handling.h b/firmware/controllers/core/error_handling.h index 4a04ad33d2..4a6d046218 100644 --- a/firmware/controllers/core/error_handling.h +++ b/firmware/controllers/core/error_handling.h @@ -38,7 +38,7 @@ EXTERNC void firmwareError(obd_code_e code, const char *fmt, ...); // todo: rename to getFatalErrorMessage char *getFirmwareError(void); -void initErrorHandling(void); +void initErrorHandlingDataStructures(void); // todo: rename to getWarningMessage? char *getWarning(void); diff --git a/firmware/hw_layer/ports/kinetis/mpu_util.cpp b/firmware/hw_layer/ports/kinetis/mpu_util.cpp index efb53fea43..dd97f49165 100644 --- a/firmware/hw_layer/ports/kinetis/mpu_util.cpp +++ b/firmware/hw_layer/ports/kinetis/mpu_util.cpp @@ -19,7 +19,7 @@ EXTERN_ENGINE; -void baseHardwareInit(void) { +void baseMCUInit(void) { } void _unhandled_exception(void) { diff --git a/firmware/hw_layer/ports/kinetis/mpu_util.h b/firmware/hw_layer/ports/kinetis/mpu_util.h index 5554ac8898..7a5746a9f9 100644 --- a/firmware/hw_layer/ports/kinetis/mpu_util.h +++ b/firmware/hw_layer/ports/kinetis/mpu_util.h @@ -48,7 +48,7 @@ BOR_Result_t BOR_Set(BOR_Level_t BORValue); #define SPI_CR1_24BIT_MODE 0 #define SPI_CR2_24BIT_MODE 0 -void baseHardwareInit(void); +void baseMCUInit(void); void turnOnSpi(spi_device_e device); #ifdef __cplusplus diff --git a/firmware/hw_layer/ports/stm32/stm32_common_mpu_util.h b/firmware/hw_layer/ports/stm32/stm32_common_mpu_util.h index 159bc53f31..15b9c51a64 100644 --- a/firmware/hw_layer/ports/stm32/stm32_common_mpu_util.h +++ b/firmware/hw_layer/ports/stm32/stm32_common_mpu_util.h @@ -22,7 +22,7 @@ typedef enum { BOR_Level_t BOR_Get(void); BOR_Result_t BOR_Set(BOR_Level_t BORValue); -void baseHardwareInit(void); +void baseMCUInit(void); void turnOnSpi(spi_device_e device); void jump_to_bootloader(); diff --git a/firmware/hw_layer/ports/stm32/stm32f0/mpu_util.h b/firmware/hw_layer/ports/stm32/stm32f0/mpu_util.h index 57ca52bc1d..e7d9410456 100644 --- a/firmware/hw_layer/ports/stm32/stm32f0/mpu_util.h +++ b/firmware/hw_layer/ports/stm32/stm32f0/mpu_util.h @@ -11,6 +11,6 @@ #define EFI_CAN_RX_AF 9 #define EFI_CAN_TX_AF 9 -#define baseHardwareInit() {} +#define baseMCUInit() {} #endif /* MPU_UTIL_H_ */ diff --git a/firmware/hw_layer/ports/stm32/stm32f1/mpu_util.h b/firmware/hw_layer/ports/stm32/stm32f1/mpu_util.h index 374d9c011f..f1b31235b1 100644 --- a/firmware/hw_layer/ports/stm32/stm32f1/mpu_util.h +++ b/firmware/hw_layer/ports/stm32/stm32f1/mpu_util.h @@ -10,7 +10,7 @@ #include "global.h" -#define baseHardwareInit() {} +#define baseMCUInit() {} void initSpiCs(SPIConfig *spiConfig, brain_pin_e csPin); diff --git a/firmware/hw_layer/ports/stm32/stm32f4/mpu_util.cpp b/firmware/hw_layer/ports/stm32/stm32f4/mpu_util.cpp index 3445c77b5e..ebc20ac102 100644 --- a/firmware/hw_layer/ports/stm32/stm32f4/mpu_util.cpp +++ b/firmware/hw_layer/ports/stm32/stm32f4/mpu_util.cpp @@ -78,7 +78,7 @@ EXTERNC int getRemainingStack(thread_t *otp) { #endif /* GNU / IAR */ -void baseHardwareInit(void) { +void baseMCUInit(void) { // looks like this holds a random value on start? Let's set a nice clean zero DWT->CYCCNT = 0; diff --git a/firmware/hw_layer/ports/stm32/stm32f7/mpu_util.cpp b/firmware/hw_layer/ports/stm32/stm32f7/mpu_util.cpp index 2df8e78024..e2e11c76a3 100644 --- a/firmware/hw_layer/ports/stm32/stm32f7/mpu_util.cpp +++ b/firmware/hw_layer/ports/stm32/stm32f7/mpu_util.cpp @@ -76,7 +76,7 @@ EXTERNC int getRemainingStack(thread_t *otp) { #endif /* GNU / IAR */ -void baseHardwareInit(void) { +void baseMCUInit(void) { // looks like this holds a random value on start? Let's set a nice clean zero DWT->CYCCNT = 0; diff --git a/firmware/main.cpp b/firmware/main.cpp index ba68d333c9..483c43d4f7 100644 --- a/firmware/main.cpp +++ b/firmware/main.cpp @@ -19,7 +19,10 @@ int main(void) { halInit(); chSysInit(); - baseHardwareInit(); + /** + * most basic MCU initialization - no configuration access, no external hardware access + */ + baseMCUInit(); runRusEfi(); return 0; diff --git a/firmware/rusefi.cpp b/firmware/rusefi.cpp index 7b70b416a3..b3d52b120b 100644 --- a/firmware/rusefi.cpp +++ b/firmware/rusefi.cpp @@ -162,11 +162,11 @@ static void scheduleReboot(void) { } void runRusEfi(void) { + initErrorHandlingDataStructures(); efiAssertVoid(CUSTOM_RM_STACK_1, getCurrentRemainingStack() > 512, "init s"); assertEngineReference(); engine->setConfig(config); initIntermediateLoggingBuffer(); - initErrorHandling(); addConsoleAction(CMD_REBOOT, scheduleReboot); addConsoleAction(CMD_REBOOT_DFU, jump_to_bootloader); diff --git a/simulator/simulator/rusEfiFunctionalTest.cpp b/simulator/simulator/rusEfiFunctionalTest.cpp index d18c2e0200..349f1e80cf 100644 --- a/simulator/simulator/rusEfiFunctionalTest.cpp +++ b/simulator/simulator/rusEfiFunctionalTest.cpp @@ -92,12 +92,12 @@ static void runChprintfTest() { void rusEfiFunctionalTest(void) { printToConsole("Running rusEfi simulator version:"); + initErrorHandlingDataStructures(); static char versionBuffer[20]; itoa10(versionBuffer, (int)getRusEfiVersion()); printToConsole(versionBuffer); initIntermediateLoggingBuffer(); - initErrorHandling(); engine->setConfig(config);