Linux内核开发之中断与时钟(四)

时钟中断(1) 在所有外部中断中,时钟中断起着特殊的作用。因为计算机是以精确的时间进行数值运算的数据处理的,最基本的时间单元是时钟周期,例如取指令,执行指令,存取内存等,我们将要讨论的是操作系统建立的时间系统,这个时间系统是整个操作系统活动的动力。 阅读详情

“小王,小王,今天可是这一章节最后一节了,知识点咱们前边都讲过了,今天主要是给你用前边的东西讲一个实际例子---秒字符设备驱动程序”

  这个驱动程序会在被打开的时候初始化一个定时器并将其添加到内核定时器链表中,每秒输出一次当前的jiffies,这意味着,定时器处理函数中每次都要修改新的expires。不多说了,看代码分析:

#include …//必要的系统头文件
#define SECOND_MAJOR 252    /*预设的second的主设备号*/

static int second_major = SECOND_MAJOR;
struct second_dev   /*second设备结构体*/ 
{
  struct cdev cdev; /*cdev结构体*/
  atomic_t counter;/* 一共经历了多少秒?*/
  struct timer_list s_timer; /*设备要使用的定时器*/
};
struct second_dev *second_devp; /*设备结构体指针*/

static void second_timer_handle(unsigned long arg)   /*定时器处理函数*/ 
{
  mod_timer(&second_devp->s_timer,jiffies + HZ);
  atomic_inc(&second_devp->counter);
  printk(KERN_NOTICE "current jiffies is %ld\n", jiffies);
}
int second_open(struct inode *inode, struct file *filp)   /*文件打开函数*/ 
{
  /*初始化定时器*/
  init_timer(&second_devp->s_timer);
  second_devp->s_timer.function = &second_timer_handle;
  second_devp->s_timer.expires = jiffies + HZ;
  
  add_timer(&second_devp->s_timer); /*添加(注册)定时器*/
  
  atomic_set(&second_devp->counter,0); //计数清0
  return 0;
}
int second_release(struct inode *inode, struct file *filp)  /*文件释放函数*/ 
{
  del_timer(&second_devp->s_timer);
  return 0;
}

static ssize_t second_read(struct file *filp, char __user *buf, size_t count, loff_t *ppos)   /*globalfifo读函数*/ 
{  
  int counter;
  
  counter = atomic_read(&second_devp->counter);
  if(put_user(counter, (int*)buf))
  	return - EFAULT;
  else
  	return sizeof(unsigned int);  
}

static const struct file_operations second_fops =    /*文件操作结构体*/ 
{
  .owner = THIS_MODULE, 
  .open = second_open, 
  .release = second_release,
  .read = second_read,
};

static void second_setup_cdev(struct second_dev *dev, int index)   /*初始化并注册cdev*/ 
{
  int err, devno = MKDEV(second_major, index);

  cdev_init(&dev->cdev, &second_fops);
  dev->cdev.owner = THIS_MODULE;
  dev->cdev.ops = &second_fops;
  err = cdev_add(&dev->cdev, devno, 1);
  if (err)
    printk(KERN_NOTICE "Error %d adding LED%d", err, index);
}

int second_init(void)   /*设备驱动模块加载函数*/ 
{
  int ret;
  dev_t devno = MKDEV(second_major, 0);

  /* 申请设备号*/
  if (second_major)
    ret = register_chrdev_region(devno, 1, "second");
  else  /* 动态申请设备号 */
  {
    ret = alloc_chrdev_region(&devno, 0, 1, "second");
    second_major = MAJOR(devno);
  }
  if (ret < 0)
    return ret;
  /* 动态申请设备结构体的内存*/
  second_devp = kmalloc(sizeof(struct second_dev), GFP_KERNEL);
  if (!second_devp)    /*申请失败*/
  {
    ret =  - ENOMEM;
    goto fail_malloc;
  }
  memset(second_devp, 0, sizeof(struct second_dev));
  second_setup_cdev(second_devp, 0);
  return 0;

  fail_malloc: unregister_chrdev_region(devno, 1);
}

void second_exit(void)   /*模块卸载函数*/ 
{
  cdev_del(&second_devp->cdev);   /*注销cdev*/
  kfree(second_devp);     /*释放设备结构体内存*/
  unregister_chrdev_region(MKDEV(second_major, 0), 1); /*释放设备号*/
}
MODULE_AUTHOR("hanyan225");
MODULE_LICENSE("Dual BSD/GPL");
module_param(second_major, int, S_IRUGO);
module_init(second_init);
module_exit(second_exit);
下面是测试程序:
#include ..//必要的头文件
main()
{
  int fd;
  int counter = 0;
  int old_counter = 0;
  
  fd = open("/dev/second", O_RDONLY);   /*打开/dev/second设备文件*/ 
  if (fd !=  - 1)
  {
    while (1)
    {
      read(fd,&counter, sizeof(unsigned int));//读目前经历的秒数
      if(counter!=old_counter)
      {	
      	printf("seconds after open /dev/second :%d\n",counter);
      	old_counter = counter;
      }	
    }    
  }
  else
  {
    printf("Device open failure\n");
  }
}
当我们编译完驱动程序,并运行了测试程序后,会看到应用程序不断输出自打开/dev/second以来经历的秒数。如下:
#./test
seconds after open /dev/second 1
seconds after open /dev/second 2
..
..
再带一个中断,看看内核输出操作如下:
#tar –f /var/logs/message
current jiffies is 18569
current jiffies is 18669

current jiffies is 18769
..

..

 

“小王,Linux设备驱动之中断与时钟也算说完了,告一段落了,也不知道你明白没,没明白,也没关系,不是有我吗,只是不要一早吵醒我就好,下次我们就要开始系统内存方面的东西了…”我说。

“好,小涛哥,我好好看看,不懂就问你,呵呵..”小王银铃般笑着还伴着怪脸,真是让人…

Linux 时钟中断详解 在Linux的0号中断是一个定时器中断。在固定的时间间隔都发生一次中断,也是说每秒发生该中断的频率都是固定的。该频率是常量HZ,该值一般是在100 ~ 1000之间。该中断的作用是为了定时更新系统日期和时间,使系统时间不断地得到跳转。另外该中断的中断处理函数除了更新系统时间外,还需要更新本地CPU统计数。指的是调用scheduler_tick递减进程的时间片,若进程的时间片递减到0,进程则被调度出去而放弃CPU使用权。 时钟中断的产生 Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这 阅读详情

相关推荐

Linux之时钟中断

from:深入分析Linux内核源码(http://oss.org.cn/kernel-book/)  时钟中断的产生      Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入CPU,就可以引发一个中断请求信号,我们就把它叫做时钟中断。 “时钟中断”是特别重要的一个中断,因为整个操作系统的活动都受到它的激励。系统利用时钟中断维持系统时间、促使环境的切换,以

Atlas2013的专栏 1万+

(二)STM32中断系统分析

STM32中断系统分析

m0_65010117的博客 359

Linux 时钟中断处理(一)

最近想研究下Linux下的时钟中断,因为时钟中断算是一个操作系统下最频繁的中断事件了吧(个人认为)。 以4.5 x86_64 Linux内核为例。 面对庞大的代码量,无从下手啊。不如从中断号看起吧微笑Linux 源码中有这样的定义(arch/x86/include/asm/irq_vectors.h): #define LOCAL_TIMER_VECTOR 0xef 如果没猜错的话,应该就是Linux下的时钟中断向量了(0xEF=239)。

bgao86的博客 1万+

无招胜有招-代码解读阿里开源芯片平台无剑100

今年以来我国IT厂商都在A lot的底层平台建设方面可谓是捷报频传,在操作系统方面有如像腾讯的Tiny OS、阿里的Ali Things OS3.0纷纷进行了开源;在数据库方面国产的时序库TdEngine在开源后也在Github上占据榜首位很久,在芯片方面阿里平头哥半导体公司也有很多大手笔,先是在今年7月底发布的玄铁910处理器,这款CPU基于RISC-V的基础架构,有16个core,使用12nm...

Python爱好者的专栏 4826

Linux内核的时钟中断机制(01)

此贴转自http://www.linuxforum.net/forum/gshowflat.php?Cat=&Board=driver&Number=385219&page=0&view=collapsed&sb=5&o=all&fpart=第七章 Linux内核的时钟中断 (By 詹荣开,NUDT) opyright © 2003 by 詹荣开 E-mail:zhanrk@sohu.c

huanghaibin的专栏 1210

细说Linux内核中断架构

中断和异常 一、什么是中断?         中断通常被定义为一个事件,该事件改变处理器执行的指令顺序。这样的事件与CPU芯片内外部硬件电路产生的电信号相对应。         中断通常分为同步中断和异步中断: 2  同步中断是当指令执行时由CPU控制单元产生的,之所以称为同步,是因为只有在一条指令终止执行后CPU才会发出中断。         ◎ 异步中断是由其他硬件设备依照CPU时钟

kerneltea 4484

嵌入式Linux——驱动调试:修改内核代码来定位系统僵死问题

简介:     在驱动运行时可能会碰到系统因为某些不明原因而僵死的问题。而本文主要就是介绍通过修改内核代码来将僵死的位置找出。    Linux内核:linux-2.6.22.6  所用开发板:JZ2440 V3(S3C2440A) 声明:     本文是看完韦东山老师视频后所做的课后总结。文中主要内容还是老师视频中所讲的。但有部分内容是看其他网友博客总结。 内核时钟中断:    ...

静祥阁 1004

射频工程师笔记---射频通信基础

回顾一下移动通信技术的发展,其实是互联网和通信技术的融合过程。在这个过程中,很多应用都在不断加入其中。比如计算机跟通信的融合产生了互联网、互联网跟手机的融合带来了移动互联网。手机可以看杂志、看视频、听音乐,于是又出现了内容服务产业;再后来,电视音箱等设备也能联网,于是网络跟家电又产生了融合。所以应用的出现总是在融合其他产业。在1995年,比尔·盖茨在《未来之路》一书中首次提出:在未来...

多年硬件从业经历,热爱学习,记录生活! 2万+

嵌入式Linux内核深度对比:i.MX6ULL、全志T113-T与RK3568平台迁移指南

选择i.MX6ULL当项目需要高可靠性工业级方案硬件成本敏感且无需复杂多媒体已有NXP生态开发经验选择全志T113-T当需要高性价比多媒体方案开发周期紧张且功能需求明确偏好中文社区支持选择RK3568当需要AI加速或4K视频处理系统要求高性能多核处理计划长期迭代升级产品迁移验证清单时钟树配置验证(特别是休眠唤醒时序)DMA内存对齐检查(i.MX需32字节对齐)中断映射表一致性确认电源域隔离测试启动时间测量(从复位到用户空间)

niuTyler的博客 901

SAP接口错误查询日志

随着数字经济的迅速发展,企业数字化转型不在只追求“业财一体化”,而是在业务端也想要进行更为精细化的管理,所以很多企业在SAP ERP的基础上,集成更多垂直领域更精细的外围系统,比如销售CRM系统,采购SRM系统,生产MES系统等等,琳琅满目的产品,那对SAP实施来说,系统集成过程中,接口的一些报错查询能力必不可少,今天我们就介绍一下,SAP和CRM系统集成中接口常见的报错。

weixin_43657667的博客 2048

手把手教你为STM32设备生成自定义MAC地址(基于芯片ID的5种算法对比)

本文详细介绍了基于STM32芯片ID生成自定义MAC地址的5种算法,包括直接截取、异或折叠、CRC32哈希、自定义混合运算及SHA-256摘要。通过对比分析各算法的计算复杂度、唯一性及适用场景,帮助嵌入式开发者根据项目规模与资源,选择最合适的方案,确保设备MAC地址的唯一性与合规性。

weixin_29170327的博客 527

linux内核-时钟中断

在所有的外部中断中,时钟中断起着特殊的作用,其作用远非单纯的计时所能相比。当然,即使是单纯的计时也已经足够重要了。别的不说,没有正确的时间关系,你用来重建内核的工具make就不能正常运行了,因为make是靠时间标记来确定是否需要重新编译以及链接的。瞌睡时钟中断的重要性还远不止于此。 我们在中断的博客中看到,内核在每次中断(以及系统调用和异常)服务完毕返回用户空间之前都要检查是否需要调度,若有需要就进行进程调度。事实上,调度只有当CPU在内核中运行时才能发生。在进程的博客中,读者将会看到进程调度发生在两种情

guoguangwu的专栏 3403

CPLD新手必看:安路EF2系列配置与烧录的避坑指南(含完整流程)

本文为CPLD新手提供了安路EF2系列芯片从硬件设计到软件烧录的完整避坑指南。重点解析了电源系统、时钟复位、JTAG接口等关键电路设计要点,并详细介绍了使用TD软件进行工程创建、代码编写、引脚分配及程序烧录的全流程,帮助开发者快速上手并规避常见问题。

weixin_29217235的博客 352

Linux内核的时钟中断机制

看到一篇关于Linux时钟机制的文章,觉得分析得非常好,转贴于此:Linux内核的时钟中断机制第七章 Linux内核的时钟中断 (By 詹荣开,NUDT) opyright © 2003 by 詹荣开 E-mail:zhanrk@sohu.com Linux-2.4.0 Version 1.0.0,2003-2-14 摘要:本文主要从内核实现的角度分析了Linux 2.4.0内核

2838

ptrade从零开始学习量化交易第166期【ptrade量化策略研究参考--三个因子挖掘思路】

三个因子挖掘思路

GJ57017_wx的博客 1247

1位2路选择器设计

1位2路选择器设计

好好学习,天天向上 3577

linux时间管理,时钟中断,系统节拍

目录 1 时钟中断/系统节拍 1.1 简介 1.2 系统时钟中断需要处理的事情 2 HZ 2.1 简介 2.2 动态调节时钟中断 / CONFIG_NO_HZ / 降低功耗/tickless mode 2.3 获取当前运行系统的HZ值 / USER_HZ 3 jiffies和jiffies_64(记录系统启动以来产生的节拍数) 3.1 简介 3.2 访问jiffies和jiffies_64 3.3 jiffies和毫秒微秒之间的转换 4 uptime(系统启动到现在的时间;系统空闲时

u010936265的博客 3378

基于YOLOv13+CBAM注意力机制

本教程详细介绍了CBAM注意力机制的原理及其在YOLOv13中的集成方法。CBAM通过通道注意力和空间注意力两个模块,动态调整特征权重以增强模型性能。通道模块利用池化操作和共享MLP生成通道权重,空间模块则通过池化和卷积生成空间权重。教程提供了在YOLOv13中实现CBAM的具体步骤,包括模块代码定义、模型配置修改等关键环节,帮助开发者在目标检测任务中提升模型表现。

FJN110的博客 305

Linux内核-时间子系统(时钟中断)专题汇总

Linux时间子系统知识汇总

weixin_38597669的博客 1726

华为od 面试八股文_C++_02_含答案

华为od 面试八股文_C++_02_含答案

MISAYAONE的博客 3121

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【linux内核分析与应用-陈莉君】时钟中断机制

1.linux时间系统 时间中断是非常重要的一个中断,因为操作系统的活动都受到它的激励,系统利用时钟中断 维持系统事件,促使进程的切换,以保证所有进程共享CPU,利用时钟中断进行记障,监督系统 工作以及确定未来的调度优先级等工作,可以说时钟中断是整个操作系统的脉搏. 2.基本的时钟硬件 linux的OS时钟的物理产生原因是可编程定时计数器产生的输出脉冲,这个脉冲送入CPU以后, 就可以引发一个中断请求信号,我们将它称作时钟中断,时钟中断的周期也就是脉冲信号的 周期,我们将其称作滴答或者节拍. 从

Edidaughter的博客 1227

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

【Linux】中断与时钟

所谓中断是指CPU在执行程序的过程中,出现了某些突发事件急待处理,CPU必须暂停当前程序的执行,转去处理突发事件,处理完毕后又返回原程序被中断的位置继续执行。根据中断的来源,中断可分为内部中断和外部中断,内部中断的中断源来自于CPU内部(软件中断指令、溢出、除法错误等,例如,操作系统从用户态切换到内核态需借助CPU的软件中断),外部中断的中断源来自CPU外部,由外设提出请求。

weixin_47596351的博客 1154

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

中断应用—时钟中断

在所有的外部中断中,时钟中断起特殊的作用。因为计算机是以精确的时间进行数值运算和数据处理的,最基本的时间单元是时钟周期,例如取指令、执行指令、存取内存等,这里讨论的是操作系统建立的时间系统,这个时间系统是整个操作系统活动的动力。 一、时钟硬件 大部分PC中有两个时钟源,分别是RTC和OS(操作系统)时钟。RTC(实时时钟)也叫做CMOS(互补金属氧化物半导体)时钟,是PC主板上的一块芯片(时钟...

xiezhi123456的博客 7018
上一篇: 美妙的诗文语句(不断更新中&hellip;)
下一篇: Linux内核开发之内存与I/O访问(一)
wustdatamining
博客等级 码龄15年 12粉丝 81原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值