Linux中断编程
视频1-Linux中中断到概念和中断处理机制
题目:中断的作用是什么?
答案:中断是外设异步通知soc的一种高效的方式,当soc正在做其他事情的时候,如果外设产生了数据,可以打断soc,然后让soc去处理刚刚产生的数据的那个硬件,至于如何处理,arm和linux会提供这样的接口出来,让驱动工程师自由的去处理,可以去读数据,也可以不管它,都是可以的
题目: 内核中是如何区分不同的中断的?
答案: 内核中会为每个中断设置一个中断号,不同的外设在硬件设计的时候就已经对应好了一个中断号,只要通过原理图和数据手册就可以查到
视频2-设备树文件中定义中断号
题目:设备树是如何定义中断号的?
答案:设备树中定义好了中断控制器,我们只需要通过继承的方式去继承,比如interrupt-parent = <&gpx1>;然后通过interrupts = <2 4>;定义它的号码和触发方式
视频3-驱动代码中获取到中断号码的方法
题目:驱动代码中如何获取到中断号码?
答案:首先一定要获取到中断号码定义的节点,然后通过irq_of_parse_and_map函数就可以得到,实际就是一个整数,这个整数无需去管它是多少数字,因为它是在内核中重新去用一个数字去定义的,同时代码操作中断的时候,也无需去管他,只要在设备树上定义号,并验证能响应就行了
视频4/5-申请中断处理-request_irq的使用
题目:中断的触发方式有哪些?
答案:1,内部控制器触发中断的时候的标志
2,上升沿触发
3,下降沿触发
4,高电平触发
5,低电平触发
题目:中断处理方法中返回值是什么
答案: IRQ_HANDLED
题目: 如何查看中断是否申请成功
答案:cat /proc/interrupts
题目:如何去释放中断
答案:free_irq(),当我们申请的中断,就必须去释放,否则下次装载驱动就会报错
视频6/7-驱动中获取硬件数据并传递给用户的方法
题目:按键驱动中是如何封装数据?
答案:设计了一个数据对象,用于描述按键的状态,键值
struct key_event{
int code; // 表示按键的类型: home, esc, Q,W,E,R,T, ENTER
int value; // 表示按下还是抬起 1 / 0
};
题目:应用空间读取到数据后是如何解析的?
答案:应用空间读到时struct key_event event; 然后解析code和value就可以知道是什么按键和状态了
视频8-阻塞的概念和接口使用
题目:文件io模型有哪几种?
答案:1,非阻塞
2,阻塞
3,多路复用--select/poll
4, 异步信号通知faync
题目:什么叫阻塞?
答案:当进程在读取外部设备的资源(数据),资源没有准备好,进程就会休眠linux应用中,大部分的函数接口都是阻塞
视频9-阻塞的实现-等待队列的使用
题目:进程的状态有哪些?
答案:就绪态, 运行态,挂起态,终止态
题目:如何实现阻塞?
答案:1,将当前进程加入到等待队列头中
add_wait_queue(wait_queue_head_t * q, wait_queue_t * wait)
2,将当前进程状态设置成TASK_INTERRUPTIBLE
set_current_state(TASK_INTERRUPTIBLE)
3,让出调度--休眠
schedule(void)
视频10-非阻塞模式的实现.trec
题目:什么叫做非阻塞?
答案:在读写的时候,如果没有数据,立刻返回,并且返回一个出错码,用的会比较少,因为通过循环来完成,比较耗资源
题目:驱动中如何实现非阻塞?
答案:驱动中需要去区分,当前模式是阻塞还是非阻塞, 如果当前是非阻塞模式,并且没有数据,立马返回一个出错码
视频12/13/14-多路复用select和poll的概念
题目:什么叫多路复用?
答案:当代码中需要监控多个文件的读,写,出错时,如果不考虑多进程多线程的话,某个时刻只能处理一个文件的读写出错,而多路服用就指能够通过监控多个文件的读写出错,完成多个文件的阻塞的功能
题目:应用程序使用什么来实现多路复用?
答案:select或者是poll
视频15-poll驱动的实现
题目:驱动中如何实现多路复用?
答案:1,在file_operation的接口中实现poll接口
2, 调用poll_wait,,将当前到等待队列注册系统中
3,有数据返回一个POLLIN,无数据就返回0
视频16-异步信号通知应用程序编程
题目: 什么叫做异步信号通知?
答案:当有数据到时候,驱动会发送信号(SIGIO)给应用,就可以异步去读写数据,不用主动去读写,这种方式对于应用程序而言效率就比较高了
题目:应用程序如何去实现异步信号操作?
答案:1,设置信号处理方法
2,将当前进程设置成SIGIO的属主进程
3,将io模式设置成异步模式
视频17-异步信号的驱动编程实现.trec
题目: 驱动中如何实现异步信号通知?
答案:1,需要和进程进行关联--记录信号该发送给谁
2,在某个特定的时候去发送信号,在有数据的时候
视频18-中断下半部的由来.trec
题目: 为什么有中断下半部?
答案:中断的特点就是要快,因为中断比较霸道,中断产生后,如果cpu对该中断没有禁止,cpu就必须去处理,也即是说cpu原来做的事情就被迫被打断,去执行中断处理,所以如果中断处理的时间比较长,就会导致cpu原来执行的代码出现问题,故此中断处理要快,但是有些中断的处理时间确实比较长,比如触摸屏的坐标分析,网卡的数据帧的处理,这就违背了中断处理要快的原则,因此内核就采取将一些耗时的中断处理的工作延后处理,这就是中断下半部
题目: 中断下半部有哪些实现方法?
答案: 1,softirq: 处理比较快,但是内核级别的机制,需要修改整个内核源码,不推荐也不常用
2,tasklet: 内部实现实际调用了softirq
3, workqueue: 工作队列
视频19-tasklet的实现.trec
题目: 如何实现tasklet?
答案:1,初始化tasklet
2,tasklet_schedule,在上半部中放入到内核线程中--启动
视频20-work下半部的实现.trec
题目: 如何实现工作队列work?
答案:1,初始化work
2,schedule_work,在上半部中放入到内核线程中--启动
题目: tasklet和工作队列的不同?
答案:tasklet是运行在中断上下文中的,而work是运行在进程上下