// 设置clockevent周期处理函数
// 函数参数:
// broadcast,指示此设备是否为全局广播设备
// 调用路径:tick_setup_periodic->tick_set_periodic_handler
1.1 void tick_set_periodic_handler(struct clock_event_device *dev, int broadcast)
{
if (!broadcast)
dev->event_handler = tick_handle_periodic;
else
dev->event_handler = tick_handle_periodic_broadcast;
}
// clockevent周期处理函数(非广播设备)
// 函数任务:
// 1.执行周期任务
// 2.如果设备为单触发模式
// 2.1 重编程下一次事件到期时间
2.1 void tick_handle_periodic(struct clock_event_device *dev)
{
int cpu = smp_processor_id();
ktime_t next;
//执行do_timer更新全局事件,更新进程时间
tick_periodic(cpu);
//周期模式不需要手动设置下次到期时间,直接退出
if (dev->mode != CLOCK_EVT_MODE_ONESHOT)
return;
//计算下次到期时间
next = ktime_add(dev->next_event, tick_period);
for (;;) {
//重编程设备事件到期
if (!clockevents_program_event(dev, next, ktime_get()))
return;
//重新编程设备失败,说明已经经过一个tick周期,此时执行tick周期任务
if (timekeeping_valid_for_hres())
时间子系统13_clockevent周期触发模式
最新推荐文章于 2023-02-01 14:25:14 发布
本文详细介绍了Linux内核中时间子系统的时间事件处理,包括设置clockevent周期处理函数、周期任务执行、设备重编程以及广播设备的处理流程。核心函数如`tick_set_periodic_handler`、`tick_handle_periodic`和`tick_do_periodic_broadcast`协同工作,确保系统定时器的准确性和效率。
摘要由CSDN通过智能技术生成