10.8、驱动开发 -- 系统时钟

  • 时间:
  • 来源:互联网
  • 文章标签:

在这里插入图片描述

  • 时间:
    绝对时间: 2020.6.9 23:59:59
    相对时间: 时间计量取决于 参考点 相对时间

  • 内核是如何计时:

int jiffies; 一开机jiffies=0, 每隔一定的时间jiffies++;一秒钟,jiffies累加多少次呢??? 精确度(不高)x86 1000次/s 每次1ms 1msARM9 100次/s 10ms 10msARM-A53 200-500次/s不同的cpu 一秒钟jiffies累加的次数,是不确定的. 为了统一,内核 定义了 HZ这个宏.HZ 表示, 当前平台,jiffies一秒钟累加的次数.内核的时间管理用到了 ##一个 硬件定时器###,对他进程编程,让他一秒钟来HZ次中断,在中断中jiffies++;

  • 计算下面的耗时: 移植,jiffies一秒钟累加HZ次.
    T1=jiffies;
    do_something();
    T2=jiffies;
    请求 do_somethign()函数的耗时 秒/毫秒分别表示答案: (T2-T1)/HZ sec
/*****************************************************************
*   Copyright (C) 2019 Sangfor Ltd. All rights reserved.
*   
*   文件名称:timer.c
*   创 建 者:yinfei-hu
*   创建日期:
*   功能描述:
*
*****************************************************************/
#include <linux/kernel.h>
#include <linux/module.h>

#include <linux/timer.h>

/*
	定时器 驱动编写
	1.定义并初始化  定时器对象
	
	struct timer_list {
		unsigned long expires;		超时时间

		void (*function)(unsigned long  data);  方法
		unsigned long data;			私有数据
	};

		11.未来时间expire
		22. 私有数据

	struct timer_list timer_obj;
	init_timer(struct timer_list  *timer);
	
	timer_obj.expires = xxx;
	timer_obj.data = yyy;
	timer_obj.function = mm_fun;


	2.将定时器对象添加到 内核中
	void add_timer(struct timer_list * timer);

	到达指定的时间后,定时器fun被执行, 然后定时器对象被删除.
	定时器只能被执行一次

	3.删除定时器
		如果定时器被执行,则自动被删除

		如果没有被执行,则可以手工删除 
		del_timer(struct timer_list *timer);
	
*/

struct global_data {

	int No;
	struct timer_list timer_obj;	
};

struct global_data gstruct;

void timer_function(unsigned long  data)
{

	struct global_data *pt_gstruct = (struct global_data *)data;

	printk("%s->%d No %d\n",__func__,__LINE__,pt_gstruct->No);

	pt_gstruct->timer_obj.expires = jiffies + HZ/2;
	add_timer(&pt_gstruct->timer_obj);
	
}


int module_fun_init(void)
{

	init_timer(&gstruct.timer_obj);
	gstruct.timer_obj.expires = jiffies+HZ;
	gstruct.timer_obj.data = (long)&gstruct;
	gstruct.timer_obj.function = timer_function;

	gstruct.No = 1234;


	add_timer(&gstruct.timer_obj);
	
	printk("%s->%d\n",__FUNCTION__,__LINE__);
	return 0;
}

void  module_fun_exit(void)
{
	del_timer(&gstruct.timer_obj);

	printk("%s->%d\n",__FUNCTION__,__LINE__);
}

/*    内核模块入口    module_init 里面的参数,指向谁,谁就是模块入口函数*/
module_init(module_fun_init);
/*    内核模块出口    module_exit 里面的参数,指向谁,谁就是模块出口函数*/
module_exit(module_fun_exit);

/*模块作者信息*/
MODULE_AUTHOR("YinFei.Hu <hu_yin_fei@163.com>");
/*模块信息*/
MODULE_DESCRIPTION(" system timer driver");
/*告诉内核愿意遵守gpl协议*/
MODULE_LICENSE("GPL");

本文链接http://www.taodudu.cc/news/show-83134.html