Skip to content

Commit 3b3ba69

Browse files
committed
temp
1 parent d47dd73 commit 3b3ba69

File tree

8 files changed

+48
-188
lines changed

8 files changed

+48
-188
lines changed

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ ETL_INCLUDES += ./external/etl/include/etl/string_stream.h
1414
ETL_INCLUDES += ./external/etl/include/etl/to_string.h
1515
ETL_INCLUDES += ./external/etl/include/etl/delegate.h
1616
ETL_INCLUDES += ./external/etl/include/etl/unordered_map.h
17+
ETL_INCLUDES += ./external/etl/include/etl/priority_queue.h
1718

1819
# Source and header files
1920
APP_HEADER_PATHS += ./include

include/drivers/virtual_timer_controller.hpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,36 +3,50 @@
33
#include "nrf_timer.h"
44
#include "stdint.h"
55

6+
namespace edge::drivers {
67
extern "C" {
78
void TIMER3_IRQHandler(void);
89
}
910

10-
namespace edge::drivers {
11+
struct timer {
12+
uint32_t id;
13+
14+
void* callback;
15+
16+
uint32_t timer_value;
17+
18+
bool operator<(const timer& other) const { return timer_value < other.timer_value; }
19+
};
1120

1221
// Reserves Timer 3
1322
class VirtualTimerController {
1423
static constexpr nrf_timer_frequency_t TIMER_FREQUENCY = NRF_TIMER_FREQ_16MHz;
24+
inline static NRF_TIMER_Type* const TIMER = NRF_TIMER3;
25+
etl::priority_queue<timer, 32> timers_;
26+
27+
void trigger_ready_timers();
28+
bool has_ready_timer() const;
1529

1630
public:
17-
uint32_t read_timer();
31+
uint32_t read_timer() const;
1832

1933
uint32_t virtual_timer_start(uint32_t microseconds, void* callback);
2034

2135
void virtual_timer_cancel(uint32_t timer_id);
2236

2337
static VirtualTimerController& get();
2438

25-
~VirtualTimerController() = default;
26-
27-
inline static NRF_TIMER_Type* const TIMER = NRF_TIMER3;
28-
2939
uint32_t timer_start(uint32_t microseconds, void* callback);
3040

31-
void update_ll();
41+
VirtualTimerController(VirtualTimerController&) = delete;
42+
VirtualTimerController(VirtualTimerController&&) = delete;
43+
VirtualTimerController& operator=(VirtualTimerController&) = delete;
44+
VirtualTimerController& operator=(VirtualTimerController&&) = delete;
3245

33-
friend void ::TIMER3_IRQHandler(void);
46+
friend void TIMER3_IRQHandler(void);
3447

3548
private:
49+
~VirtualTimerController() = default;
3650
VirtualTimerController();
3751
};
3852

include/drivers/virtual_timer_linked_list.hpp

Lines changed: 0 additions & 26 deletions
This file was deleted.

include/userlib/syscalls.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,9 @@ void subscribe_ipc(const char* name, void (*callback)(int message));
2727

2828
void set_fault_handler(void (*callback)(FaultType));
2929

30-
uint32_t start_vtimer(void (*callback)(), uint32_t microseconds);
30+
uint32_t start_timer(void (*callback)(uint32_t), uint32_t microseconds);
3131

32-
void cancel_vtimer(uint32_t timer_id);
32+
void cancel_timer(uint32_t timer_id);
3333

3434
// We need a syscall for this because SVC will not be preempted by SysTick
3535
// Technically this is insecure - it's mostly for debugging
Lines changed: 17 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
#include "drivers/virtual_timer_controller.hpp"
22

3-
#include "drivers/virtual_timer_linked_list.hpp"
43
#include "nrf52833.h"
54
#include "scheduler/pending_process_callbacks.hpp"
65

@@ -9,10 +8,9 @@ namespace edge::drivers {
98
extern "C" {
109
void TIMER3_IRQHandler(void)
1110
{
12-
VirtualTimerController vtc = VirtualTimerController::get();
11+
VirtualTimerController& vtc = VirtualTimerController::get();
1312
vtc.TIMER->EVENTS_COMPARE[2] = 0;
14-
vtc.update_ll();
15-
return;
13+
vtc.trigger_ready_timers();
1614
}
1715
}
1816

@@ -26,31 +24,20 @@ VirtualTimerController::VirtualTimerController()
2624
NVIC_EnableIRQ(TIMER3_IRQn);
2725
}
2826

29-
void VirtualTimerController::update_ll()
27+
bool VirtualTimerController::has_ready_timer() const
3028
{
31-
__disable_irq();
32-
node_t* ptr = list_get_first();
33-
if (!ptr) {
34-
return;
35-
}
36-
uint32_t val = ptr->timer_value;
37-
uint32_t current_time = read_timer();
38-
while (val < current_time) {
39-
list_remove_first();
29+
return !timers_.empty() && timers_.top().timer_value <= read_timer();
30+
};
31+
32+
void VirtualTimerController::trigger_ready_timers()
33+
{
34+
while (has_ready_timer()) {
35+
timer t{timers_.top()};
36+
timers_.pop();
4037
PendingProcessCallbacks::get().add_ready_callback(
41-
0, reinterpret_cast<void (*)(int, int)>(ptr->callback)
38+
0, reinterpret_cast<void (*)(int, int)>(t.callback)
4239
);
43-
free(ptr);
44-
45-
ptr = list_get_first();
46-
if (!ptr) {
47-
break;
48-
}
49-
val = ptr->timer_value;
50-
current_time = read_timer();
5140
}
52-
__enable_irq();
53-
return;
5441
}
5542

5643
VirtualTimerController& VirtualTimerController::get()
@@ -59,78 +46,26 @@ VirtualTimerController& VirtualTimerController::get()
5946
return controller;
6047
}
6148

62-
uint32_t VirtualTimerController::read_timer()
49+
uint32_t VirtualTimerController::read_timer() const
6350
{
6451
TIMER->TASKS_CAPTURE[1] = 1;
6552
return TIMER->CC[1];
6653
}
6754

6855
uint32_t VirtualTimerController::timer_start(uint32_t microseconds, void* cb)
6956
{
70-
__disable_irq();
71-
node_t* node_ptr = new node_t;
7257
uint32_t curr_time = read_timer();
73-
uint32_t time = curr_time + microseconds;
74-
node_ptr->timer_value = time;
75-
76-
node_ptr->callback = cb;
58+
timers_.emplace(0, cb, curr_time + microseconds);
7759

78-
uint32_t node_id = (uint32_t)node_ptr;
79-
node_ptr->id = node_id;
80-
81-
node_ptr->freq = microseconds;
82-
list_insert_sorted(node_ptr);
83-
update_ll();
84-
85-
TIMER->CC[2] = list_get_first()->timer_value;
86-
87-
__enable_irq();
88-
return node_id;
60+
TIMER->CC[2] = timers_.top().timer_value;
61+
return 0;
8962
}
9063

9164
uint32_t VirtualTimerController::virtual_timer_start(uint32_t microseconds, void* cb)
9265
{
9366
return timer_start(microseconds, cb);
9467
}
9568

96-
void VirtualTimerController::virtual_timer_cancel(uint32_t timer_id)
97-
{
98-
__disable_irq();
99-
node_t* ptr = list_get_first();
100-
if (!ptr) {
101-
__enable_irq();
102-
return;
103-
}
104-
if (ptr->id == timer_id) {
105-
list_remove(ptr);
106-
delete ptr;
107-
update_ll();
108-
ptr = list_get_first();
109-
if (ptr) {
110-
TIMER->CC[2] = list_get_first()->timer_value;
111-
}
112-
else {
113-
TIMER->CC[2] = 0;
114-
}
115-
__enable_irq();
116-
return;
117-
}
118-
119-
while ((ptr->next != nullptr) && (ptr->id != timer_id)) {
120-
ptr = ptr->next;
121-
}
122-
123-
list_remove(ptr);
124-
delete ptr;
125-
update_ll();
126-
__enable_irq();
127-
ptr = list_get_first();
128-
if (ptr) {
129-
TIMER->CC[2] = list_get_first()->timer_value;
130-
}
131-
else {
132-
TIMER->CC[2] = 0;
133-
}
134-
}
69+
void VirtualTimerController::virtual_timer_cancel(uint32_t timer_id) {}
13570

13671
} // namespace edge::drivers

src/drivers/virtual_timer_linked_list.cpp

Lines changed: 0 additions & 64 deletions
This file was deleted.

src/user_programs/user_program_exception.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include <cstdio>
44

5-
void static callback(void)
5+
void static callback(uint32_t id)
66
{
77
edge::userlib::set_led(3, 3, true);
88
edge::userlib::debug_print("Callback!\n");
@@ -37,9 +37,9 @@ void exception_task(void)
3737
set_fault_handler(fault_handler);
3838

3939
trigger_faults();
40-
start_vtimer(&callback, 100000);
41-
auto id = start_vtimer(&callback, 100000);
42-
cancel_vtimer(id);
40+
auto id = start_timer(&callback, 1000000);
41+
// cancel_timer(id);
42+
id = start_timer(&callback, 2000000);
4343

4444
set_led(2, 2, true);
4545

src/userlib/syscalls.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ int USER_CODE get_time_us()
8585
RETURN_REGISTER(r0);
8686
}
8787

88-
uint32_t USER_CODE start_vtimer(void (*callback)(), uint32_t microseconds)
88+
uint32_t USER_CODE start_timer(void (*callback)(uint32_t), uint32_t microseconds)
8989
{
9090
SET_REGISTER(r0, (int)drivers::DriverCommand::TIMER_START);
9191
SET_REGISTER(r1, (int)callback);
@@ -94,7 +94,7 @@ uint32_t USER_CODE start_vtimer(void (*callback)(), uint32_t microseconds)
9494
RETURN_REGISTER(r0);
9595
}
9696

97-
void USER_CODE cancel_vtimer(uint32_t timer_id)
97+
void USER_CODE cancel_timer(uint32_t timer_id)
9898
{
9999
SET_REGISTER(r0, (int)drivers::DriverCommand::TIMER_CANCEL);
100100
SET_REGISTER(r1, (int)timer_id);

0 commit comments

Comments
 (0)