Interrupt 架构之美 -- Linux Kernel 实现欣赏

SparkFun nRF9160开发板实战:蜂窝网络与GPS定位物联网应用指南 在物联网应用中,低功耗广域网(LPWAN)技术是实现设备远程连接的关键。其核心原理是通过蜂窝网络(如LTE Cat M1/NB-IoT)提供广域覆盖,结合GPS实现精准定位,为设备赋予“开口说话”和“知道自己在哪里”的能力。这项技术的价值在于能够摆脱对Wi-Fi的依赖,支持电池供电设备在野外、移动等复杂场景下长期稳定运行,广泛应用于资产追踪、环境监测、远程控制等领域。本文以SparkFun nRF9160 Thing Plus开发板为例,深入解析其内置蜂窝调制解调器与GPS接收器的硬件架构,并提供从开发环境 阅读详情

这是以前的浅析 :
http://blog.youkuaiyun.com/leesagacious/article/details/50500096
http://blog.youkuaiyun.com/leesagacious/article/details/50491819
http://blog.youkuaiyun.com/leesagacious/article/details/78679903

注册中断

这里写图片描述

int request_threaded_irq(unsigned int irq, irq_handler_t handler,
             irq_handler_t thread_fn, unsigned long irqflags,
             const char *devname, void *dev_id)
{
    /*
        函数中一上来就声明的结构体,其地位都是非常重要的,
        作者一上来就想到、就要声明它,大都是该体系中的核心数据结构,
        如下的两个结构体蕴含丰富,用到了在说吧,
    */
    struct irqaction *action;
    struct irq_desc *desc;
    int retval;

    /*
        绝对不推荐使用共享中断,
        1 : SOC支持的中断源数量很多,如 : 256 - 32 = 224个 如果还不够你用, 那你可以选择级联的中断控制器的SOC了
        2 : 遍历共享中断处理函数形成的irqaction链表,执行每一个ISR
            查看各自的状态寄存器看是否是自己发生了中断,
            清中断(163 sts中断在读取该状态寄存器的时候,就被清理了,164 mo中断一定要手动清理(真是一个辣鸡!),否则中断风暴要来了
            参见上图)
            这延迟了中断处理的时间了吧,与"上半部分执行的越快越好"的理念是违背的
            为什么 “上半部分执行的越快越好”,这涉及到了上、下半部分诞生的原因了,下面说

        dev_id 是ISR向被中断的进程开了一扇窗,可传一个值,暴力的Interrupt也有温柔的一面,哈哈!    
        请不要再联想dev_id与共享中断的事情了,说什么free_irq()释放时唯一性的那些东西,因为不推荐共享中断,

        加上这个do....while() 是为了处理共享中断情况的,大多数情况下,只会执行一次,因为只有共享中断,链表上
        才会有多个irqaction,否则只有一个 

        请移步: http://blog.youkuaiyun.com/leesagacious/article/details/51884483

        do {
            res = action->handler(irq, action->dev_id);  你写的ISR被调用
            .....
            action = action->next;  下一个
        } while (action);
    */
    if ((irqflags & IRQF_SHARED) && !dev_id)
        return -EINVAL;

    /*
        从Radix Tree中 找到中断描述符 struct irq_desc
        上面声明的,下面肯定会有对应的响应的,念念不忘,必有回响,哈哈!
        可能会说,不是从数组中根据软件中断号irq对应的数组下标来找到的吗,
        以前的kernel确实是用数组来管理的,这又涉及到初始化的部分了,还是下面在说,

        关于是 "描述符"的东西 都绝对是核心的东西了,你可能又联想到USB的那些很多描述符了吧,
        那么 这里的 irq_desc 描述了哪些属性 ? 你想一下吧,它应该描述哪些东西 

        return radix_tree_lookup(&irq_desc_tree, irq);

        用基数树来管理比用数组来管理有哪些优势 ? 那个惯用的数组下标的经典手法又一次体现出来了
    */
    desc = irq_to_desc(irq);
    if (!desc)
       return -EINVAL;

    /*
       中断描述符是一种资源,预先分配好的,这个不像 进程的ID 使用延迟重用算法 和 文件描述符fd 那样的动态
       分配的了,
       有些是不可以用的,       
       源码 : 
            return !(desc->status_use_accessors & _IRQ_NOREQUEST);
            return desc->status_use_accessors & _IRQ_PER_CPU_DEVID;

       irq_desc是怎么被初始化的,下面说,这里先把这个函数流程执行完成
    */
    if (!irq_settings_can_request(desc) || WARN_ON(irq_settings_is_per_cpu_devid(desc)))
        return -EINVAL;

    /*
        handler你不给,thread_fn你也不给,你让Interrupt做什么呢?
        如果鱼与熊掌偏偏都给你了,下面看看Interrupt是怎么做的 ?
        好,这里就是 该函数的核心的地方了 !
    */
    if (!handler) {
        if (!thread_fn)
            return -EINVAL;
        /*
            return IRQ_WAKE_THREAD;
            就一句话,它要唤醒中断线程.
            那么要问了,
            1 : 中断线程是在什么时机被二号进程 kthreadd 产生的 ?
            2 : 又是再什么时机被唤醒的

            多说一句,内核线程大都是这个样子,一上来就睡,对应的条件出发了,再去唤醒它,
            就像Hub的驱动 khubd内核线程一样,hub上的port被接入了usb设备后,它就被唤醒了
            来枚举Port上的设备了,
            但是,这个内核线程来头可不一般 !
        */  
        handler = irq_default_primary_handler;
    }

    /*
        分配内存空间吧,这里就是 irqaction的起点了.
        终点在哪 ? 当然是 free_irq()了,有分配,必有释放,哈哈!
    */
    action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);
    if (!action)
        return -ENOMEM;
    /*
        利用传入的参数 给它赋值,然后挂入链表
        这里想到了signal挂入链表的情景,但是,这里的是单链表,
        且在执行的时候,无需查找链表节点的,而是一次全部触发(共享中断)

        看,上面是一大串校验,这里才开始实际的工作.
    */
    action->handler = handler;
    action->thread_fn = thread_fn;
    action->flags = irqflags;      // 关注这个 flags这个值,做一个标记.
    action->name = devname;
    action->dev_id = dev_id;

    chip_bus_lock(desc);
    /*
        主角 终于要粉墨登场了!
    */
    retval = __setup_irq(irq, desc, action);
    chip_bus_sync_unlock(desc);

    if (retval)
        kfree(action);
}
/**
    这个函数很长,做的事情很多
    @irq       : 软件中断号, 
    @desc      : 中断源描述符    
    @irqaction : 中断动作描述符 ,既然是动作描述符,那么一定会有pointer指向你写的ISR.
*/
static int __setup_irq(unsigned int irq, struct irq_desc *desc, struct irqaction *new)
{
    struct irqaction *old, **old_ptr;
    unsigned long flags, thread_mask = 0;
    int ret, nested, shared = 0;
    cpumask_var_t mask;
}
TI CC2652RB无线MCU:BAW无晶体技术与多协议物联网开发实战 在物联网设备开发中,无线微控制器(MCU)是实现稳定、低功耗通信的核心组件。其工作原理基于集成的射频收发器和处理器内核,通过协议栈管理无线连接。这项技术的核心价值在于能够简化硬件设计、提升系统可靠性并延长电池寿命,广泛应用于智能家居、工业传感和资产追踪等领域。本文聚焦德州仪器(TI)的CC2652RB,这款芯片通过创新的体声波(BAW)谐振器技术,实现了“无晶体”设计,彻底消除了外部高频晶体的依赖。结合其动态多协议管理(DMM)和超低功耗传感器控制器,为开发者提供了构建高可靠、长续航物联网节点的完整解决方案 阅读详情

相关推荐

RK3399平台开发系列讲解(中断篇)13.6、中断irq_desc_tree描述

文章目录 平台 内核版本 安卓版本 RK3399 Linux4.4 Android7.1

内核笔记 2382

Linux中断(interrupt)子系统之一:中断系统基本原理

这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变。   /********************************************************

DroidPhone的专栏 6万+

设备树的interrupt

设备树的interrupt

【嵌入式Linux学习七步曲之第三篇 Linux系统bootlaoder移植】全面解析PowerPC架构下的扁平设备树FDT

全面解析PowerPC架构下的扁平设备树FDTSailor_forever  sailing_9806#163.com(本原创文章发表于Sailor_forever 的个人blog,未经本人许可,不得用于商业用途。任何个人、媒体、其他网站不得私自抄袭;网络媒体转载请注明出处,增加原文链接,否则属于侵权行为。如有任何问题,请留言或者发邮件给sailing_9806@163.com

Sailor_forever 1万+

5分钟搞定!用L型匹配电路优化窄带天线性能(附Smith圆图实操)

本文针对窄带天线阻抗匹配难题,提供了一套5分钟快速解决方案。通过详解L型匹配电路的核心原理,并结合Smith圆图这一射频工程师的“瑞士军刀”,手把手指导如何选择拓扑、计算元件值并进行实际调试,旨在帮助硬件工程师高效优化天线性能,实现最大功率传输。

yyy34的博客 447

Linux -- 图形界面配置Samba;system-config-samba工具

图形界面配置Samba6.6.1 system-config-sambasystem-config-samba是Red Hat公司专门为Samba服务器管理编写的图形界面的管理工具,通过system-config-samba几乎可以完成对Samba服务器的所有配置,所以在只希望通过Samba服务器实现一些简单的资源共享时,system-config-samba是一个不错的选...

weixin_33695450的博客 2201

linux kernel的中断子系统之(三):IRQ number和中断描述符

linux kernel的中断子系统之(三):IRQ number和中断描述符 作者:linuxer 发布于:2014-8-26 18:03 分类:Linux内核分析 一、前言 本文主要围绕IRQ number和中断描述符(interrupt descriptor)这两个概念描述通用中断处理过程。第二章主要描述基本概念,包括什么是IRQ number,什么是中断描述符等。第三章描述中断描

M_O_Bz的专栏 2491

手把手教你用Apple Developer App完成苹果开发者账号注册(含证件验证失败解决方案)

本文详细指导如何通过Apple Developer App完成苹果开发者账号注册,特别针对证件验证失败问题提供解决方案。从准备工作到注册流程,再到验证失败的处理方法,帮助开发者顺利完成注册,避免常见错误。

moss5的博客 1161

Linux中断管理(一):设备树中的中断描述

参考资料:<devicetree-specification-changebars-v0.3> 这个系列主要想研究一下linux的中断管理机制,想从设备树中的中断描述,内核对irq domian的管理及软硬件中断的映射,驱动注册中断,中断来了后怎么处理中断这几个维度下手研究 1.DTS中的中断树介绍 设备树中有一颗存在的中断树,它描述了该硬件平台中的中断连接与层级关系 中断源与中断控制器的物理连接是用interrupt-parent这个属性来描述,如果某个中断源没有这个属性,那么

liaojunwu的博客 972

拌合楼管理软件开发(十一) 海康威视车牌识别摄像头安装调试,总算是跑通了。

/保存的文件个数这里之所以需要用到委托,直接更新textbox文本中的内容,以及复制picturebox的image会提示不是从齐创建的线程调用。

morsth的博客 4822

Python爬虫实战:高效爬取中国专利数据库的完整指南

在当今信息爆炸的时代,专利数据作为技术创新的重要指标,对企业研发、市场分析和学术研究都具有极高价值。中国作为全球专利申请量最大的国家,其专利数据库包含了海量的技术创新信息。本文将详细介绍如何使用Python最新技术构建一个高效、稳定的中国专利数据库爬虫系统。中国专利数据库主要由国家知识产权局(CNIPA)维护,包含发明专利、实用新型专利和外观设计专利三大类。截至2023年,中国专利数据库已收录超过400万件发明专利和300万件实用新型专利。

2201_76125261的博客 1574

慢慢欣赏linux powerpc中断绑核

如何查看当前中断绑核情况 static int __init proc_interrupts_init(void)     proc_create("interrupts", 0, NULL, &amp;proc_interrupts_operations);                                                 /\                  ...

shipinsky的博客 354

YOLOv8 交通违规检测各个场景的实际应用

本文介绍了基于YOLOv8的交通违规检测系统在不同场景下的应用实现。系统可检测闯红灯、超速、违停和不系安全带等多种违规行为,针对每种场景提供了具体的技术方案和Python实现代码。其中闯红灯检测结合信号灯状态分析,超速检测通过距离时间计算速度,违停检测采用长时间跟踪策略,安全带检测则需更高精度识别。文章还展示了如何整合各功能构建综合交通监管系统,并总结了不同应用场景的技术要点和优化方向,为智能交通管理提供了实用解决方案。

u010117029的博客 301

小米嵌入式校招面试:从项目深度到系统底层理解的全方位准备指南

嵌入式系统作为连接硬件与软件的核心技术,其原理涉及从微控制器架构到实时操作系统的完整技术栈。理解嵌入式开发的价值在于能够直接控制硬件资源,实现高效、可靠的系统功能。在实际应用中,嵌入式技术广泛应用于物联网设备、智能家居和工业控制等领域。通过掌握C/C++底层编程、RTOS任务调度机制和Linux系统内核等关键技术,开发者能够构建高性能的嵌入式解决方案。本文基于小米嵌入式面试的热点问题,重点解析了项目深度考察和系统理解能力评估的方法,帮助求职者从传统的知识背诵转向系统性思维培养,为嵌入式岗位面试提供实用的准备

weixin_34393428的博客 331

[SV]SystemVerilog中,系统函数$cast()的作用是什么?

摘要:SystemVerilog中的$cast()系统函数用于安全的动态类型转换,主要在类层次结构中将父类句柄转换为子类句柄(向下转换)。它通过运行时类型检查确保转换合法性,成功时返回1并赋值句柄,失败则返回0。这种机制使得可以通过父类句柄访问子类特有成员,在多态场景(如UVM验证)中尤为重要。使用时需检查返回值处理转换失败情况。$cast()比静态转换更安全,但不能用于无关类或基本数据类型间的转换。

元直的博客 1214

Euro-NCAP-HWA测试流程中文版V1.1(2023发布)

在本协议中,使用了以下术语:Vehicle undertest (VUT) – 指根据本规程测试的车辆,车上有碰撞前的碰撞缓解或避免系统Global VehicleTarget (GVT) – 指本协议中使用的车辆目标,其定义见TB025—Euro-NCAP全球车辆目标规范v1.0辅助其他车辆(SOV)--指最新的 AEB VRU 测试规程中定义的 "大型障碍车辆"(而非机器人控制的平台),用于本规程中的 "切出 "测试。Time To Collision (TTC) – 指在VUT碰撞GVT之前的剩余时间

小明师兄的博客 598

Linux 设备树详解

设备树( Device Tree)是一种描述硬件的数据结构,在操作系统( OS)引导阶段进行设备初始化的时候,数据结构中的硬件信息被检测并传递给操作系统最早诞生于 Open Firmware, Flattened Device Tree (FDT)格式标准。dts 文件( Device Tree Source, dts)是以 ASCII 文本形式描述设备树内容。dtb 文件是二进制格式,编译工具为: Device Tree Compiler( DTC)。

123的专栏 2107

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

我眼中的Linux设备树(四 中断)

四 中断中断一般包括中断产生设备和中断处理设备。中断控制器负责处理中断,每一个中断都有对应的中断号及触发条件。中断产生设备可能有多个中断源,有时多个中断源对应中断控制器中的一个中断,这种情况中断产生设备的中断源称之为中断控制器中对应中断的子中断。一般情况中断产生设备数量要多于中断控制器,多个中断产生设备的中断都由一个中断控制器处理,这种多对一的关系也很像一个树形结构,所以在设备树中,中断也被描述成...

weixin_30664539的博客 470

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

jupyter中interrupt the kernel(中断)没有反应

有的时候,程序运算量很大或者陷入死循环时,点击interrupt(中断)按钮没有反应时,可以有三种解决方案: 1.终端输入Ctrl+c,退出jupyter 2.选中notebook,shutdown 3.点击restartthekernel(推荐) ...

咕噜君的博客 1万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jupyter的kernel功能:Interrupt、Restart、Clear Output、Run All

Interrupt - 暂停程序stops the execution of the code (helpful when you have a long operation but forget to change some parameter, or in case you have an infinite loop) Restart - 清空变量 释放内存clears up all of the variables and releases memory Restart & Cle..

Agetha的博客 2845

linux中断子系统 - irq_desc的创建

irq_desc的代码主要在kernel/irq/irqdesc.c中 linux4.6.3 1.irq_desc组织方式irq_desc在内核中有两种组织方式,这是根据宏CONFIG_SPARSE_IRQ是否定义来决定的,这两种方式分别是:(1)radix-tree方式,这是以基数树的方式来组织irq_desc (2)数组的方式 ,前面的文章介绍irq结构时,就是用此方

多媒体开发者 7170

Device Tree(二):基本概念

一、前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。 简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source file。通过DTC(Device Tree Compiler)

ganshuyu的专栏 6239

关于device tree中的interrupts选项

随着Linux的发展,dts技术是大势所趋。里面的interrupts = 这个里面的是1个数,有的是2个数,有的是3个数。这里啰嗦两句,笔记一下。 这个数目,是由这个属性来定的。#interrupt-cells ,如果当前节点找不到,就是跟随父节点的。至于含义,说明如下。 一个cell的情况: 当前interrupt 位于他的中断控制器的索引,比如:     vic: intc@

jiang__jiang的专栏 8125

中断系统中的设备树(四)__设备树描述按键中断

前言:使用设备树描述中断时,我们需要在设备树节点里面描述设备使用哪个硬件中断,如下所示是对按键中断的硬件中断的描述(只是起来开门见山的作用),对于理解按键按键中断的硬件中断的描述信息,我会在下面详细介绍, buttons { compatible = "jz2440_button"; eint-pins = <&gpf 0 0>, <...

gaoquan.wu 3827

Device Tree(二):基本概念

Device Tree(二):基本概念 转载来自:蜗窝科技 http://www.wowotech.net/linux_kenrel/dt_basic_concept.html 一、前言 一些背景知识(例如:为何要引入Device Tree,这个机制是用来解决什么问题的)请参考引入Device Tree的原因,本文主要是介绍Device Tree的基础概念。 简单的说,如果要使用Device Tree,首先用户要了解自己的硬件配置和系统运行参数,并把这些信息组织成Device Tree source f

weixin_42129235的博客 924

Linux中断(interrupt)子系统

中断系统基本原理这个中断系列文章主要针对移动设备中的Linux进行讨论,文中的例子基本都是基于ARM这一体系架构,其他架构的原理其实也差不多,区别只是其中的硬件抽象层。内核版本基于3.3。虽然内核的版本不断地提升,不过自从上一次变更到当前的通用中断子系统后,大的框架性的东西并没有太大的改变。1. 设备、中断控制器和CPU一个完整的设备中,与中断相关的硬件可以划分为3类,它们分别是:设备、中断控制器

hong 5422
上一篇: GIC Interrupt Map --- Linux Kernel 实现赏析
下一篇: Usb + Serial + Net --- Linux Kernel 实现欣赏
leesagacious
博客等级 码龄12年 146粉丝 179原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值