SimpleKernel 1.17.0
Loading...
Searching...
No Matches
timer.cpp File Reference
#include <cpu_io.h>
#include "arch.h"
#include "basic_info.hpp"
#include "interrupt.h"
#include "kernel.h"
#include "kernel_fdt.hpp"
#include "task_manager.hpp"
Include dependency graph for timer.cpp:

Go to the source code of this file.

Typedefs

using InterruptDelegate = InterruptBase::InterruptDelegate
 

Functions

auto TimerInitSMP () -> void
 从核的定时器初始化
 
auto TimerInit () -> void
 初始化定时器
 

Typedef Documentation

◆ InterruptDelegate

Definition at line 14 of file timer.cpp.

Function Documentation

◆ TimerInit()

auto TimerInit ( ) -> void

初始化定时器

Precondition
InterruptInit 已完成
Postcondition
定时器中断已启用,系统 tick 开始计数

Definition at line 47 of file timer.cpp.

47 {
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}
static constexpr size_t kPpiBase
Definition gic.h:23
auto GetCurrentCoreId() -> size_t
Definition cpu_io.h:26
Here is the call graph for this function:
Here is the caller graph for this function:

◆ TimerInitSMP()

auto TimerInitSMP ( ) -> void

从核的定时器初始化

Precondition
主核已完成 TimerInit,从核已完成 InterruptInitSMP
Postcondition
从核的定时器中断已启用

Definition at line 35 of file timer.cpp.

35 {
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}
Here is the call graph for this function: