Skip to content

Commit f60c159

Browse files
Add a test for get_at
1 parent 7231bfd commit f60c159

3 files changed

Lines changed: 30 additions & 21 deletions

File tree

Inc/HALAL/Services/Time/Scheduler.hpp

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,13 @@
99
/* Uso del scheduler, descrito en la wiki:
1010
* https://wiki.hyperloopupv.com/es/firmware/Timing/Scheduler */
1111

12+
/* To allow debugging of inline functions only when testing */
13+
#ifdef SIM_ON
14+
# define HYPER_INLINE inline
15+
#else
16+
# define HYPER_INLINE
17+
#endif
18+
1219
#include "stm32h7xx_ll_tim_wrapper.h"
1320

1421
#include <array>
@@ -42,7 +49,7 @@ struct Scheduler {
4249
static bool cancel_timeout(uint16_t id);
4350

4451
// internal
45-
static void on_timer_update();
52+
static inline void on_timer_update();
4653
static void schedule_next_interval();
4754
static constexpr uint32_t FREQUENCY = 1'000'000u; // 1 MHz -> 1us precision
4855
#ifndef SIM_ON
@@ -90,10 +97,19 @@ struct Scheduler {
9097
static void remove_sorted(uint8_t id);
9198

9299
// helpers
93-
static inline uint8_t get_at(uint8_t idx);
94-
static inline void set_at(uint8_t idx, uint8_t id);
95-
static inline void pop_front();
96-
static inline uint8_t front_id();
100+
static HYPER_INLINE uint8_t get_at(uint8_t idx) {
101+
return (uint8_t)((sorted_task_ids_ >> (idx * 4)) & 0xF);
102+
}
103+
static HYPER_INLINE void set_at(uint8_t idx, uint8_t id) {
104+
uint32_t shift = idx * 4;
105+
uint64_t clearmask = ~(0xFFULL << shift);
106+
Scheduler::sorted_task_ids_ = (sorted_task_ids_ & clearmask) | (id << shift);
107+
}
108+
static HYPER_INLINE uint8_t front_id() { return *((uint8_t*)&sorted_task_ids_) & 0xF; }
109+
static HYPER_INLINE void pop_front() {
110+
Scheduler::active_task_count_--;
111+
Scheduler::sorted_task_ids_ >>= 4;
112+
}
97113

98114
static inline void global_timer_disable();
99115
static inline void global_timer_enable();

Src/HALAL/Services/Time/Scheduler.cpp

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,21 +31,6 @@ uint64_t Scheduler::global_tick_us_{0};
3131
uint32_t Scheduler::current_interval_us_{0};
3232
uint16_t Scheduler::timeout_idx_{1};
3333

34-
inline uint8_t Scheduler::get_at(uint8_t idx) {
35-
return (uint8_t)((sorted_task_ids_ >> (idx * 4)) & 0xF);
36-
}
37-
inline void Scheduler::set_at(uint8_t idx, uint8_t id) {
38-
uint32_t shift = idx * 4;
39-
uint64_t clearmask = ~(0xFFULL << shift);
40-
Scheduler::sorted_task_ids_ = (sorted_task_ids_ & clearmask) | (id << shift);
41-
}
42-
inline uint8_t Scheduler::front_id() { return *((uint8_t*)&sorted_task_ids_) & 0xF; }
43-
inline void Scheduler::pop_front() {
44-
// O(1) remove of logical index 0
45-
Scheduler::active_task_count_--;
46-
Scheduler::sorted_task_ids_ >>= 4;
47-
}
48-
4934
// ----------------------------
5035

5136
inline void Scheduler::global_timer_disable() {
@@ -303,7 +288,7 @@ void Scheduler::schedule_next_interval() {
303288
Scheduler::global_timer_enable();
304289
}
305290

306-
void Scheduler::on_timer_update() {
291+
inline void Scheduler::on_timer_update() {
307292
global_tick_us_ += current_interval_us_;
308293

309294
while (active_task_count_ > 0) { // Pop all due tasks, several might be due in the same tick

Tests/Time/scheduler_test.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,14 @@ class SchedulerTests : public ::testing::Test {
3232
}
3333
};
3434

35+
TEST_F(SchedulerTests, GetAt) {
36+
Scheduler::sorted_task_ids_ = 0xFEDCBA9876543210ULL;
37+
for(uint64_t i = 0; i < 16; i++) {
38+
uint64_t val = Scheduler::get_at(i);
39+
EXPECT_EQ(val, i);
40+
}
41+
}
42+
3543
TEST_F(SchedulerTests, FreeBitmap) {
3644
Scheduler::register_task(10, &fake_workload);
3745
EXPECT_EQ(Scheduler::free_bitmap_, 0xFFFF'FFFE);

0 commit comments

Comments
 (0)