From 1f1dad9250e3ffed45947cb0b463db2a0de7e32e Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:06:16 +0100 Subject: [PATCH 1/8] Scheduler now "reserves" a timer from timerdomain --- Inc/HALAL/Models/TimerDomain/TimerDomain.hpp | 15 +++++++++++++++ Inc/HALAL/Services/Time/Scheduler.hpp | 14 -------------- Src/HALAL/Services/Time/Scheduler.cpp | 15 ++++----------- 3 files changed, 19 insertions(+), 25 deletions(-) diff --git a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp index 98af03b94..e76c70831 100644 --- a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp +++ b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp @@ -19,6 +19,15 @@ #include "ErrorHandler/ErrorHandler.hpp" +#ifndef SCHEDULER_TIMER_DOMAIN +/* default is tim2 */ +#define SCHEDULER_TIMER_DOMAIN 2 +#elif (SCHEDULER_TIMER_DOMAIN != 2) && (SCHEDULER_TIMER_DOMAIN != 3) && (SCHEDULER_TIMER_DOMAIN != 23) && (SCHEDULER_TIMER_DOMAIN != 24) +#error Scheduler timer must be a 32 bit timer +#endif + +#define SCHEDULER_GLOBAL_TIMER_IRQn glue(TIM, glue(SCHEDULER_TIMER_DOMAIN, _IRQn)) + // NOTE: only works for static arrays #define ARRAY_LENGTH(a) (sizeof(a) / sizeof(*a)) @@ -531,6 +540,10 @@ TimerXList remaining_requests[i] = i; for (int i = 0; i < (int)requests.size(); i++) { + if(static_cast(requests[i].request) == SCHEDULER_TIMER_DOMAIN) { + ST_LIB::compile_error("This timer is used by the scheduler"); + } + if (requests[i].request != TimerRequest::AnyGeneralPurpose && (requests[i].request < 1 || requests[i].request > 24 || (requests[i].request > 17 && requests[i].request < 23))) { @@ -662,6 +675,8 @@ TimerXList static inline std::array instances{}; static void init(std::span cfgs) { + rcc_enable_timer(cmsis_timers[static_cast(SCHEDULER_TIMER_DOMAIN)]); + for (std::size_t i = 0; i < N; i++) { const Config& e = cfgs[i]; diff --git a/Inc/HALAL/Services/Time/Scheduler.hpp b/Inc/HALAL/Services/Time/Scheduler.hpp index ae7bcdb1c..b40d58a22 100644 --- a/Inc/HALAL/Services/Time/Scheduler.hpp +++ b/Inc/HALAL/Services/Time/Scheduler.hpp @@ -15,22 +15,8 @@ #include #include -/* NOTE(vic): Esto cambiará pronto */ -#ifndef SCHEDULER_TIMER_IDX -#define SCHEDULER_TIMER_IDX 2 -#endif - -#ifndef glue -#define glue_(a, b) a##b -#define glue(a, b) glue_(a, b) -#endif -#define SCHEDULER_TIMER_BASE glue(TIM, glue(SCHEDULER_TIMER_IDX, _BASE)) - -// Used to reserve a TimerPeripheral #ifndef SIM_ON #include "stm32h7xx_hal_tim.h" -#define SCHEDULER_HAL_TIM glue(htim, SCHEDULER_TIMER_IDX) -extern TIM_HandleTypeDef SCHEDULER_HAL_TIM; #endif struct Scheduler { diff --git a/Src/HALAL/Services/Time/Scheduler.cpp b/Src/HALAL/Services/Time/Scheduler.cpp index 9754d10ee..2809c34fb 100644 --- a/Src/HALAL/Services/Time/Scheduler.cpp +++ b/Src/HALAL/Services/Time/Scheduler.cpp @@ -10,11 +10,8 @@ #include -/* NOTE(vic): Pido perdón a Boris pero es la mejor manera que se me ha ocurrido hacer esto */ -#define SCHEDULER_RCC_TIMER_ENABLE glue(glue(RCC_APB1LENR_TIM, SCHEDULER_TIMER_IDX), EN) -#define SCHEDULER_GLOBAL_TIMER_IRQn glue(TIM, glue(SCHEDULER_TIMER_IDX, _IRQn)) +TIM_TypeDef *Scheduler_global_timer = nullptr; -#define Scheduler_global_timer ((TIM_TypeDef*)SCHEDULER_TIMER_BASE) namespace { constexpr uint64_t kMaxIntervalUs = static_cast(UINT32_MAX) / 2 + 1ULL; } @@ -68,6 +65,7 @@ void scheduler_global_timer_callback(void* raw) { void Scheduler::start() { static_assert((Scheduler::FREQUENCY % 1'000'000) == 0u, "frequenct must be a multiple of 1MHz"); + Scheduler_global_timer = ST_LIB::TimerDomain::cmsis_timers[ST_LIB::timer_idxmap[SCHEDULER_TIMER_DOMAIN]]; uint32_t prescaler = (SystemCoreClock / Scheduler::FREQUENCY); // setup prescaler @@ -133,14 +131,9 @@ void Scheduler::start() { if (prescaler == 0 || prescaler > 0xFFFF) { ErrorHandler("Invalid prescaler value: %u", prescaler); + return; } - // static_assert(prescaler < 0xFFFF, "Prescaler is 16 bit, so it must be in that range"); - // static_assert(prescaler != 0, "Prescaler must be in the range [1, 65535]"); -#ifndef SIM_ON - RCC->APB1LENR |= SCHEDULER_RCC_TIMER_ENABLE; -#endif - Scheduler_global_timer->PSC = (uint16_t)prescaler; Scheduler_global_timer->ARR = 0; Scheduler_global_timer->DIER |= LL_TIM_DIER_UIE; @@ -148,7 +141,7 @@ void Scheduler::start() { LL_TIM_CLOCKDIVISION_DIV1 | (Scheduler_global_timer->CR1 & ~TIM_CR1_CKD); // Temporary solution for TimerDomain - ST_LIB::TimerDomain::callbacks[ST_LIB::timer_idxmap[SCHEDULER_TIMER_IDX]] = + ST_LIB::TimerDomain::callbacks[ST_LIB::timer_idxmap[static_cast(SCHEDULER_TIMER_DOMAIN)]] = scheduler_global_timer_callback; Scheduler_global_timer->CNT = 0; /* Clear counter value */ From 3d0ad5b4e8511721cf5a3b447467baeaacf2c73f Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:07:59 +0100 Subject: [PATCH 2/8] Also remove possibility of getting scheduler timer from bits32_timers --- Inc/HALAL/Models/TimerDomain/TimerDomain.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp index e76c70831..741c4e28c 100644 --- a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp +++ b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp @@ -589,7 +589,7 @@ TimerXList uint8_t count_32bit_requests = 0; for (int i = 0; i < (int)ARRAY_LENGTH(bits32_timers); i++) { - if (!used_timers[bits32_timers[i]]) + if (!used_timers[bits32_timers[i]] && (bits32_timers[i] != SCHEDULER_TIMER_DOMAIN)) remaining_32bit_timers[count_remaining_32bit_timers++] = bits32_timers[i]; } From 9527cf63b9e82f6e3ec3ead7d6d715ed7b74b060 Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:12:32 +0100 Subject: [PATCH 3/8] stupid change to get precommit to work (?) --- Inc/HALAL/Models/TimerDomain/TimerDomain.hpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp index 741c4e28c..8b9950121 100644 --- a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp +++ b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp @@ -639,7 +639,8 @@ TimerXList for (int i = 0; i < (int)ARRAY_LENGTH(bits32_timers); i++) { if (!used_timers[bits32_timers[i]]) - remaining_timers[count_remaining_timers++] = bits32_timers[i]; + remaining_timers[count_remaining_timers++] = bits32_timers[i] + ; } if (count_remaining_requests > count_remaining_timers) { From 06e52ee5836328759d87341aca960a931ffa3cd4 Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:18:31 +0100 Subject: [PATCH 4/8] fix formatting (?) --- Inc/HALAL/Models/TimerDomain/TimerDomain.hpp | 8 ++++---- Src/HALAL/Services/Time/Scheduler.cpp | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp index 8b9950121..1a1d794bb 100644 --- a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp +++ b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp @@ -22,7 +22,8 @@ #ifndef SCHEDULER_TIMER_DOMAIN /* default is tim2 */ #define SCHEDULER_TIMER_DOMAIN 2 -#elif (SCHEDULER_TIMER_DOMAIN != 2) && (SCHEDULER_TIMER_DOMAIN != 3) && (SCHEDULER_TIMER_DOMAIN != 23) && (SCHEDULER_TIMER_DOMAIN != 24) +#elif (SCHEDULER_TIMER_DOMAIN != 2) && (SCHEDULER_TIMER_DOMAIN != 3) && \ + (SCHEDULER_TIMER_DOMAIN != 23) && (SCHEDULER_TIMER_DOMAIN != 24) #error Scheduler timer must be a 32 bit timer #endif @@ -540,7 +541,7 @@ TimerXList remaining_requests[i] = i; for (int i = 0; i < (int)requests.size(); i++) { - if(static_cast(requests[i].request) == SCHEDULER_TIMER_DOMAIN) { + if (static_cast(requests[i].request) == SCHEDULER_TIMER_DOMAIN) { ST_LIB::compile_error("This timer is used by the scheduler"); } @@ -639,8 +640,7 @@ TimerXList for (int i = 0; i < (int)ARRAY_LENGTH(bits32_timers); i++) { if (!used_timers[bits32_timers[i]]) - remaining_timers[count_remaining_timers++] = bits32_timers[i] - ; + remaining_timers[count_remaining_timers++] = bits32_timers[i]; } if (count_remaining_requests > count_remaining_timers) { diff --git a/Src/HALAL/Services/Time/Scheduler.cpp b/Src/HALAL/Services/Time/Scheduler.cpp index 2809c34fb..9e84707b8 100644 --- a/Src/HALAL/Services/Time/Scheduler.cpp +++ b/Src/HALAL/Services/Time/Scheduler.cpp @@ -10,7 +10,7 @@ #include -TIM_TypeDef *Scheduler_global_timer = nullptr; +TIM_TypeDef* Scheduler_global_timer = nullptr; namespace { constexpr uint64_t kMaxIntervalUs = static_cast(UINT32_MAX) / 2 + 1ULL; @@ -65,7 +65,8 @@ void scheduler_global_timer_callback(void* raw) { void Scheduler::start() { static_assert((Scheduler::FREQUENCY % 1'000'000) == 0u, "frequenct must be a multiple of 1MHz"); - Scheduler_global_timer = ST_LIB::TimerDomain::cmsis_timers[ST_LIB::timer_idxmap[SCHEDULER_TIMER_DOMAIN]]; + Scheduler_global_timer = + ST_LIB::TimerDomain::cmsis_timers[ST_LIB::timer_idxmap[SCHEDULER_TIMER_DOMAIN]]; uint32_t prescaler = (SystemCoreClock / Scheduler::FREQUENCY); // setup prescaler @@ -140,9 +141,8 @@ void Scheduler::start() { Scheduler_global_timer->CR1 = LL_TIM_CLOCKDIVISION_DIV1 | (Scheduler_global_timer->CR1 & ~TIM_CR1_CKD); - // Temporary solution for TimerDomain - ST_LIB::TimerDomain::callbacks[ST_LIB::timer_idxmap[static_cast(SCHEDULER_TIMER_DOMAIN)]] = - scheduler_global_timer_callback; + ST_LIB::TimerDomain::callbacks[ST_LIB::timer_idxmap[static_cast(SCHEDULER_TIMER_DOMAIN + )]] = scheduler_global_timer_callback; Scheduler_global_timer->CNT = 0; /* Clear counter value */ From a574891a43c16f6b46abfb24cf486d7664199c34 Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:21:10 +0100 Subject: [PATCH 5/8] more format fix --- Inc/HALAL/Models/TimerDomain/TimerDomain.hpp | 2 +- Src/HALAL/Services/Time/Scheduler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp index 1a1d794bb..cb4d0eacf 100644 --- a/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp +++ b/Inc/HALAL/Models/TimerDomain/TimerDomain.hpp @@ -23,7 +23,7 @@ /* default is tim2 */ #define SCHEDULER_TIMER_DOMAIN 2 #elif (SCHEDULER_TIMER_DOMAIN != 2) && (SCHEDULER_TIMER_DOMAIN != 3) && \ - (SCHEDULER_TIMER_DOMAIN != 23) && (SCHEDULER_TIMER_DOMAIN != 24) + (SCHEDULER_TIMER_DOMAIN != 23) && (SCHEDULER_TIMER_DOMAIN != 24) #error Scheduler timer must be a 32 bit timer #endif diff --git a/Src/HALAL/Services/Time/Scheduler.cpp b/Src/HALAL/Services/Time/Scheduler.cpp index 9e84707b8..59892a0fa 100644 --- a/Src/HALAL/Services/Time/Scheduler.cpp +++ b/Src/HALAL/Services/Time/Scheduler.cpp @@ -65,7 +65,7 @@ void scheduler_global_timer_callback(void* raw) { void Scheduler::start() { static_assert((Scheduler::FREQUENCY % 1'000'000) == 0u, "frequenct must be a multiple of 1MHz"); - Scheduler_global_timer = + Scheduler_global_timer = ST_LIB::TimerDomain::cmsis_timers[ST_LIB::timer_idxmap[SCHEDULER_TIMER_DOMAIN]]; uint32_t prescaler = (SystemCoreClock / Scheduler::FREQUENCY); From eb00a543d6237cc049d67d8ebe960d1077580c08 Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:27:07 +0100 Subject: [PATCH 6/8] fix segfault in tests (?) --- Inc/HALAL/Services/Time/Scheduler.hpp | 4 +++- Tests/Time/scheduler_test.cpp | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Inc/HALAL/Services/Time/Scheduler.hpp b/Inc/HALAL/Services/Time/Scheduler.hpp index b40d58a22..01e85eee1 100644 --- a/Inc/HALAL/Services/Time/Scheduler.hpp +++ b/Inc/HALAL/Services/Time/Scheduler.hpp @@ -19,13 +19,15 @@ #include "stm32h7xx_hal_tim.h" #endif +extern TIM_TypeDef* Scheduler_global_timer; + struct Scheduler { using callback_t = void (*)(); static constexpr uint32_t INVALID_ID = 0xFFu; static void start(); static void update(); - static inline uint64_t get_global_tick() { return global_tick_us_; } + static inline uint64_t get_global_tick() { return global_tick_us_ + Scheduler_global_timer->CNT; } static uint16_t register_task(uint32_t period_us, callback_t func); static bool unregister_task(uint16_t id); diff --git a/Tests/Time/scheduler_test.cpp b/Tests/Time/scheduler_test.cpp index 600fdba0a..9c2fcc291 100644 --- a/Tests/Time/scheduler_test.cpp +++ b/Tests/Time/scheduler_test.cpp @@ -4,6 +4,8 @@ #include "HALAL/Services/Time/Scheduler.hpp" +Scheduler_global_timer = TIM2_BASE; + int count = 0; void fake_workload() { count++; } From a343916ef6eeb2b39876f9e780b3d5d50e663d73 Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:30:36 +0100 Subject: [PATCH 7/8] fix formatting --- Inc/HALAL/Services/Time/Scheduler.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Inc/HALAL/Services/Time/Scheduler.hpp b/Inc/HALAL/Services/Time/Scheduler.hpp index 01e85eee1..dbe965891 100644 --- a/Inc/HALAL/Services/Time/Scheduler.hpp +++ b/Inc/HALAL/Services/Time/Scheduler.hpp @@ -27,7 +27,9 @@ struct Scheduler { static void start(); static void update(); - static inline uint64_t get_global_tick() { return global_tick_us_ + Scheduler_global_timer->CNT; } + static inline uint64_t get_global_tick() { + return global_tick_us_ + Scheduler_global_timer->CNT; + } static uint16_t register_task(uint32_t period_us, callback_t func); static bool unregister_task(uint16_t id); From 11fede4f7cdc5afb4eba137f8ae0d4bee09c0890 Mon Sep 17 00:00:00 2001 From: victhor Date: Wed, 4 Mar 2026 21:36:16 +0100 Subject: [PATCH 8/8] move Scheduler_global_timer in scheduler_test.cpp --- Tests/Time/scheduler_test.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Tests/Time/scheduler_test.cpp b/Tests/Time/scheduler_test.cpp index 9c2fcc291..7376abe5b 100644 --- a/Tests/Time/scheduler_test.cpp +++ b/Tests/Time/scheduler_test.cpp @@ -4,8 +4,6 @@ #include "HALAL/Services/Time/Scheduler.hpp" -Scheduler_global_timer = TIM2_BASE; - int count = 0; void fake_workload() { count++; } @@ -18,6 +16,7 @@ class SchedulerTests : public ::testing::Test { Scheduler::sorted_task_ids_ = 0; Scheduler::global_tick_us_ = 0; Scheduler::current_interval_us_ = 0; + Scheduler_global_timer = TIM2_BASE; // Reset global callback task count count = 0;