工作笔记

分析start_kernel函数 位于init/main.c


 

kernel/irq/handle.c 
中断描述符的初始化在early_irq_init中进行
中断描述符的action没有进行初始化默认为NULL,可以调用request_irq来进行注册


 

start_kernel函数中调用time_init函数
在time_init------>plat_time_init------->ra_systick_clockevent_init
在ra_systick_clockevent_init中对时钟事件结构体clock_event_device进行初始化(即cd=&ra_systick),其中irq = MIPS_CPU_IRQ_BASE+cp0_compare_irq
ra_systick_clockevent_init----->clockevents_register_device(cd)------>clockevents_do_notify(CLOCK_EVT_NOTIFY_ADD,dev)
通过clockevent_do_notify触发框架层事先注册好的通知链,其实就是调用了tick_notify函数.
在tick_notify函数中调用了tick_check_new_device(dev)(检查是否需要更换clock_event_device,td=&per_cpu(tick_cpu_device,cpu)得到该CPU的tick_device)---->tick_setup_device---->tick_setup_oneshot()----->tick_setup_periodic---->tick_set_periodic_handler
在tick_set_periodic_handler中dev->event_handler = tick_handle_periodic
tick_handle_periodic----->tick_periodic
在tick_periodic函数中完成
如果当前cpu负责更新时间,则通过do_timer进行以下操作:
更新jiffies_64变量;
更新墙上时钟;
每10个tick,更新一次cpu的负载信息;
调用update_peocess_times,完成以下事情:
更新进程的时间统计信息;
触发TIMER_SOFTIRQ软件中断,以便系统处理传统的低分辨率定时器;
检查rcu的callback;
通过scheduler_tick触发调度系统进行进程统计和调度工作;
tick_periodic---->run_local_timers()----->hrtimer_run_queues


在软中断中会进行以下动作
hrtimer_run_pending函数接着通过tick_check_oneshot_change判断系统是否可以切换到高精度模式,
最终在tick_init_highres中通过tick_switch_to_oneshot将低精度tick_device转换成高精度。
转换的过程中貌似只是替换了回调函数成hrtimer_interrupt和设置tick_device的触发模式。修改中断触发时间在哪里修改的?
clockevents_set_mode函数修改了mult值


分析clocksource中的mult和shift作用


 

分析ralink/time.c中的clockevent_set_clock函数,分析mult和shift的计算方式
mult和shift只是用于定时器计数和时间转换的参数值。与中断触发时间无关


 

在hrtimer_interrupt函数中dev->next_event.tv64 = KTIME_MAX;
这里重新设定了clock_event_device的中断触发时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值