首页 > 其他分享 >内核定时器

内核定时器

时间:2023-12-18 21:34:41浏览次数:37  
标签:定时器 函数 中断 timer handler 内核 按键

1.节拍器    100hz 10ms间隔,jiffies 其实就是 jiffies_64 的低 32 位   记录系统节拍树,因为是32位所以记录最大值为4294967296(个节拍,也就是这么多个10ms) 4294967296/100/60/60/24 = 49.7 天  就会归零,也叫绕回  
可以用相关的API函数处理,实现定时

一秒的节拍数是HZ

特点: 需要“设置”,定时处理执行一次后结束,要周期处理的话需要想办法重新打开

timer_list  定时器结构体

 

直接加载驱动后就自己启动:

首先初始化IO,然后初始化定时器(设置“中断函数”timer.function、定时时间timer.expires,把定时器添加到系统中add_timer,)然后在中断函数中实现状态取反,然后使用mod_timer重新启动定时器   ,就可以实现闪灯

使用程序测试:

测试程序获取用户指令 开灯 关灯 设置循环周期,在设置循环周期的时候需要给定周期值,通过ioctl()  将用户指令标志位A与假定的周期值B这两个参数传递给驱动,驱动拿到后,通过.unlocked_ioctl = timer_unlocked_ioctl() 这个函数接收到程序传递的参数A和B,然后执行对应的指令。

 

按键消抖,按键驱动

首先驱动初始化字符设备,
初始化按键,设置默认的键值为0XFF,完成按键次数为0
初始化按键IO,of_get_named_gpio获取其一个GPIO标号A(对应具体按键),
gpio_request(A,name) 函数用于申请一个 GPIO 管脚(因为要用,防冲突),并起名字(对应具体按键)
然后gpio_direction_input设置某个 GPIO 为输入
使用irq_of_parse_and_map获取中断号irqnum(对应具体按键)
value=0(对应具体按键)handler(对应具体按键)赋值,编写中断服务函数handler开启定时器(对应具体按键)
【设置定时10ms,定时器函数里面判断按键状态】

此时,一个具体的按键属性集齐

然后request_irq申请中断(按键按下和抬起都处罚中断),创建定时器

测试的时候循环读取驱动传递的数据
,当按键按下的时候触发中断,进入key0_handler,定时10ms, 到时间后进入timer_function,这里判断按键是按下的,就给
具体按键的值,赋给当前设备的值,

此时当前设备通过imx6uirq_read, 判断有效按键的时候,只读取到按键按下的有效数据,但无法获得按键抬起的有效数据
当按键释放的时候,按键抬起的有效数据有了标志位,这里判断有效按键就成功,然后返回这个数据给到上层,然后清除标志位

中断上下部

问题1:中断服务函数的参数是如何传递过来的?imx6uirq.irqkeydesc[0].handler = key0_handler;   直接附带传值

问题2:中断的处理函数 return IRQ_RETVAL(IRQ_HANDLED); ??     return  IRQ_HANDLED ;  两者的区别

 

 keydesc = &dev->irqkeydesc[num];

 atomic_set(&dev->keyvalue, 0x80 | keydesc->value);

取对应按键值赋给设备结构体属性dev->keyvalue=   0x80 | keydesc->value  ==  1000 0000  | 0000 0001 == 1000 0001    

标签:定时器,函数,中断,timer,handler,内核,按键
From: https://www.cnblogs.com/liujinmeng/p/17899849.html

相关文章

  • 视频监控管理平台/智能监测/检测系统EasyCVR出现内核报错导致无法播放,该如何解决?
    GB28181视频监控/安防视频平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,在视频监控播放上,安防监控汇聚平台EasyCVR可支持1、4、9、16个画面窗口播放,可同时播放多路视频流,也能支持视频定时轮播。视频监控管理平台EasyCVR支持多种播放协议,包括:H......
  • jz2400向内核申请中断
    /iqr_testirq_traditional/#include<linux/module.h>#include<linux/init.h>#include<linux/kernel.h>#include<linux/irq.h>#include<linux/interrupt.h>#include<linux/gpio.h>#include<linux/delay.h>#inc......
  • Linux内核中的同步机制
    Linux内核中的同步机制是用来确保在多任务、多处理器环境下的并发操作的正确性和一致性。以下是一些主要的同步机制:原子操作:原子操作是不可分割的操作,也就是说,它们在执行过程中不会被中断。这对于保护共享数据非常关键,特别是在多处理器环境中。信号量(Semaphore):信号量是......
  • mmap内存映射 --- 字符设备驱动,用户空间和内核空间映射到同一个物理内存
    内存映射可实现用户程序对设备驱动内存的直接存取示例代码:驱动层#include<linux/init.h>#include<linux/module.h>#include<linux/miscdevice.h>#include<linux/fs.h>#include<linux/slab.h>//定义kmalloc接口#include<asm/io.h>//定义virt_to_phys接......
  • linux---内核笔记
    semaphore用于进程和进程之间的同步允许有多个进程进入临界区代码执行进程获取不到信号量锁会陷入休眠,让出cpu信号量本质是基于进程调度器,UP和SMP下的实现无差异。被信号量锁保护的临界区代码允许睡眠,这是和自旋锁最大的区别之一。不支持进程和中断之间的同步,这是和自旋锁......
  • arch启动virtualbox实例出现错误:内核驱动未安装
    参照https://cn.linux-console.net/?p=22258错误如下Kerneldrivernotinstalled(rc=-1908)TheVirtualBoxLinuxkerneldriveriseithernotloadedornotsetupcorrectly. Pleasetrysettingitupagainbyexecuting'/sbin/vboxconfig'asroot.......
  • 05-定时器
    05-定时器背景资料51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。前面介绍的独立按键、led灯都属于外设。定时器的作用用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作替代长时间的Delay,提高CPU的运行效率和处理速度...S......
  • Oracle内核技术揭秘 -- 存储结构
    区:表空间中的基本单位在Oracle11.2.0.3以上的版本中,创建新表默认不会分配区给这个表的,只有在插入了数据之后才会分配一个区给这个表空间。区是表空间中空间分配的基本单位,如果一个区的空间用完了,Oracle就会默认再分配一个区。Oracle专门设定了两种类型的表空间:统一大小表空间和......
  • 内部集成M0内核MCU Sub-1G 高性能低功耗的单片集成收发芯片DP4306F
    DP4306F是一款高性能低功耗的单片集成收发机,集成M0核MCU,工作频率可覆盖200MHz~1000MHz,支持230/408/433/470/868/915频段。该芯片集成了射频接收器、射频发射器、频率综合器、GFSK调制器、GFSK解调器等功能模块。通过SPI接口可以对输出功率、频道选择以及数据包格式进行灵活配置,并......
  • 聊一聊 .NET高级调试 内核模式堆泄露
    一:背景1.讲故事前几天有位朋友找到我,说他的机器内存在不断的上涨,但在任务管理器中查不出是哪个进程吃的内存,特别奇怪,截图如下:在我的分析旅程中都是用户态模式的内存泄漏,像上图中的异常征兆已经明确告诉你了,不是用户态程序吃的内存,那就是内核态程序吃的,比如:某些驱动程序操......