问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Linux如何及时响应外部中断

发布网友 发布时间:2022-04-28 16:45

我来回答

1个回答

热心网友 时间:2022-06-19 18:58

FPGA每隔100us给运行linux的ARM一个中断,要求在20us内响应中断,并读走2000*16bit的数据。
目前主要的问题是,当系统同时发生多个中断时,会严重影响linux对FPGA中断的响应时间。如何解决?

1、首先想到了ARM的FIQ,它可以打断IRQ中断服务程序,保证对外部FIQ的及时响应。但是发现linux只实现了IRQ,没有显示FIQ。
linux是从devicetree读取中断号,加入中断向量表的。

interrupts = <0x0 0x32 0x0>;中的第一个字段0表示非共享中断,非零表示共享中断,SDK产生的dts统一为0,此时第二字段的值比XPS中的小32;如果第一字段非零,则第二字段比XPS小16.
最后字段表示中断的触发方式。
IRQ_TYPE_EDGE_RISING =0x00000001,
IRQ_TYPE_EDGE_FALLING =0x00000002,
IRQ_TYPE_LEVEL_HIGH =0x00000004,
IRQ_TYPE_LEVEL_LOW =0x00000008,
很明显,devicetree根本没有提供通知linux有FIQ的渠道。
2、再来看linux的IRQ
linux的中断分为上半部和下半部,上半部运行在IRQ模式,会屏蔽所有中断,下半部运行在SVC模式,会重新打开中断。
也就是说,当一个中断的上半部正在运行时(不能再次响应中断),FPGA的中断是不能被linux响应的;
反过来,当FPGA中断的上半部正在运行时(不能再次响应中断),其他的中断也不能被linux响应;
unsigned long flags;
...
local_irq_save(flags);
....

local_irq_restore(flags);

3.
ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。
我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin.
在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。
先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处于禁止状态。无论你在irq
pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了。
在I位和F位为0的时候,当irq
pin上有中断信号过来的时候,就会打断arm的当前工作,并且切换到IRQ模式下,并且跳到相应的异常向量表(vector)位置去执行代码。这个过程是自动的,但是返回到被中断打断的地方就得您亲自动手了。当你跳到异常向量表,处于IRQ的模式的时候,这个时候如果irq
pin上面又来中断信号了,这个时候ARM不会理你的,irq
pin就跟秘书一样,ARM核心就像老板,老板本来在做事,结果来了一个客户,秘书打断它,让客户进去了。而这个时候再来一个客户,要么秘书不断去敲门问,要么客户走人。老板第一个客户没有会见完,是不会理你的。
但是有一种情况例外,当ARM处在IRQ模式,这个时候fiq pin来了一个中断信号,fiq
pin是什么?是快速中断呀,比如是*的来查刑事案件,那才不管你老板是不是在会见客户,直接打断,进入到fiq模式下,并且跳到相应的fiq的异常向量表处去执行代码。那如果当ARM处理FIQ模式,fiq
pin又来中断信号,又就是又一批*来了,那没戏,都是执法人员,你打不断我。那如果这个时候irq
pin来了呢?来了也不理呀,正在办案,还敢来妨碍公务。
所以得出一个结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。
在打不断的情况下,irq pin 或 fiq pin随便你怎么发中断信号,都是白发。
所以除了fiq能打断irq以外,根本没有所谓中断嵌套的情况。
Linux不用FIQ,只用到了IRQ。但是我们有时候一个中断需要处理很长时间,那我们就需要占用IRQ模式那么长的时间吗?没有,linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。
只不过SVC模式下的ISR上半部关闭了当前中断线,下半部才重新打开
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见死人活了腿上都是浓泡? 佛山市南海区里水镇怎么坐车去广东省广州市白云区同和镇元下田福泰... 电加热宝加水要注意什么? 电热宝如何放气 谁知道静雅思听中《寻访二战德国兵02:保卫祖国》的背景音乐 为什么我的ios8.02要1.7G? 华硕游戏笔记与普通笔记本有什么区别 朴智妍荣誉记录 朴智妍艺术贡献的电影 5升级Ios8.0.2怎么样 两种方法查询到的IP地址不一样是怎么回事 linux内核在执行中断处理时是关中断的吗 断号是什么意思 手机已在路由器绑定了IP,为什么手机获取的IP还是和绑定的不一样,怎么解决? linux系统中的中断指令是什么?? 什么是中断号? Linux几种中断信号的区别:HUP,INT,KILL,TERM,TSTP linux驱动自动检测中断号有什么作用??? 都说淘宝预售樱桃的是假的,我买过几次都是真的,给大家传授点经验, 大连樱桃采摘在什么时候? 带有两孔和四孔三孔还有一个小按键的灯开关怎么安装? 哪些方法可以进行大腿后侧拉伸? 想在淘宝买樱桃树,可行吗? 电灯开关怎样安装,墙面开关 第一次和未来男朋友见面比如买樱桃买多少斤呢? 电灯的翘板开关按键掉了 怎么装回去呢? 樱黛玉的樱桃有人买过买,好不好啊? 灯的开关面板上的按键怎么装上去 山东威海疫情樱桃能买吗 哪里有卖樱桃树苗的呀 我电脑的IP地址与实际的IP地址不符怎么解决 LINUX软中断通信 关于linux注册的中断函数 IP地址不一样但电脑用交叉线连的可以ping得 求Linux 内核中断 INT 80H 详细资料 Linux下通过哪个命令怎么查看中断 电脑ip地址不对该怎么处理 linux没有申请中断号 就disable 有效吗 如何解决IP地址重复 linux内核中的中断向量号是怎么与硬件的中断P 提示两台电脑的IP地址相同是什么情况?该如何解决??最好说的详细点!!我... 我的IP地址每次上网显示的都不一样。如何处理 请教linux3.x 中中断注册中硬件中断号和软件中断号的对应 百度IP地址显示和真实IP地址不一样 如果要更换怎么弄? linux驱动程序中如何确定设备使用哪个中断号 IP地址怎么会和所在的地方不一样啊 华为mate40e能不能连接华为vrglass 荣耀v.20启动不了华为VR服务怎么办 华为vr,可以连手柄玩游戏吗?手机是华为mate9pro VR游戏手柄怎么连接不上华为荣耀4X手机?