第五期 | 中断
文章平均质量分 95
中断
北京迅为
让学习更简单,让开发更容易
展开
-
RK3568驱动指南|第五篇-中断-第39章中断实验
可以想象这样一幅画面,你正在烹饪一顿美味的晚餐,准备了各种食材,点燃了炉灶,开始了幸福的烹饪过程,突然,你的手机响起,有人打来了一个紧急电话,打破了你正常的烹饪流程,这时候你需要立刻停止手中的工作,迅速接起电话,与对方进行交流,在接完电话之后,再回到厨房继续之前的烹饪流程。从今天开始,我们就进入中断课程的学习了。突然,你的手机响起,发出紧急电话的铃声,打破了你正常的烹饪流程,接电话的时间很短并不会对烹饪产生很大的影响,而接电话的时候可能就有问题了,水烧开之后可能会煮干、错过了最好的添加调味料的时间等等。原创 2023-09-16 16:30:09 · 1725 阅读 · 0 评论 -
RK3568驱动指南|第五篇-中断-第40章中断申请流程
在上一章中,我们简单的认识了一下中断以及中断子系统框架,最后编写了中断申请和中断服务函数的实验,大家会发现虽然前面讲解的只是点很多,但实际用起来只需要两三个函数就可以了,但中断的具体申请流程是怎样的呢,大家就不是很清楚了,在本章节将带领大家研究中断的申请流程。它提供了一个统一的接口,用于注册和处理中断处理函数、管理中断行为,并提供了必要的信息和数据结构来监视和控制中断的行为和状态。它提供了一个统一的接口,用于注册和注销中断处理函数,并提供了必要的属性和数据结构来控制中断处理的行为和顺序。原创 2023-09-18 16:23:33 · 322 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第41章中断下文tasklet实验
在上述示例中,my_tasklet是tasklet的名称,my_tasklet_handler是tasklet的处理函数,0是传递给处理函数的参数。需要注意的是,关闭tasklet并不会销毁tasklet结构体,因此可以随时通过调用tasklet_enable函数重新启用tasklet,或者调用tasklet_kill函数来销毁tasklet。使能tasklet后,如果调用tasklet_schedule函数触发tasklet,则tasklet的处理函数将会被执行。原创 2023-09-21 16:53:07 · 322 阅读 · 0 评论 -
RK3568驱动指南|第五篇 中断-第42章 软中断实验
这里要注意:尽管我们添加一个自定义的软中断非常简单,但是Linux内核的开发者并不希望我们这样去做,如果我们要用软中断,建议使用tasklet。上述修改之后,重新编译内核源码,接下来我们来学习下软中断的使用方法。在驱动代码中,我们可以使用Linux驱动代码中上述的软中断,当然我们也可以自己添加软中断。我们添加一个自定义的软中断,如下所示,TEST_SOFTIRQ为自定义添加的软中断。在驱动程序中的模块初始化函数中,我们将GPIO转换为中断号,并使用request_irq函数请求中断,然后注册软中断函数。原创 2023-09-22 11:17:13 · 272 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第43章 特殊的软中断tasklet分析实验
在上面的代码中,tasklet_action_common()函数对任务链表中的每个tasklet进行处理。1. 无法处理长时间运行的任务:Tasklet适用于短时间运行的延迟工作,如果需要处理长时间运行的任务,可能会阻塞其他任务的执行。在多核系统中,此循环用于初始化每个CPU的tasklet_vec和tasklet_hi_vec。这种调度机制可以提高系统的效率。原创 2023-09-23 10:35:47 · 173 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第44章 共享工作队列实验
在上图中,可以看到打印中断处理函数中添加的打印“This is test_interrupt”被多次打印,说明触发了好几次中断上文,那么中断上文会多次调度中断下文,所以也会打印工作项处理函数中添加的打印“This is test_work”。在Linux 内核中,使用 work_struct 结构体表示一个工作项,这些工作组织成工作队列,工作队列使用 workqueue_struct 结构体表示,如下图所示,流水线相当于工作队列,流水线上一个个等待处理的物料相当于一个个工作。参数是指向工作项的指针。原创 2023-09-26 16:06:46 · 201 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第45章 自定义工作队列实验
在驱动程序中的模块初始化函数中,我们将GPIO转换为中断号,并使用request_irq函数请求中断,然后创建自定义工作队列,初始化工作项。在上图中,可以看到打印中断处理函数中添加的打印“This is test_interrupt”被打印了俩次,说明触发了2次中断上文,那么中断上文会调度2次中断下文,所以也会打印2次工作项处理函数中添加的打印“This is test_work”。函数,这里略过,其实思路是一致的,用于将定义好的工作项立即添加到工作队列中,并在工作队列可用时立即执行。原创 2023-09-28 15:41:10 · 151 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第46章 延迟工作实验
但是 t1~t2 和 t2~t3 这两个时间段是小于我们设置的定时器中断周期(也就是消抖时间,比如 10ms),所以虽然 t1 开启了定时器,但是定时器定时时间还没到呢 t2 时刻就重置了定时器,最终只有 t3 时刻开启的定时器能完整的完成整个定时周期并触发中断,我们就可以在中断处理函数里面做按键处理了,这就是定时器实现按键防抖的原理,Linux 里面的按键驱动用的就是这个原理!在上图中,按键没有按下的时候按键值为 1,当按键在 t1 时刻按键被按下以后按键值就变为 0,这是最理想的状态。原创 2023-09-28 16:03:25 · 292 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第47章 工作队列传参实验
当中断触发时,在中断处理函数 test_interrupt 中,通过调用 queue_work 函数将工作项 test_workqueue_work.test_work 提交到工作队列 test_workqueue 中。首先我们定义工作项结构,如下所示,在结构体struct work_data中定义了需要传递给工作项处理函数的参数a和b,然后定义一个类型为struct work_data 的变量test_workqueue_work。工作项是一个抽象的结构,可以用于封装需要执行的工作及其相关的参数。原创 2023-09-28 16:36:54 · 164 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第48章 并发管理工作队列实验
当执行完结束的时候,worker thread会睡眠,等到新的中断产生,work再继续添加到工作队列,然后工作线程执行每个工作,周而复始。当有新的工作项添加到工作队列时,工作线程会从其关联的工作队列中获取待执行的工作项,并执行相应的处理函数。在多核线程系统中,多个工作线程可以同时执行各自绑定的工作队列中的工作项。1 在工作项w0 工作甚至是睡眠时,工作项w1 w2是排队等待的,在繁忙的系统中,工作队列可能会积累大量的待处理工作项,导致任务调度的延迟,这可能会影响系统的响应性能,并增加工作项的处理时间。原创 2023-10-08 17:49:18 · 179 阅读 · 0 评论 -
RK3568驱动指南|第五期-中断-第49章 中断线程化实验
这个内核线程只用于这个中断。我们要实现一个简单的中断处理的例子,用于展示中断的顶半部和底半部处理的概念,并通过线程化的工作队列实现了底半部的延时处理。想象一下,你正在做一项任务,但是总是被别人的打扰所中断,每次都要停下手头的工作去处理别人的事情。总而言之,中断线程化是一种优化技术,通过将中断处理和主线程的工作分开,提高多线程程序的性能。:是在发生中断时首先要执行的处理程序,非常类似于顶半部,该函数最后会返回IRQ_WAKE_THREAD来唤醒中断,一般handler设为NULL,用系统提供的默认处理。原创 2023-10-09 16:46:28 · 203 阅读 · 0 评论