每天拉肚子是什么原因引起的| 天壤之别是什么意思| 破伤风什么情况需要打| 发飙什么意思| 腿弯处的筋痛是什么原因| 道理是什么意思| 情人的定义是什么| 什么食物增加血管弹性| 甲状腺结节伴钙化什么意思| 感冒反复发烧是什么原因引起的| 眼压高有什么症状和危害| 生理期提前是什么原因| 兆后面的单位是什么| 双规是什么意思| 读军校需要什么条件| 过期的维生素c有什么用途| 梦见捡钱是什么预兆| 眉头有痣代表什么| 为什么明星不激光祛斑| 氯仿是什么| 法则是什么意思| 尽虚空遍法界什么意思| 残疾证有什么用| 小鸟进屋有什么预兆吗| 勃起功能障碍吃什么药| 甲状腺挂什么科室| 麻薯是什么| 柠檬配什么泡水喝最好| 4a是什么意思| 经常熬夜喝什么汤好| 应无所住什么意思| 高血压吃什么好| 色织布是什么面料| 脑血管痉挛吃什么药| 痔疮用什么药治最好效果最快| 2024年属什么| 不硬的原因是什么| 太阳里面有什么| 廊坊有什么好玩的地方| 无限极是干什么的| 什么颜色显黑| 撤退性出血是什么颜色| 化胡为佛是什么意思| hpv亚临床感染是什么意思| 2月5号什么星座| 美国是什么洲| 孕晚期缺铁对胎儿有什么影响| 血糖高吃什么水果好能降糖| 三月十八是什么星座| 女人肺气虚吃什么补最快| 早晨醒来口苦是什么原因| 6月18什么星座| 小s和黄子佼为什么分手| sly是什么牌子| 贤良淑德后半句是什么| 晚上看到黄鼠狼什么预兆| 军长是什么军衔| 月经血是什么血| 无花果和什么煲汤好| 去三亚穿什么衣服合适| 维生素e有什么作用| 阴道出血用什么药| 疱疹性咽峡炎吃什么药| 什么方什么计| 吃瓜子有什么好处| 1988年出生是什么命| 韩语欧巴是什么意思| 阿佛洛狄忒是什么神| 荷尔蒙是什么| 藩王是什么意思| 脂肪瘤看什么科| 潜意识是什么| ea7是什么品牌| 双皮奶是什么做的| 中药一般什么时候喝最好| 孕妇腿抽筋是什么原因| 三月十号是什么星座| 湖北人喜欢吃什么菜| 类风湿因子高说明什么| 花生为什么叫落花生| 直击是什么意思| 脱发是什么原因| 游龙戏凤是什么意思| 伤寒现在叫什么病| 尿微量白蛋白高是什么意思| 里正相当于现在什么官| 肝右叶钙化灶什么意思| 20岁长白头发是什么原因造成的| 烫伤涂什么药膏| 非洲是什么人种| 一个九一个鸟念什么| 云南白药里的保险子有什么作用| 什么手机有红外线功能| 95年属什么多大| 给猫咪取什么名字好听| 独在异乡为异客异是什么意思| 太后是什么意思| 感染hpv有什么症状| 记性越来越差是什么原因| 吃了牛肉不能吃什么| 早泄吃什么中药| 有何特长一般填什么好| 小孩坐火车需要什么证件| 小孩出汗多是什么原因造成的| 并发症是什么意思| 经信委是干什么的| 尿酸高能吃什么鱼| 腮腺炎挂什么科| 什么是修辞手法| 4朵玫瑰代表什么意思| 梦到蛇预示着什么意思| 孕囊小是什么原因| 孕妇贫血吃什么补血最好| 969368是什么电话| 网球肘用什么方法能彻底治好呢| 4月25日什么星座| 男性生殖器叫什么| 科级干部是什么级别| 口臭为什么| 伶牙俐齿是什么生肖| 平均血红蛋白浓度偏低是什么意思| 检查胸部应该挂什么科| blacklabel是什么牌子| 为所当为什么意思| 鸭子吃什么食物| 口腔出血是什么病征兆| 排尿困难吃什么药| 生粉和淀粉有什么区别| 急忙的反义词是什么| 胃病吃什么药最好| 为什么的拼音怎么写| 两个日是什么字| 黄脸婆是什么意思| 张家界为什么叫张家界| ak是什么意思| 太阳穴疼是什么原因| 曹植字什么| 什么下什么什么| 什么人群不适合吃阿胶糕| 诸侯国是什么意思| pt是什么金属| gfr医学上是什么意思| 牙龈肿痛吃什么药好得快| 主动权是什么意思| 啊什么| 金乐什么字| 12月12号什么星座| 现是什么生肖| 脑萎缩吃什么药| 福报是什么意思| 3月18日什么星座| 吹风扇感冒了吃什么药| 梦见抬棺材是什么意思| 一个合一个页读什么| 火烈鸟吃什么| 梦见自己拉屎是什么意思| cp感什么意思| 硫酸羟氯喹片治什么病| 手术后为什么要平躺6小时| 什么情况需要打破伤风| 已所不欲勿施于人是什么意思| 名流是什么意思| 刷酸是什么意思| 透明质酸是什么| 太阳星座是什么意思| balea是什么牌子| 毛峰茶属于什么茶| 全血粘度低切偏高是什么意思| 肛门跳动是什么原因| 蟑螂什么样子| 肉炒什么菜谱大全| 吃什么对甲状腺有好处| 止境是什么意思| 什么叫邪淫| 经常不吃晚饭对身体有什么影响| 甘油三酯高是什么原因引起的| 肩周炎用什么药好| 肝胆科属于什么科| 透析什么意思| 脆哨是什么| 导是什么意思| 邮编什么意思| 上善若水什么意思| 七九年属什么生肖| 凌晨一点半是什么时辰| 意阑珊什么意思| 术后病人吃什么营养恢复快| 口水多是什么原因引起的| 打了封闭针后要注意什么事项| 五月17号是什么星座| 穷极一生是什么意思| kalenji是什么品牌| 正月初一是什么生肖| 观察是什么意思| 爱妃是什么意思| 青海湖里面有什么鱼| 胺碘酮又叫什么名字| 4月6日是什么星座| 九价疫苗是什么| 女生打呼噜是什么原因| 脑垂体挂什么科| 2月21日什么星座| 1998属什么| 水洗棉是什么| 甲状腺结节对身体有什么影响| 1919年发生了什么| 拮抗药物是什么药| 身份证上x代表什么| 什么大| 吃恩替卡韦有什么副作用| kodak是什么牌子| 梦见黑蛇是什么意思| 炖鸡汤放什么材料好吃| 女人脚抽筋是什么原因| 牙齿发炎吃什么药| 茵陈是什么植物| 牙龈萎缩吃什么维生素| 恶心是什么意思| 检查痛风挂什么科| 广藿香是什么味道| 补办身份证需要什么手续| 黄河水为什么是黄的| 什么样的土豆不能吃| 9.3是什么日子| 榴莲和什么相克| 纯阳之人有什么特征| 31岁属什么生肖| 小孩肚子疼挂什么科| 梦见大白菜是什么意思| 吃什么补充黄体酮| 三个牛读什么字| plcc是什么意思| 头晕晕的是什么原因| 灰猫是什么品种| 建档立卡是什么意思| 眼压高用什么眼药水| 蛋白高是什么病| 经常不吃晚饭对身体有什么影响| 四不伤害是指什么| 秫米是什么米| 微信是什么时候开始有的| 月经没来吃什么药可以催月经来| 1986年属什么生肖| 菲字五行属什么| 合肥什么时候出梅| 指甲上白色月牙代表什么| 啤酒加什么好喝| 白细胞高是什么意思| 什么是树莓| 67年的羊是什么命| 儿童不长个子去医院挂什么科| gr是什么意思| 银手镯对身体有什么好处| 小蜜蜂是什么牌子| 为什么长不胖一直很瘦| 陈字五行属什么| 1977年是什么年| 胡子发黄是什么原因| 葛仙米是什么| 牛骨煲汤搭配什么最好| 连衣裙配什么鞋子好看| 摩拳擦掌是什么生肖| 吃什么对喉咙好| 尿频尿急吃什么药| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? MCU ? linux-2.6.26内核中ARM中断实现详解(3)

共1条 1/1 1 跳转至

linux-2.6.26内核中ARM中断实现详解(3)

菜鸟
2025-08-04 16:40:26     打赏
百度 第四局在她帮助天津女排追到18平之后,又一次4号位强攻,结果扣大斜线出界。

作者:刘洪涛,华清远见嵌入式学院金牌讲师。

四、中断处理模型

要想弄清楚desc->handle_irq(irq, desc)和我们注册的中断有什么关联,就要了解中断处理模型了。

4.1 中断处理模型结构

中断处理模型如下图所示,

其中NR_IRQS表示最大的中断号,在include/asm/arch/irq.h中定义。

irq_desc[]是一个指向irq_desc_t结构的数组, irq_desc_t结构是各个设备中断服务例程的描述符。Irq_desc_t结构体中的成员action指向该中断号对应的irqaction结构体链表。Irqaction结构体定义在include/linux/interrupt.h中,如下:

truct irqaction {
        irq_handler_t handler; //中断处理函数,注册时提供
        unsigned long flags; //中断标志,注册时提供
        cpumask_t mask; //中断掩码
        const char *name; //中断名称
        void *dev_id; //设备id,本文后面部分介绍中断共享时会详细说明这个参数的作用
        struct irqaction *next; //如果有中断共享,则继续执行,
        int irq; //中断号,注册时提供
        struct proc_dir_entry *dir; //指向IRQn相关的/proc/irq/n目录的描述符
    };

在注册中断号为irq的中断服务程序时,系统会根据注册参数封装相应的irqaction结构体。并把中断号为irq的irqaction结构体写入irq_desc [irq]->action。这样就把设备的中断请求号与该设备的中断服务例程irqaction联系在一起了。样当CPU接收到中断请求后,就可以根据中断号通过irq_desc []找到该设备的中断服务程序。

4.2 中断共享的处理模型

共享中断的不同设备的iqraction结构体都会添加进该中断号对应的irq_desc结构体的action成员所指向的irqaction链表内。当内核发生中断时,它会依次调用该链表内所有的handler函数。因此,若驱动程序需要使用共享中断机制,其中断处理函数必须有能力识别是否是自己的硬件产生了中断。通常是通过读取该硬件设备提供的中断flag标志位进行判断。也就是说不是任何设备都可以做为中断共享源的,它必须能够通过的它的中断flag判断出是否发生了中断。
中断共享的注册方法是:

int request_irq(unsigned int irq, irq_handler_t handler,
        IRQF_SHARED, const char *devname, void *dev_id)

很多权威资料中都提到,中断共享注册时的注册函数中的dev_id参数是必不可少的,并且dev_id的值必须唯一。那么这里提供唯一的dev_id值的究竟是做什么用的?

根据我们前面中断模型的知识,可以看出发生中断时,内核并不判断究竟是共享中断线上的哪个设备产生了中断,它会循环执行所有该中断线上注册的中断处理函数(即irqaction->handler函数)。因此irqaction->handler函数有责任识别出是否是自己的硬件设备产生了中断,然后再执行该中断处理函数。通常是通过读取该硬件设备提供的中断flag标志位进行判断。那既然kernel循环执行该中断线上注册的所有irqaction->handler函数,把识别究竟是哪个硬件设备产生了中断这件事交给中断处理函数本身去做,那request_irq的dev_id参数究竟是做什么用的?

很多资料中都建议将设备结构指针作为dev_id参数。在中断到来时,迅速地根据硬件寄存器中的信息比照传入的dev_id参数判断是否是本设备的中断,若不是,应迅速返回。这样的说法没有问题,也是我们编程时都遵循的方法。但事实上并不能够说明为什么中断共享必须要设置dev_id。

下面解释一下dev_id参数为什么必须的,而且是必须唯一的。

当调用free_irq注销中断处理函数时(通常卸载驱动时其中断处理函数也会被注销掉),因为dev_id是唯一的,所以可以通过它来判断从共享中断线上的多个中断处理程序中删除指定的一个。如果没有这个参数,那么kernel不可能知道给定的中断线上到底要删除哪一个处理程序。

注销函数定义在Kernel/irq/manage.c中定义:
    void free_irq(unsigned int irq, void *dev_id)

五、S3C2410子中断的注册的实现

5.1 S3C2410子中断注册问题的提出

参看3.5节中判断中断号的方法,可以看到只是通过S3C2410中断控制器中的INTOFFSET寄存器来判断的。对于INTPND中的EINT4_7、EINT8_23、INT_UART0、INT_ADC 等带有子中断的向量,INTOFFSET无法判断出具体的中断号。平台留给我们的注册方法如下:

在include/asm/arch/irqs.h中有类似如下定义:

/* interrupts generated from the external interrupts sources */
    #define IRQ_EINT4 S3C2410_IRQ(32) /* 48 */
    #define IRQ_EINT5 S3C2410_IRQ(33)
    #define IRQ_EINT6 S3C2410_IRQ(34)
    #define IRQ_EINT7 S3C2410_IRQ(35)
    #define IRQ_EINT8 S3C2410_IRQ(36)
    #define IRQ_EINT9 S3C2410_IRQ(37)
    #define IRQ_EINT10 S3C2410_IRQ(38)
    #define IRQ_EINT11 S3C2410_IRQ(39)
    #define IRQ_EINT12 S3C2410_IRQ(40)
    #define IRQ_EINT13 S3C2410_IRQ(41)
    #define IRQ_EINT14 S3C2410_IRQ(42)
    #define IRQ_EINT15 S3C2410_IRQ(43)
    #define IRQ_EINT16 S3C2410_IRQ(44)
    #define IRQ_EINT17 S3C2410_IRQ(45)
    #define IRQ_EINT18 S3C2410_IRQ(46)
    #define IRQ_EINT19 S3C2410_IRQ(47)
    #define IRQ_EINT20 S3C2410_IRQ(48) /* 64 */
    #define IRQ_EINT21 S3C2410_IRQ(49)
    #define IRQ_EINT22 S3C2410_IRQ(50)
    #define IRQ_EINT23 S3C2410_IRQ(51)

可以看到平台为每种子中断都定义了中断号,如果你想实现EINT10的中断注册,直接按照IRQ_EINT10这个中断号注册都可以了。那么平台代码是如何实现这部分中断注册的呢?

5.2 S3C2410子中断注册问题的解决

/*arch/arm/plat-s3c24xx/irq.c*/
        void __init s3c24xx_init_irq(void)
    {……
        set_irq_chained_handler(IRQ_EINT4t7, s3c_irq_demux_extint4t7);
        set_irq_chained_handler(IRQ_EINT8t23, s3c_irq_demux_extint8);
        set_irq_chained_handler(IRQ_UART0, s3c_irq_demux_uart0);
        set_irq_chained_handler(IRQ_UART1, s3c_irq_demux_uart1);
        set_irq_chained_handler(IRQ_UART2, s3c_irq_demux_uart2);
        set_irq_chained_handler(IRQ_ADCPARENT, s3c_irq_demux_adc);

……
    }

平台在初始化时会调用到s3c24xx_init_irq,在此函数中实现了对EINT4_7、EINT8_23、INT_UART0、INT_ADC等中断的注册。下面看看这些带有子中断的中断号对应的处理函数的内容。以IRQ_EINT4t7为例,其它情况类似。

/*arch/arm/plat-s3c24xx/irq.c*/
    s3c_irq_demux_extint4t7(unsigned int irq,
                struct irq_desc *desc)
    {
        unsigned long eintpnd = __raw_readl(S3C24XX_EINTPEND);
        unsigned long eintmsk = __raw_readl(S3C24XX_EINTMASK);
        eintpnd &= ~eintmsk;
        eintpnd &= 0xff; /* only lower irqs */

    /* eintpnd中可以有多个位同时置1,这一点和intpnd的只能有1个位置1是不一样的 */
        while (eintpnd) { //循环执行所有置位的子中断
            irq = __ffs(eintpnd); //算出第一个不为0的位,类似arm v5后的clz前导0的作用
            eintpnd &= ~(1<<irq);//清除相应的位
            irq += (IRQ_EINT4 - 4);//算出对应的中断号
            desc_handle_irq(irq, irq_desc + irq);//执行对应子中断的注册函数
        }
    }

从上面的函数可以看出子中断是如何注册及被调用到的。有人可能会问为何不在include/asm/arch-s3c2410/entry-macro.s 文件中get_irqnr_and_base函数判断中断号时,直接算出对应的子中断号,就可以直接找到子中断处理了呢?

原因是: get_irqnr_and_base是平台给系统提供的函数,对于多个子中断同时置位的情况无法通过一个值返回(因为子中断中,如eintpnd是可以多个位同时置位的))。而intpnd则没有这个问题。




关键词: linux-2.6.26     内核     中断     实现     详解         

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]
起酥油是什么 6月7日什么星座 芙蓉是什么意思 现在有什么赚钱的路子 生理期可以吃什么
月经推迟一个月不来什么原因 指纹不清晰是什么原因 血塞通治什么病最好 莹字五行属什么 胃不舒服想吐是什么原因
包袱什么意思 上火吃什么药 老白茶属于什么茶 o型血容易得什么病 蚊子咬了为什么会痒
兔子吃什么食物 乳房痛挂什么科 为什么香蕉不能放冰箱 宫腔粘连带是什么意思 自贸区是什么意思
勺子是什么意思hcv9jop6ns8r.cn 身份证有x代表什么travellingsim.com 什么是肾上腺素hcv8jop0ns2r.cn 什么拜之交hcv9jop0ns2r.cn 打嗝放屁多是什么原因hcv8jop7ns4r.cn
吃什么可以缓解孕吐恶心hcv9jop1ns0r.cn 糖尿病人吃什么主食hcv9jop0ns7r.cn 桃子又什么又什么填空hcv8jop7ns2r.cn pm是什么hcv8jop8ns3r.cn 什么食物消炎效果好hcv7jop6ns2r.cn
下嘴唇起泡是什么原因hcv8jop9ns5r.cn 左肾盂分离是什么意思wuhaiwuya.com 咒怨讲的是什么故事hcv9jop0ns4r.cn 神神叨叨是什么意思hcv7jop9ns7r.cn 皮肤瘙痒用什么药治疗hcv8jop7ns0r.cn
克拉是什么意思youbangsi.com 吃什么对眼睛近视好hcv8jop4ns8r.cn 身体缺酶会得什么病hcv9jop4ns0r.cn 虎牙长什么样子hcv8jop9ns0r.cn 菱形脸适合什么发型bjhyzcsm.com
百度