// // Created by cfif on 22.09.2025. // #include "Clock.h" #include "LoggerToSerialPort.h" #include "LoggerInterface.h" #include "StorageOnFlash.h" #include "Rtcs.h" #include "SerialPorts.h" #include "CmsisRtosThreadUtils.h" #include "SystemDelayInterface.h" #include "DeviceStorage.h" typedef struct { tRtcs *rtcs; tLoggerToSerialPort slog; tStorageOnFlash *flash; tDeviceStorage storage; struct { osThreadId_t id; uint32_t stack[2048]; StaticTask_t controlBlock; osThreadAttr_t attr; } thread; } tBootMma; tBootMma MAIN_BOOT_ENV; #define LOGGER &MAIN_ENV.slog.logger #define LOG_SIGN "Boot" _Noreturn void stop() { while (1) { asm("nop"); } } #define STOP stop(); #if (configCHECK_FOR_STACK_OVERFLOW > 0) void vApplicationStackOverflowHook(TaskHandle_t xTask, const char *pcTaskName) { PROCESS_UNUSED_VAR(xTask); PROCESS_UNUSED_VAR(pcTaskName); STOP } #endif static _Noreturn void MainTransmitter_Thread(tBootMma *env) { // Настройка таймера реального времени time_t set_timestamp = 1768553105; RtcSet(&env->rtcs->rtcI0, &set_timestamp); SerialPorts_Init(); LoggerToSerialPort_Init( &env->slog, 3, &SERIAL_PORTS.cliVirtualPortOut_Io, &SERIAL_PORTS.SerialPortLog_IO, &env->rtcs->rtcI0, SERIAL_LOGGER_SHOW_TIME | SERIAL_LOGGER_SHOW_AUTHOR | SERIAL_LOGGER_SHOW_LOG_LEVEL, 1000 ); LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Start logging") LoggerInfoStatic(&env->slog.logger, LOG_SIGN, "Initialization of subsystems") bool result = DeviceStorage_Init(&env->storage, true, &env->flash->interface_calib, &env->flash->interface_param, &env->slog.logger); env->flash->nf_storage_param.logger = &env->slog.logger; env->flash->nf_storage_calib.logger = &env->slog.logger; for (;;) { SystemDelayMs(1000); } } void MainTransmitter_StartThread(tBootMma *env) { if (!env->thread.id) { env->thread.id = osThreadNew((osThreadFunc_t) (MainTransmitter_Thread), (void *) (env), &env->thread.attr); } } int main(void) { Bsp_CLOCK_Init(); NVIC_SetPriorityGrouping(NVIC_PRIORITY_GROUP_4); tBootMma *env = &MAIN_BOOT_ENV; InitThreadAtrStatic(&env->thread.attr, "LogTransmitter", env->thread.controlBlock, env->thread.stack, osPriorityNormal); MainTransmitter_StartThread(env); }