打蛋白针有什么作用| 骨盐量偏低代表什么| 项羽是什么生肖| 有缘无分是什么意思| 半月板退变是什么意思| 牙齿痒是什么原因| 蓝什么什么| 后壁是什么意思| 肋骨疼挂什么科| 食物中毒什么症状| 虾和什么相克| 成吉思汗姓什么| uu解脲脲原体阳性是什么意思| 扎西德勒是什么意思| 遗尿是什么症状| 西洋参吃多了有什么副作用| 痹症是什么意思| 伯母是什么意思| 胆囊检查做什么检查| 风流倜傥是什么意思| 恩怨是什么意思| 头晕应该挂什么科| 胃疼吃什么食物对胃好| 仓鼠为什么吃自己的孩子| 卧榻是什么意思| 71年属什么| 心影饱满是什么意思| 经血是什么血| 张衡发明了什么东西| 小儿舌苔白厚什么原因| 吃什么食物对肠胃好| 6月什么星座| 两点是什么时辰| 黄体回声是什么意思| 血小板减少是什么原因造成的| 关节疼痛用什么药| 施华洛世奇什么档次| 炭疽病用什么农药最好| 教皇是什么意思| 手术后拆线挂什么科| 369是什么意思| 心脏疼是什么病| 一对什么填空| 08属什么生肖| 喝什么茶可以降尿酸| 同房出血是什么原因| lg手机是什么牌子| 血热是什么意思| 办电话卡需要什么| 咽喉炎吃什么好| 维生素c不能和什么一起吃| 贫血缺什么| 低筋面粉可以做什么| dm医学上是什么意思| 省纪委副书记是什么级别| 柳絮吃了有什么好处| 心什么气什么| 洋姜学名叫什么| 2月14日是什么星座| 心结是什么意思| 查肾挂什么科| 为什么会堵奶| 烧伤的疤痕怎么去除用什么法最好| 女人吃什么能增加雌激素| 有什么颜色| 睾丸疼痛挂什么科| 计划生育是什么意思| 尿的酸碱度能说明什么| 肠易激综合征吃什么药| 女生考什么证书最实用| 一吃饭就吐是什么原因| 肉燕是什么做的| 鸡蛋干配什么菜炒好吃| 胎停了有什么症状| 美联储加息意味着什么| 白化病是什么病| 流眼泪是什么原因| 甲状腺肿大是什么原因引起| 什么叫阴阳水| 继发不孕什么意思| 热射病是什么| 睡觉总是流口水是什么原因| 看病人买什么花合适| 高血压一般在什么年龄| c14呼气试验是检查什么的| 皮肤湿疹用什么药膏| 血稠吃什么食物好得快| 左眼跳是什么原因| 海燕是什么鸟| 融合菜是什么意思| 高位截瘫是什么意思| 军国主义是什么意思| 体力不支是什么意思| 腿膝盖疼是什么原因| 拔鼻毛有什么危害| 中伤是什么意思| 浅是什么意思| 胎毛什么时候剃最好| 八月一日是什么日子| 好学不倦什么意思| 水母吃什么食物| 果肉属于什么组织| 刀纸是什么| xxs是什么意思| 什么麻料最好| 循序渐进什么意思| 香槟是什么| 才女是什么意思| 胃反流是什么原因引起的| 金是什么结构的字| 雷替斯和优甲乐有什么区别| 肝内胆管结石有什么症状表现| 星月菩提是什么| 面瘫是什么引起的| 脾胃寒湿吃什么中成药| 甲状腺结节吃什么| 过生日吃什么菜寓意好| 向左向右向前看是什么歌| 羊水多对胎儿有什么影响| 宝宝热疹用什么药膏| 椎间盘膨出是什么意思| 隐翅虫咬人后用什么药| 未时左眼跳是什么预兆| 白芨有什么作用和功效| 风雨雷电代表什么生肖| 女性尿酸高有什么症状表现| 人又不人鬼不鬼是什么生肖| 双向情感障碍是什么| 失眠看什么科最好| 同房出血是什么原因| 身上发痒是什么原因| 容颜是什么意思| 颜文字是什么意思| 表面是什么意思| 黄金茶属于什么茶| 此言念什么| 什么鱼适合做酸菜鱼| 痔疮吃什么药好| 节节草煮水喝治什么病| 灼烧感是什么感觉| 滴滴什么意思| 玉的五行属性是什么| ccu是什么病房| 阑尾炎的症状是什么| 省委委员是什么级别| 梦见男婴儿是什么意思| d是什么元素| 我操是什么意思| 小三阳和大三阳有什么区别| 河北古代叫什么| 烧心是什么意思| 痘痘反复长是什么原因| 杜甫是什么主义诗人| 丹参与什么搭配最好| 为什么听力会下降| 心肌病是什么症状| 复山是什么意思| 考试前紧张吃什么药最好能缓解| 双性恋是什么| 海豹油有什么功效| 心绞痛是什么感觉| 胎膜早破是什么意思| 女性肝囊肿要注意什么| 螨虫是什么样子的| 郑和是什么族| 嗝什么意思| 发烧不退烧是什么原因| 5月出生是什么星座| 年庚是什么意思| 洋芋是什么东西| 私生子是什么意思| 心脏神经官能症吃什么药| 王字旁加己念什么| 云南简称是什么| 吃维生素b6有什么好处和副作用| 日晡潮热是什么意思| 淋巴细胞百分比偏低是什么原因| 雌激素过高是什么原因造成的| 硼酸是什么| 放飞自我是什么意思| 金庸的原名叫什么| 鸭肫是什么| 活性炭和木炭有什么区别| 1997年出生的属什么| 武则天是什么朝代的| 黑曜石适合什么人戴| 阴阳两虚吃什么药最好| ii是什么意思| 经常干呕是什么原因| 蛮蛮是什么意思| 41是什么意思| 子宫内膜厚是什么原因| 武则天墓为什么不敢挖| 复方北豆根氨酚那敏片是什么药| 人老放屁是什么原因| 什么是无机盐| 供奉观音菩萨有什么讲究| 日本兵为什么不怕死| 狗贫血吃什么补血最快| 落幕是什么意思| 4a广告公司什么意思| 骨折有什么忌口| winbond是什么品牌| 帕金森吃什么药效果好| 秦二世为什么姓胡| 尿里有泡沫是什么病| 什么是维生素| 内热是什么原因引起的怎么调理| 手脚经常发麻是什么原因| 左侧附件区囊性回声是什么意思| 藏青色是什么颜色| 什么是唐氏综合征| 一马平川是什么生肖| 其可以组什么词| 角的大小与什么有关与什么无关| 感冒虚弱吃什么食物好| 欧皇什么意思| 全身冰凉是什么原因| 什么叫三观不正| 仓鼠能吃什么水果| 场合是什么意思| 西天取经是什么意思| 梦见朋友死了是什么意思| 四维和大排畸有什么区别| 查尿常规挂什么科| 吃什么会引起尿酸高| 尿痛是什么原因| 早日康复是什么意思| 打车费计入什么科目| 轻度溶血是什么意思| 男人为什么会遗精| 三伏天喝什么汤最好| 湿疹和热疹有什么区别| 世界上最大的数是什么| betty是什么意思| 痔疮什么情况下需要做手术| 孕妇梦见黑蛇是什么意思| epa是什么营养物质| 冬天吃什么水果| 儒字五行属什么| 强磁对人体有什么危害| 梦到生女儿是什么意思| 燕窝有什么功能| 什么是向量| 优生优育是什么意思| 梦见滑雪是什么意思| balance什么意思| 操是什么意思| 醋有什么功效和作用| 空调风扇不转是什么原因| 胃痉挛有什么症状表现| 宫颈息肉吃什么药能消| 子宫有积液是什么原因引起的| 肾积水有什么危害| 肺热吃什么| 四级士官是什么级别| 梦见放生鱼是什么意思| 咽炎用什么药好| 人流后吃什么最补子宫| 表彰是什么意思| 什么是分子| 很黄很暴力是什么意思| 牙痛是什么原因| 惠字五行属什么| 百度
这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 ? 论坛首页 ? 嵌入式开发 ? MCU ? linux-2.6.26内核中ARM中断实现详解(3)

共1条 1/1 1 跳转至

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

菜鸟
2025-08-04 16:40:26     打赏
百度 可于他们而言,城市依然只是个人人生规划里的谋生之地,乡村才是家,才是落叶归根之所。

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

四、中断处理模型

要想弄清楚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.26什么星座
血小板吃什么补得快点 胆汁反流是什么原因引起的 长沙为什么叫星城 刺梨是什么 痤疮是什么
干疮是什么样子的图片 成吉思汗是什么族 政协主席是干什么的 only是什么牌子 黄占读什么
1975年属兔五行属什么 月经量少是什么原因 沃尔玛是干什么的 igm是什么意思 鹿米念什么
喉咙发炎吃什么食物hcv8jop6ns7r.cn 干眼症什么症状hcv9jop4ns4r.cn 酸梅汤与什么相克hcv8jop5ns6r.cn 1月14日什么星座hcv8jop4ns6r.cn 少阳证是什么意思ff14chat.com
小囡是什么意思onlinewuye.com 惊为天人是什么意思hcv8jop4ns0r.cn 口腔溃疡需要补充什么维生素hcv9jop0ns9r.cn 宫颈囊肿多发是什么意思hcv8jop3ns8r.cn 薏米和什么一起煮粥最好hcv9jop4ns2r.cn
什么样的人容易中暑hcv9jop6ns6r.cn 狮子是什么科hcv9jop7ns2r.cn 核磁是检查什么的hcv8jop9ns5r.cn 舌苔发白是什么病的前兆hcv8jop0ns3r.cn 美人坯子是什么意思hcv9jop0ns5r.cn
缺钙会导致什么shenchushe.com 游泳是什么运动hcv8jop0ns4r.cn 小姑独处是什么意思hcv8jop3ns4r.cn 热天不出汗是什么原因hcv8jop5ns9r.cn 金箔是什么hcv8jop3ns0r.cn
百度