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

news2024/11/15 17:58:16

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

一、内核时钟

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_END


struct 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  1MHZ
	timer_event_init(CFG_TIMER_EVT_TICK_CH); //timer1   1MHZ

	return;
}


/*------------------------------------------------------------------------------
 * 	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);

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

           

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1814334.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用LANGCHAIN和GEMINI构建AI应用程序

借助这些先进技术&#xff0c;您可以生成文本、分析图像并实现多模态 AI 交互。 LangChain 和 Google 的 Gemini API 是什么&#xff1f; LangChain&#xff1a;构建 AI 应用程序的弹性框架 LangChain 是一个强大且灵活的框架&#xff0c;可以简化 AI 应用程序的开发。它提供…

绝对新惊喜:4款王者级别的办公软件,免费又实用

工作里有那么多规矩&#xff0c;但效率绝对是重中之重&#xff0c;选对了好软件&#xff0c;工作就能更高效&#xff0c;下班也能更早回家。 要是你也想做个“时间管理小能手”&#xff0c;下面这4款超好用的办公软件&#xff0c;你可千万别错过&#xff01; Gitmind 现在很…

奇绩创坛 2024 年春季创业营路演

奇绩创坛 2024 年春季创业营路演 奇绩创坛在北京中关村举办的 2024 年春季创业营路演 奇绩创坛在北京中关村举办的 2024 年春季创业营路演 RWKV 元始智能的COO罗璇在会议上详细分享了RWKV的创新模型架构、最新进展以及当前的研究方向。 目前&#xff0c;RWKV架构已经推出了最…

五、LVS原理

目录 5.1 LVS 相关原理 5.1.1 LVS集群的体系结构以及特点 5.1.1.1 LVS简介 5.1.1.2 LVS体系结构 5.1.1.3 LVS相关术语 5.1.1.4 LVS工作模式 5.1.1.5 LVS调度算法 5.1.2 LVS-DR集群介绍 5.1.2.1 LVS-DR模式工作原理 5.1.2.2 LVS-DR模式应用特点 5.1.2.3 LVS-DR模式ARP抑制 5.1…

使用Transformer进行抄袭检测

动机 在许多行业中&#xff0c;尤其是在学术界&#xff0c;抄袭是一个重大问题。随着互联网和开放信息的兴起&#xff0c;这种现象甚至变得更加严重&#xff0c;任何人都可以通过点击访问特定主题的任何信息。 基于这一观察&#xff0c;研究人员一直在尝试使用不同的文本分析…

生成高保真度3D数字人化身:打造你的专属虚拟形象

在数字化时代,我们的虚拟形象正变得越来越重要。现在,一项前沿技术正将这一领域推向新的高度——生成高保真度的3D数字人化身。这项技术不仅可以将你的形象以3D形式呈现,更能赋予它生命,让你的虚拟形象拥有丰富的表情和动作。 一、技术简介 这项技术就像是一个高级的3D照…

最简单的方法,连续打印多个空格

1、大家都知道&#xff0c;c语言中&#xff0c;我们打印语句时&#xff0c;如果使用\t来控制打印间隔&#xff0c;可能会出现排版错乱问题&#xff0c;所以一般都会使用空格来控制间隔&#xff0c;这样不管在哪个工具上面显示&#xff0c;打印的信息都不会错乱。 2、控制间隔的…

fdtd(时域有限差分)仿真

FDTD Solutions 是一款非常好用的微纳光学设计工具。该软件提供了丰富的设计功能&#xff0c;支持 CMOS 图像传感器&#xff0c;OLED 和液晶&#xff0c;表面计量&#xff0c;表面等离子体&#xff0c;石墨烯&#xff0c;太阳能电池&#xff0c;集成光子组件&#xff0c;超材 料…

Offline :Adversarially Trained Actor Critic for Offline Reinforcement Learning

ICML 2022 paper code 基于Stackelberg游戏博弈形式&#xff0c;对抗的学习actor与critic Intro Method 将离线RL的Stackelberg博弈表述为一个双层优化问题&#xff0c;学习者策略π∈Π为领导者&#xff0c;批评家f∈F为跟随者: π ^ ∗ ∈ argmax ⁡ π ∈ I I L μ ( π…

JVM如何确定方法调用

方法调用并不等同于方法执行&#xff0c;方法调用阶段唯一的任务就是确定调用哪一个方法&#xff0c;不涉及方法内部的具体运行过程。在程序运行时&#xff0c;进行方法调用是最普遍、最频繁的操作&#xff0c;但Class文件的编译过程中不包含传统编译中的连接步骤&#xff0c;一…

破解动态网页:如何用JavaScript获取自动消失的联想词

前几天在做数据分析时&#xff0c;我尝试获取某网站上输入搜索词后的联想词&#xff0c;输入搜索词后会弹出一个显示联想词的框。有趣的是&#xff0c;当我尝试通过按F12定位这个弹框在HTML中的位置时&#xff0c;输入框失去焦点后&#xff0c;联想词弹框就自动消失了。我观察到…

UnityAPI学习之Animator的基本使用

动画与动画控制器 示例1&#xff1a; 创建Animator对动画控制器进行统一管理&#xff0c;在Gris中创建Animator组件&#xff0c;并对其中的Controller属性进行赋值 在进行动画创作前&#xff0c;需先将图片的Texture Type属性改为Sprite(2D and UI) 再将一系列图片拖入Gris物…

nss刷题(4)

1、[SWPUCTF 2021 新生赛]easyrce <?php error_reporting(0); highlight_file(__FILE__); if(isset($_GET[url])) { eval($_GET[url]); } ?> if(isset($_GET[url])) isset函数用来检测url变量是否存在&#xff1b;$_GET函数获取变量数据 eval($_GET[url]); eval函数用…

基于Java+Swing+mysql幼儿园信息管理系统V2

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

和鲸101领航北中医:助力健康医疗AI实验室建设,培养交叉数据人才

2024 年 3 月开学季&#xff0c;北京中医药大学&#xff08;简称“北中医”&#xff09;的健康医疗人工智能实验室迎来了正式投入使用后的第一堂课。除了配备全新的桌椅和尖端的硬件服务器外&#xff0c;实验室还引入了先进的人工智能实训平台&#xff0c;为大数据管理与应用专…

Linux1(介绍与基本命令)

目录 一、初始Linux 1. Linux的起源 2. Linux是什么&#xff1f; 3. Linux内核版本 4. Linux的应用 5. 终端 6. Shell 7. Linux目录结构 二、基本命令 1. 基本的命令格式 2. shutdown 关机命令 3. pwd 当前工作目录 4. ls 查看目录内容 5. cd 改变工作目录 …

【制作100个unity游戏之27】使用unity复刻经典游戏《植物大战僵尸》,制作属于自己的植物大战僵尸随机版和杂交版10(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言使用DoTween优化阳光生成和拾取效果拾取阳光优化生成阳光优化 场景加载进度条新增加载场景Loading&#xff0c;绘制开始界面绘制菜单界面滑动滚轮一直滚动 场景加载源码结束语 前言 本节主要实现使用DoTween优化阳光生成和拾取…

Linux运维实用小脚本,登录即自动显示系统信息

systeminfo.sh #!/bin/bash # systeminfo.sh # by 运维朱工 # site&#xff1a;bash.lutixia.cn ##################################### 获取IP地址和主机名 IP_ADDR$(hostname -I | cut -d -f1) HOSTNAME$(hostname)# CPU负载信息&#xff1a; cpu_load() {echo -e "\…

JAVA基础--MAVEN

MAVEN的认识 什么是MAVEN Maven是一个项目构建及管理工具&#xff0c;开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c; Maven 使用了一个标准的目录结构在不同开发工具中也能实现项目结构的统一。 统一项目结构 Maven提供了清理&#xff0c;编译&a…

【二进制部署k8s-1.29.4】十三、metrics-server的安装部署

文章目录 简介 一.metrics-server的安装 简介 本章节主要讲解metrics-server的安装&#xff0c;metrics-server主要是用于采集k8s中节点和pod的内存和cpu指标&#xff0c;在观察几点和pod的实时资源使用情况还是比较有用的&#xff0c;如果需要记录历史信息&#xff0c;建议采用…