
Linux中断与时钟
基于按键,来实现中断与时钟。包括休眠与唤醒、POLL机制、异步通知、阻塞与非阻塞、定时器、中断下半部、工作队列、中断的线程化处理
Хайде
愿你对未来满怀期待,也能活在当下,把握现在~
展开
-
7.Linux按键驱动-定时器
3.2在probe函数中,设置定时器,修改定时器超时时间,添加定时器。3.4在超时函数中,唤醒等待队列,执行原来中断服务程序执行的那些任务。3.1 在按键结构体中,添加timer_list成员。3.3在按键中断函数中,修改定时器超时时间。原创 2024-10-27 09:04:49 · 358 阅读 · 0 评论 -
9.Linux按键驱动-工作队列
1.2 在probe函数中初始化工作队列。1.1在gpio结构体中定义工作队列。1.3.在中断服务程序中调度工作队列。原创 2024-10-27 09:52:48 · 264 阅读 · 0 评论 -
5.Linux按键驱动-fasync异步通知
当应用程序收到SIGIO信号的时候, sig_func函数就会被调用,调用read函数读取按键的值。2.2APP把自己的pid告诉驱动程序。2.1绑定信号和信号处理函数。原创 2024-10-26 23:02:44 · 305 阅读 · 0 评论 -
3.Linux按键驱动-添加循环队列
3.在open函数中,等待条件变量。当获得条件变量时,判断条件是否为真,为真时,将数据从内核空间拷贝到用户空间。2.在中断服务程序中,记录按键值,并且唤醒等待队列。1.添加环形缓冲区的代码。原创 2024-10-26 21:25:43 · 329 阅读 · 0 评论 -
10.Linux按键驱动-中断的线程化处理threadirq
1.1在probe函数中申请thread_irq。原创 2024-10-27 10:09:33 · 173 阅读 · 0 评论 -
8.Linux按键驱动-中断下半部
由运行结果可知,在驱动中检测到两次按键按压事件(tasklet函数被调用两次),由于上节中的定时器消抖,导致key_timer_expire函数只被调用了一次,故read函数只执行了一次,应用程序只能获取后一个按键值。1.1在gpio结构体中添加tasklet_struct结构体。1.2在probe函数中初始化tasklet结构体。1.3在中断服务程序中调度tasklet。应用程序和Makefile和上节一致。1.4在这个函数中执行其它任务。原创 2024-10-27 09:34:54 · 338 阅读 · 0 评论 -
2.Linux按键驱动-创建字符设备,通过应用程序读取按键值
3.在中断处理函数中唤醒等待队列,然后在read函数中返回按键值。4.4在中断服务程序中,给全局变量赋值,并且唤醒等待队列。4.2 gpio_remove函数中添加对应的删除代码。4.5此时,.read函数会将数据拷贝回用户空间。4.1 gpio_probe中添加字符设备代码。1.在上一个博客的基础上,添加一个字符设备。2.在probe函数中注册字符设备。4.3 定义全局变量,等待队列。3.3Makefile文件。原创 2024-10-26 18:14:37 · 452 阅读 · 0 评论 -
1.Linux按键驱动
使用设备树来实现按键驱动原创 2024-10-26 16:06:48 · 382 阅读 · 0 评论 -
6.Linux按键驱动-阻塞与非阻塞
核心在于驱动程序中的.read函数的支持。立即返回,无法读出,返回-1。默认打开文件时候是阻塞的。1.设置打开方式为非阻塞。原创 2024-10-26 23:37:08 · 338 阅读 · 0 评论 -
4.Linux按键驱动-poll监听文件描述符
在while循环中读取数据之前,首先调用poll函数(对应于驱动中的gpio_poll),如果产生了按键按压事件,那么 ret为1,且fds的revens为POLLIN。当产生中断时,中断服务程序中回唤醒等待队列,.poll函数会返回POLLIN | POLRDNORM。根据上述分析可知,只有当产生了按压之后,才会进入到if的第一个分支,调用read函数。那么,在这种情况下,可以去掉gpio_read函数中第87行的代码。3.在驱动程序中,添加对poll函数的支持。2.1定义文件监听描述符及超时时间。原创 2024-10-26 22:14:22 · 390 阅读 · 0 评论