欲了解更多请访问:Harmonyos.51cto.com关于中断部分系列将用三篇文章详细解释整个过程。●中断概念中断概念有很多中断概念,如中断控制器、中断源、中断向量、中断共享、中断处理程序等,本文将整理一次。概念是理解中断过程的唯一途径。本文的主角是海公公,他用海公公的例子来解释中断的各种概念。中断管理从中断初始化HalIrqInit开始,到注册中断的LOS_HwiCreate函数,再到消费中断函数的HalIrqHandler,分析鸿蒙内核的中断过程,这和设计模式中的观察者模式非常相似。可以去鸿蒙内核源码解析(总目录)查看。跟踪代码详细信息。清楚的解释保存和恢复中断站点TaskIrqContext的过程。可以去鸿蒙内核源码分析(总目录)查看。中断概念中断模块的核心是中断控制器,也就是皇帝身边的大红人(CPU)。外来人员要对皇上有所作为,都必须经过它。什么是中断?●中断是指CPU暂停当前程序的执行,必要时执行新程序的过程。即在程序运行过程中,有一个事务必须立即被CPU处理。这时CPU暂时暂停当前程序的执行来处理这个事务。这个过程称为中断。如图所示:●外设可以在没有CPU干预的情况下完成某些任务,但在某些情况下,CPU也需要为它们执行某些任务。通过中断机制,当外设不需要CPU干预时,CPU可以执行其他任务,而当外设需要CPU时,CPU会立即中断当前任务,产生中断信号响应中断请求。这样,CPU就可以避免花费大量时间等待和查询外围设备状态的运行,大大提高了系统的实时性和执行效率。中断相关的硬件介绍中断相关的硬件可以分为三类:设备(皇上的事太多了)、中断控制器(海爷爷)、CPU(皇上威武,牵着皇上的耳朵)世界)。●Device中断源。当设备需要请求CPU时,产生一个中断信号,连接到中断控制器。●中断控制器中断控制器是CPU众多外设之一。它管理外围设备的外围设备。外设必须经过CPU的仲裁才能使用CPU。它会向CPU发送一个中断信号。因此,中断源可以打开和关闭,中断源的优先级和触发方式可以通过对中断控制器的编程来设置。据说,海公公有权屏蔽大臣的字条,降低女孩的幸运等级,让你们见不到我们的皇帝。常用的中断控制器有VIC(向量中断控制器)和GIC(通用中断控制器)。ARMCortex-M系列使用的中断控制器是NVIC(NestedVectorInterruptController)。ARMCortex-A7中使用的中断控制器是GIC。●CPU中断控制器将中断源的请求分发给各个CPU,当CPU收到请求后,中断当前正在执行的任务,转而执行中断处理程序。用两张图来说明三者的关系,就可以看出我们海公公的权势有多大了。中断控制器文档可以去ARM中断控制器gic_v2.pdf查看各个寄存器的作用。下面是鸿蒙核心GICRegister配置的一小部分#ifdefLOSCFG_PLATFORM_BSP_GIC_V2#defineGICC_CTLR(GICC_OFFSET+0x00)/*CPUInterfaceControlRegister*///CPU接口控制寄存器#defineGICC_PMR(GICC_OFFSET+0x04)/*InterruptPriorityMaskRegister*///中断优先级掩码寄存器#defineGICC_BPR0(GICC_OFFSET)+/*BinaryPointRegister*///二进制点寄存器#defineGICC_IAR(GICC_OFFSET+0x0c)/*InterruptAcknowledgeRegister*///中断确认寄存器#defineGICC_EOIR(GICC_OFFSET+0x10)/*EndofInterruptRegister*//中断结束Register#defineGICC_RPR(GICC_OFFSET+0x14)/*RunningPriorityRegister*///运行优先级寄存器#defineGICC_HPPIR(GICC_OFFSET+0x18)/*HighestPriorityPendingInterruptRegister*///最高优先级挂起中断寄存器#endif中断源所谓中断源是指引起中断的事件或原因,或中断申请的来源可分为两类:外部中断源和内部中断内部中断源。?外部中断源是指CPU外部事件引起的中断。主要包括:?一般中慢速外设,如键盘、打印机、鼠标等;?数据通道,如磁盘、数据采集设备、网络等;故障源,如断电、外设故障、内存读取错误、超限报警等事件。●内部中断源是指由CPU内部事件(异常)引起的中断,主要包括:?CPU执行中断指令INTn引起的中断;商超出寄存器可以表示的范围,溢出等;?为调试程序设置的中断,如单步中断、断点中断;?特殊操作引起的异常,比如内存溢出,页面错误等?内核间中断,比如cpua让cpub停止工作,产生调度等这些都是想找我们皇帝做事的人.中断类型将中断源分为三种中断●PPI:私有外设中断(PrivatePeripheralInterrupt),是每个CPU的私有中断。最多支持16个PPI中断,硬件中断号从ID16~ID31。PPI通常发送给指定的CPU,应用场景有CPU本地时钟。类似于皇帝自己的一些私事,就不方便说了,比如大明湖畔的夏雨荷到来。●SGI:SoftwareGeneratedInterrupt(软件生成中断)通常用于多核通信。它最多支持16个SGI中断。硬件中断号从ID0~ID15开始。SGI在内核中通常用作处理器间中断,将信号发送给系统指定的CPU。主要用于多个皇帝(CPU)共存,皇帝直接邀请一起玩。●SPI:共享外设中断(SharedPeripheralInterrupt),最多可支持988个外设中断,硬件中断号从ID32到ID1019。是外公务,这种事情还有很多,比如吴三桂同志的意外造反,黄河决堤等等,所以排号也很多,除了前两个。”需要向CPU申请(发送一个电脉冲信号),请求CPU暂停当前正在执行的任务,转向“紧急事件”。这个申请过程称为中断请求,这个申请必须要仲裁由中断控制器。为皇帝工作的人首先写报告并走流程,并且请求必须经过我们公共办公室的过滤。中断触发中断源发送中断信号(电平触发或边沿触发)到中断控制器,中断控制器对中断进行仲裁,确定优先级,向CPU发送中断信号,当中断源产生中断信号时,中断触发器会置“1”,表示中断源产生了中断,要求CPU响应中断。相当于做生意的小册子,小册子统一为海公公,编号。中断优先级是为了使系统能够及时响应和处理所有中断。系统根据中断时间的重要性和紧急程度,将中断源分为几个等级。称为中断优先级。海先生为书籍分配了优先级。如花皇后优先级最高,西施皇后优先级最低。当外围设备产生中断请求时,CPU暂停当前任务,响应中断请求,即执行Interrupthandler。每个产生中断的设备都有一个相应的中断处理程序。海公公将纸条交给皇上,皇上一一处理。中断向量表●中断号:每个中断请求信号都会有一个特定的标志,以便计算机判断是哪个设备发出了中断请求。该标志是中断号。●中断向量:中断服务程序的入口地址。●中断向量表是存放中断向量的存储区。中断向量对应于中断号。中断向量按照中断号的顺序存储在中断向量表中。中断向量表是所有中断处理程序的入口点。中断处理流程如下图所示:将一个函数(用户中断服务程序)与虚拟中断向量表中的中断向量链接起来。当中断向量对应的中断发生时,会调用并执行hook的用户中断服务程序。所有的中断都是通过中断向量表来处理的,即当一个中断被触发时,处理器会直接判断是哪个中断源,然后直接跳转到对应的固定位置进行处理,而且每个中断服务程序都要安排好一起在一个统一的地址。中断向量表一般由数组定义或在初始代码中给出。皇上一本正经地处理小册子,并找到了相应小册子的工作人员。用户中断服务程序(ISR)在用户中断服务程序(ISR)中,有两种情况:●第一种情况是不进行线程切换。在这种情况下,任务中断上下文TaskIrqContext将被切换。用户中断服务程序和中断后续程序运行完毕后,退出中断模式,返回被中断线程。●另一种情况是在中断处理过程中需要进行线程切换,这种切换也会切换任务上下文TaskContext。具体来说,下面工作的人完成工作。允许中断嵌套在中断嵌套的条件下,在执行中断服务程序的过程中,如果发生高优先级的中断,则中断当前中断服务程序的执行,转而执行高优先级的中断服务程序优先中断。当高优先级中断处理完成后,被中断的中断服务程序重新开始。如果需要进行线程调度,则在所有中断处理程序运行完毕后,才会发生线程的上下文切换,如下图所示。先阻止西施皇后的事情,既然杀了如花皇后,优先级很高,老奴安排皇上先做如花皇后,再做西施皇后。奴才担心皇上受不了。小的时候,一个外围设备可以对应一个中断号,但是为了支持更多的硬件设备,多个设备可以共享一个中断号,共享相同中断号的中断处理程序形成一个链表。当外部设备产生中断请求时,系统会遍历中断号对应的中断处理程序链表,直到找到对应设备的中断处理程序。在遍历执行过程中,每个中断处理程序都可以通过检测设备ID来判断中断是否是由中断处理程序对应的设备产生的。简单一句话就是:共用一本小册子,分头做多件事。内核间中断属于SGI中断类型。对于多核系统,中断控制器允许一个CPU的硬件线程中断其他CPU的硬件线程。这种方法称为核间中断。内核间中断的实现基础是多CPU内存共享。使用核间中断可以减少某个CPU的过载,有效提高系统效率。typedefenum{//鸿蒙内核间中断LOS_MP_IPI_WAKEUP,//唤醒CPULOS_MP_IPI_SCHEDULE,//调度CPULOS_MP_IPI_HALT,//停止CPU}MP_IPI_TYPE;可见CPU之间可以相互唤醒、调度、停止。内核间中断有点特殊,出现在多个皇帝(CPU)的情况下,皇帝可以相互命令,停止工作。例如:A皇通过海太监让B皇休息。FunctionAPI参与贡献●获取注解仓库地址●fork本仓库>>新建一个Feat_xxx分支>>提交代码评论>>新建一个PullRequest●新建一个Issue更多信息请访问:鸿蒙科技共建社区与华为官方https://harmonyos.51cto.com
