SimpleKernel 1.17.0
Loading...
Searching...
No Matches
timer.cpp
Go to the documentation of this file.
1
5#include <cpu_io.h>
6
7#include "arch.h"
8#include "basic_info.hpp"
9#include "interrupt.h"
10#include "kernel.h"
11#include "kernel_fdt.hpp"
12#include "task_manager.hpp"
13
15namespace {
17uint64_t interval{0};
19uint64_t timer_intid{0};
20
27auto TimerHandler(uint64_t /*cause*/, cpu_io::TrapContext* /*context*/)
28 -> uint64_t {
29 cpu_io::CNTV_TVAL_EL0::Write(interval);
30 TaskManagerSingleton::instance().TickUpdate();
31 return 0;
32}
33} // namespace
34
35auto TimerInitSMP() -> void {
36 InterruptSingleton::instance().Ppi(timer_intid, cpu_io::GetCurrentCoreId());
37
38 cpu_io::CNTV_CTL_EL0::ENABLE::Clear();
39 cpu_io::CNTV_CTL_EL0::IMASK::Set();
40
41 cpu_io::CNTV_TVAL_EL0::Write(interval);
42
43 cpu_io::CNTV_CTL_EL0::ENABLE::Set();
44 cpu_io::CNTV_CTL_EL0::IMASK::Clear();
45}
46
47auto TimerInit() -> void {
48 // 计算 interval
49 interval = BasicInfoSingleton::instance().interval / SIMPLEKERNEL_TICK;
50
51 // 获取定时器中断号
52 timer_intid = KernelFdtSingleton::instance()
53 .GetAarch64Intid("arm,armv8-timer")
54 .value() +
56
57 InterruptSingleton::instance().RegisterInterruptFunc(
58 timer_intid, InterruptDelegate::create<TimerHandler>());
59
60 InterruptSingleton::instance().Ppi(timer_intid, cpu_io::GetCurrentCoreId());
61
62 cpu_io::CNTV_CTL_EL0::ENABLE::Clear();
63 cpu_io::CNTV_CTL_EL0::IMASK::Set();
64
65 cpu_io::CNTV_TVAL_EL0::Write(interval);
66
67 cpu_io::CNTV_CTL_EL0::ENABLE::Set();
68 cpu_io::CNTV_CTL_EL0::IMASK::Clear();
69}
InterruptBase::InterruptDelegate InterruptDelegate
auto TimerInitSMP() -> void
从核的定时器初始化
Definition timer.cpp:35
auto TimerInit() -> void
初始化定时器
Definition timer.cpp:47
static constexpr size_t kPpiBase
Definition gic.h:23
etl::delegate< uint64_t(uint64_t, cpu_io::TrapContext *)> InterruptDelegate
类型安全的中断处理委托
auto GetCurrentCoreId() -> size_t
Definition cpu_io.h:26