linux驱动学习(十一)之内核时钟

2024-06-12 13:20

本文主要是介绍linux驱动学习(十一)之内核时钟,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

需要板子一起学习的可以这里购买(含资料):点击跳转

一、内核时钟

1、内核时钟

内核时钟(Kernel Clock),也称为系统时钟(System Clock)或滴答时钟(Tick Timer),是操作系统内核中用于时间管理的一个重要组件。它提供了精确的时间基准,用于调度、延时等各种系统功能。

S5p6818 + linux ---->操作系统的时钟频率: HZ =1000 具体的参考值是由官方提供。

│ Symbol: HZ_100 [=n]                                                    
│ Type  : boolean                                                        
│ Prompt: 100 HZ                                                         
│   Defined at kernel/Kconfig.hz:19                                      
│   Depends on: <choice>                                                 
│   Location:                                                            
│     -> System Type                                                     
│       -> Timer frequency (<choice> [=y]) 

  ┌──────────── Timer frequency───────────┐
│  Use the arrow keys to navigate this window or press the             hotkey of                                                                     │  
│  the item you wish to select followed by the <SPACE         BAR>. Press                                                                │  
│  <?> for additional information about this option.                 │  
│ ┌────────────────────────────────────────────────────────────────┐ │  
│ │                          ( ) 100 HZ                            │ │  
│ │                          ( ) 250 HZ                            │ │  
│ │                          ( ) 300 HZ                            │ │  
│ │                          (X) 1000 HZ                         │ │  
│ │                                                                      │ │  

2、内核时钟频率与硬件平台有关

1) 找到linux内核源码中对S5P6818硬件初始化的源文件

kernel\arch\arm\mach-s5p6818\cpu.c

2) 找到机器宏

extern struct sys_timer nxp_cpu_sys_timer;
MACHINE_START(S5P6818, CFG_SYS_CPU_NAME) //S5P6818 4330.atag_offset	=  0x00000100,.fixup			=  cpu_fixup,.map_io			=  cpu_map_io,.init_irq		=  nxp_cpu_irq_init,.handle_irq 	=  gic_handle_irq,.timer			= &nxp_cpu_sys_timer,  //extern struct sys_timer nxp_cpu_sys_timer;.init_machine	=  cpu_init_machine,
#if defined CONFIG_CMA && defined CONFIG_ION.reserve        = cpu_mem_reserve,
#endif
MACHINE_ENDstruct sys_timer nxp_cpu_sys_timer = {.init	= timer_initialize, //关于时钟频率和定时器的入口
};static void __init timer_initialize(void)
{pr_debug("%s\n", __func__);timer_source_init(CFG_TIMER_SYS_TICK_CH); //timer0  1MHZtimer_event_init(CFG_TIMER_EVT_TICK_CH); //timer1   1MHZreturn;
}/*------------------------------------------------------------------------------* 	Timer List (SYS = Source, EVT = Event, WDT = WatchDog)*/
#define	CFG_TIMER_SYS_TICK_CH					0
#define	CFG_TIMER_EVT_TICK_CH					1

3、内核时钟频率

HZ:1000

时钟频率(HZ)对系统有哪些好处或者缺点?
        好处:HZ频率越高,则系统的计时就越精确,系统的实时性就越高
        缺点:系统处理的时钟频率越高,系统的担负也越重

二、关于HZ

 1、HZ本身就是一个全局的常数

#ifdef __KERNEL__
# define HZ		CONFIG_HZ	/* Internal kernel timer frequency */
# define USER_HZ	100		/* User interfaces are in "ticks" */
# define CLOCKS_PER_SEC	(USER_HZ)	/* like times() */
#else
# define HZ		100
#endif
CONFIG_HZ ---->是由配置内核时,设置的一个值    CONFIG_HZ ---->.config或者 GEC6818_defconfig -----> autoconf.h(该头文件是在编译内核时,自动根据配置生成的头文件)

该常数可以任何位置直接使用,比如:printk("HZ = %d",HZ);

2、修改该HZ的值 ---->配置内核

│ Symbol: HZ_100 [=n]                                                                                                                                                          
│ Type  : boolean                                                                                                                                                             
│ Prompt: 100 HZ                                                                                                                                                               
│   Defined at kernel/Kconfig.hz:19                                                                                                                                            
│   Depends on: <choice>                                                                                                                                                       
│   Location:                                                                                                                                                                  
│     -> System Type                                                                                                                                                           
│       -> Timer frequency (<choice> [=y]) 

三、jiffies

1、jiffies也是一个全局的常数。它是内核源码中的全局变量,记录了linux内核从启动到现在经过了多少个内核时间周期,1秒钟内,jiffies增加的HZ的次数。jiffies/HZ ---->linux系统启动到现在用了多少秒。

# define jiffies	raid6_jiffies()
static inline uint32_t raid6_jiffies(void)
{struct timeval tv;gettimeofday(&tv, NULL);return tv.tv_sec*1000 + tv.tv_usec/1000; //时间的值
}
//在内核源码中的应用:
unsigned long timeout = jiffies + 10*HZ/100;
/*jiffies -----> 表示当前时间10*HZ/100 ---> 表示时间间隔为多少秒  1/10s比如:5*HZ --->表示时间间隔为5秒timeout:表示时间间隔秒以后的时间,也就是超时时间
*/
if(jiffies > timeout){//超时
}else{//未超时
}

四、linux内核动态定时器

 linux内核动态定时器是依赖于内核时钟,周期是内核时钟的整数倍。动态定时器不是硬件定时器,跟硬件无关,利用内核动态定时器产生的时钟周期。

//[1] 定义动态定时器
static struct timer_list gec6818_timer;
void gec6818timer_function(unsigned long data)
{printk("jiffies = %ld\n",jiffies);printk("data = %ld\n",data);//[5] 修改时间mod_timer(&gec6818_timer,jiffies + 1*HZ);
}//[2] 初始化动态定时器
init_timer(&gec6818_timer);//[3]初始化成员
gec6818_timer.function = gec6818timer_function;//函数的地址:void (*function)(unsigned long);
gec6818_timer.expires = jiffies + 1*HZ; //设置超时时间
gec6818_timer.data = 10;//[4] 把动态定时器加入到内核中,
add_timer(&gec6818_timer);//[6] 把动态定时器从内核中删除
del_timer(&gec6818_timer);

觉得有帮助的话,打赏一下呗。。

           

这篇关于linux驱动学习(十一)之内核时钟的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1054334

相关文章

linux生产者,消费者问题

pthread_cond_wait() :用于阻塞当前线程,等待别的线程使用pthread_cond_signal()或pthread_cond_broadcast来唤醒它。 pthread_cond_wait() 必须与pthread_mutex 配套使用。pthread_cond_wait()函数一进入wait状态就会自动release mutex。当其他线程通过pthread

51单片机学习记录———定时器

文章目录 前言一、定时器介绍二、STC89C52定时器资源三、定时器框图四、定时器模式五、定时器相关寄存器六、定时器练习 前言 一个学习嵌入式的小白~ 有问题评论区或私信指出~ 提示:以下是本篇文章正文内容,下面案例可供参考 一、定时器介绍 定时器介绍:51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。 定时器作用: 1.用于计数系统,可

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题:第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

[word] word设置上标快捷键 #学习方法#其他#媒体

word设置上标快捷键 办公中,少不了使用word,这个是大家必备的软件,今天给大家分享word设置上标快捷键,希望在办公中能帮到您! 1、添加上标 在录入一些公式,或者是化学产品时,需要添加上标内容,按下快捷键Ctrl+shift++就能将需要的内容设置为上标符号。 word设置上标快捷键的方法就是以上内容了,需要的小伙伴都可以试一试呢!

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

AssetBundle学习笔记

AssetBundle是unity自定义的资源格式,通过调用引擎的资源打包接口对资源进行打包成.assetbundle格式的资源包。本文介绍了AssetBundle的生成,使用,加载,卸载以及Unity资源更新的一个基本步骤。 目录 1.定义: 2.AssetBundle的生成: 1)设置AssetBundle包的属性——通过编辑器界面 补充:分组策略 2)调用引擎接口API

RedHat运维-Linux文本操作基础-AWK进阶

你不用整理,跟着敲一遍,有个印象,然后把它保存到本地,以后要用再去看,如果有了新东西,你自个再添加。这是我参考牛客上的shell编程专项题,只不过换成了问答的方式而已。不用背,就算是我自己亲自敲,我现在好多也记不住。 1. 输出nowcoder.txt文件第5行的内容 2. 输出nowcoder.txt文件第6行的内容 3. 输出nowcoder.txt文件第7行的内容 4. 输出nowcode

Javascript高级程序设计(第四版)--学习记录之变量、内存

原始值与引用值 原始值:简单的数据即基础数据类型,按值访问。 引用值:由多个值构成的对象即复杂数据类型,按引用访问。 动态属性 对于引用值而言,可以随时添加、修改和删除其属性和方法。 let person = new Object();person.name = 'Jason';person.age = 42;console.log(person.name,person.age);//'J

【Linux进阶】UNIX体系结构分解——操作系统,内核,shell

1.什么是操作系统? 从严格意义上说,可将操作系统定义为一种软件,它控制计算机硬件资源,提供程序运行环境。我们通常将这种软件称为内核(kerel),因为它相对较小,而且位于环境的核心。  从广义上说,操作系统包括了内核和一些其他软件,这些软件使得计算机能够发挥作用,并使计算机具有自己的特生。这里所说的其他软件包括系统实用程序(system utility)、应用程序、shell以及公用函数库等

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备