1 | #define jiffies_to_clock_t(x) ((x)/(HZ/USER_HZ)); |
1.获得xtime_lock锁,以便对访问jiffies_64和墙上时间xtime进行保护。 2.需要时应答或重新设置系统时钟。 3.周期性地使用墙上时间更新实时时钟。 4.调用体系结构无关的时间例程:do_timer(). 中断服务程序主要通过调用与体系结构无关的例程do_timer()执行下面的工作: 1.给jiffies_64变量加1. 2.更新资源消耗的统计值,比如当前进程所消耗的系统时间和用户时间。 3.执行已经到期的动态定时器. 4.执行scheduler_tick()函数. 5.更新墙上时间,该时间存放在xtime变量中. 6.计算平均负载值. |
1 2 3 4 5 6 | void do_timer(struct pt_regs *regs) { jiffies_64++; update_process_times(user_mode(regs)); update_times(); } |
1 2 3 4 5 6 7 8 9 | void update_process_times(int user_tick) { struct task_struct *p=current; int cpu=smp_processor_id(); int system=user_tick^1; updata_one_process(p,user_tick,system,cpu); run_local_timers(); scheduler_tick(user_tick,system); } |
1 2 | p->utime = user; p->stime = system; |
1 2 3 4 5 6 7 8 9 10 | void update_times(void) { unsigned long ticks; if(ticks){ wall_jiffies += ticks; update_wall_time(ticks); } last_time_offset = 0; calc_load(ticks); } |
1 2 3 4 | struct timespec{ time_t tv_sec; //秒,存放自1970年7月1日(UTC)以来经过的时间,1970年7月1日称为纪元 long tv_nsec; //纳秒,记录自上一秒开始经过的纳秒数 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | asmlinkage long sys_gettimeofday(struct timeval __user *tv, struct timezone __user *tz) { if (likely(tv != NULL)) { struct timeval ktv; do_gettimeofday(&ktv); if (copy_to_user(tv, &ktv, sizeof(ktv))) return -EFAULT; } if (unlikely(tz != NULL)) { if (copy_to_user(tz, &sys_tz, sizeof(sys_tz))) return -EFAULT; } return 0; } |
1 2 3 4 5 6 7 8 9 | struct timer_list { struct list_head entry; unsigned long expires; spinlock_t lock; unsigned long magic; void (*function)(unsigned long); unsigned long data; struct tvec_t_base_s *base; }; |
1.创建定时器:struct timer_list my_timer; 2.初始化定时器:init_timer(&my_timer); 3.根据需要,设置定时器了: my_timer.expires = jiffies + delay; my_timer.data = 0; my_timer.function = my_function; 4.激活定时器:add_timer(&my_timer); |
1 2 3 4 | void run_local_timers(void) { raise_softirq(TIMER_SOFTIRQ); } |
1 2 3 | unsigned long delay = jiffies+10; //10个节拍 while(time_before(jiffies,delay)) cond_resched(); |
1 2 3 | unsigned long delay = jiffies+10; //10个节拍 while(time_before(jiffies,delay)) cond_resched(); |
1 2 | void udelay(unsigned long usecs); void mdelay(unsigned long msecs); |
1 2 | set_current_state(TASK_INTERRUPTIBLE); schedule_timeout(s*HZ); |
1 2 3 4 | void process_timeout(unsigned long data) { wake_up_process((task_t *)data); } |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |