时间子系统6_高分辨率定时器框架初始化

简介:
//	高分辨率定时器框架初始化
//	调用路径:start_kernel->hrtimers_init
//	函数任务:
//		1.创建cpu时钟基础
//		2.注册监听cpu状态变化
//		3.注册高分辨率模式下的定时器软中断
//	注:
//		1.高分辨率定时器框架的通用部分总是编译进内核
//		2.高分辨率定时器框架初始为未激活状态,由低分辨率定时器软中断中切换到高分辨率
1.1 void __init hrtimers_init(void)
{
	//通知clockevent设备管理,创建cpu时钟基础
	hrtimer_cpu_notify(&hrtimers_nb, (unsigned long)CPU_UP_PREPARE,
			  (void *)(long)smp_processor_id());
	//注册监听cpu 状态信息
	register_cpu_notifier(&hrtimers_nb);
	//高分辨率定时功能通过预处理编译进内核
#ifdef CONFIG_HIGH_RES_TIMERS
	//注册高分辨率模式下的定时器软中断
	open_softirq(HRTIMER_SOFTIRQ, run_hrtimer_softirq);
#endif
}
//	cpu状态监听控制块
2.1 static struct notifier_block __cpuinitdata hrtimers_nb = {
	.notifier_call = hrtimer_cpu_notify,
};

//	处理cpu状态变化
//	函数任务:
//		1.cpu up,初始化cpu的时钟基础
//		2.针对热插拔cpu
//			2.1 cpu dying、frozen,选择cpu,接管do_timer
//			2.2 cpu dead、frozen
//				2.2.1 通知clockevent设备管理,cpu dead
//				2.2.2 迁移dead cpu上的hrtimer到本cpu
3.1 static int __cpuinit hrtimer_cpu_notify(struct notifier_block *self,
					unsigned long action, void *hcpu)
{
	int scpu = (long)hcpu;

	switch (action) 
	{
		//cpu up,初始化此cpu的时钟基础
	case CPU_UP_PREPARE:
	case CPU_UP_PREPARE_FROZEN:
		init_hrtimers_cpu(scpu);
		break;
		//下列情况只针对热插拔cpu
#ifdef CONFIG_HOTPLUG_CPU
	case CPU_DYING:
	case CPU_DYING_FROZEN:
		//选择cpu接管do_timer
		clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DYING, &scpu);
		break;
	case CPU_DEAD:
	case CPU_DEAD_FROZEN:
		//通知clockevent设备管理,cpu dead
		clockevents_notify(CLOCK_EVT_NOTIFY_CPU_DEAD, &scpu);
		//迁移cpu上的定时任务到本cpu
		migrate_hrtimers(scpu);
		break;
#endif
	default:
		break;
	}
	return NOTIFY_OK;
}

//	初始化cpu的时钟基础
//	函数任务:
//		1.初始化REALTIME、MONOTOMIC两个时钟基础
//		2.更新时钟基础到期时间为KTIME_MAX,即没有hrtimer会到期
//		3.更新高分辨率定时器未激活状态
//	调用路径:init_hrtimers_cpu->init_hrtimers_cpu
4.1 static void __cpuinit init_hrtimers_cpu(int cpu)
{
	//per cpu时钟基础设备,用于维护该cpu的hrtimer
	struct hrtimer_cpu_base *cpu_base = &per_cpu(hrtimer_bases, cpu);
	int i;

	raw_spin_lock_init(&cpu_base->lock);
	//初始化cpu时钟基础
	for (i = 0; i < HRTIMER_MAX_CLOCK_BASES; i++)
		cpu_base->clock_base[i].cpu_base = cpu_base;
	hrtimer_init_hres(cpu_base);
}
4.2 static inline void hrtimer_init_hres(struct hrtimer_cpu_base *base)
{
	//下一次事件到期的绝对时间,KTIME_MAX表示没有hrtimer会到期
	base->expires_next.tv64 = KTIME_MAX;
	//高分辨率未激活状态
	base->hres_active = 0;
}


//	cpu时钟基础数据结构
//		提供两种时钟基础
//			CLOCK_MONOTOMIC,系统启动时从0开始,不会跳变,始终单调的运行
//			CLOCK_REALTIME,系统的实际时间,当系统时间改变时,会发生跳变
5.1 struct hrtimer_cpu_base {
	raw_spinlock_t			lock;
	struct hrtimer_clock_base	clock_base[HRTIMER_MAX_CLOCK_BASES];//当前cpu的时钟基础
#ifdef CONFIG_HIGH_RES_TIMERS
	ktime_t				expires_next;	//下一次事件到期的绝对时间
	int				hres_active;		//高分辨率状态
	int				hang_detected;		//最近一次hrtimer检测到挂起
	unsigned long			nr_events;	//中断事件总数
	unsigned long			nr_retries;	//有效的中断事件总数
	unsigned long			nr_hangs;	//中断挂起的次数
	ktime_t				max_hang_time;	//中断处理程序hrtimer_interrupt可花费的最大时间
#endif
}; 

//	时钟基础数据结构
//		hrtimer组织成红黑树的形式
5.2 struct hrtimer_clock_base {
	struct hrtimer_cpu_base	*cpu_base;
	clockid_t		index;			//用于区分CLOCK_MONOTONIC,CLOCK_REALTIME
	struct rb_root		active;		//所有活跃的hrtimer组织在红黑树中,active指向其树根
	struct rb_node		*first;		//第一个到期的hrtimer
	ktime_t			resolution;		//时钟基础的分辨率,纳秒为单位
	ktime_t			(*get_time)(void);	//读取该时钟基础的时间
	ktime_t			softirq_time;	//在软中断中开始运行hrtimer的时间
#ifdef CONFIG_HIGH_RES_TIMERS
	ktime_t			offset;			//时钟相对于单调时钟的偏移
#endif
};

目录
相关文章
|
3天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
271 116
|
18天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
12天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
663 219
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
350 34
Meta SAM3开源:让图像分割,听懂你的话
|
10天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1582 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
897 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
295 140