当前位置: 首页 > news >正文

Hylicos - MINI2440 - 中断控制

中断

中断源管理

中断是一种异步异常,CPU需要处理很多来自设备的中断请求,而CPU引出的line只有IRQ线和FIQ线,所以就得引入中断控制器帮助CPU搞清楚是中断的来源。
MINI2440的中断控制器,可以接受来自60个中断源的请求。提供这些中断源的是内部外设,如DMA 控制器、 UART、IIC 等等。在这些中断源中,UARTn、AC97 和EINTn 中断对于中断控制器而言是“或”关系。
当从内部外设和外部中断请求引脚收到多个中断请求时,中断控制器在仲裁步骤后请求ARM920T 内核的FIQ 或IRQ。

在这里插入图片描述

中断控制器对于中断源的是层次化的,因为中断源很多,而中断源寄存器的位数是有限的,无法表达过多的中断源。每个bit都表达一个中断源,而多个子中断源对应中断源寄存器的同一个bit:
在这里插入图片描述
同样的,多个外部中断源,对应同一个bit:
在这里插入图片描述

中断过程

根据中断类型,SRCPND的置位过程有些不同:

  • 子中断。中断发生后SUBSRCPND相应位置1,如果没有INTSUBMASK屏蔽,那么SRCPND相应的bit被置1,表示挂起等待处理。
  • 不带子中断。中断发生后SRCPND相应位置1,如果没有被INTMSK屏蔽,那么SRCPND相应的bit被置1,表示挂起等待处理。
  • 外部中断。EINT0-EINT3发生后SRCPND相应位置1,如果没有被INTMSK屏蔽,那么等待进一步处理。EINT4-EINT23发生后EINTPEND相应位置1,如果没有被EINTMASK屏蔽,那么SRCPND相应位EINT4-7或EINT8-23置1,如果没有被INTMSK屏蔽,等待进一步处理。
    在这里插入图片描述
    SRCPND中有bit被置位,根据对应的MASK bit是否被置位,判断是否发给CPU处理,fip和irq都是可以被屏蔽的。
    如果没有被屏蔽,那么看中断模式:
  • 快中断,直接把信号送到FIQ线上
  • 普通中断,SRCPND可以有多位置1(FIQ 只能有一个),多置位情况下,需要经过priority选出一个最高优先级的去执行,选出的中断的INTPND的对应bit置1.
    注意,这个过程都是硬件完成,软件的职责是读取INTPND,分清哪个中断源触发了中断,然后让CPU执行到正确的,响应的,处理函数。

开启中断

  • 如果是不带子中断的内部中断,只需设置INTMSK,让它不屏蔽中断就可以了;
  • 如果是带子中断的内部中断,需设置INTSUBMSK和INTMSK,让它门不屏蔽中断就可以了;
  • 如果是外部中断,对于EINT4-23需要设置EINTMASK和INTMSK。对于EINT0-EINT3只需设置INTMSK;
    注意,Arm Core中CPSR寄存器的I位和F位,是决定中断是否有效的总开关。

清除中断

  • 如果是不带子中断的内部中断,只需清除SRCPND、INTPND,注意清除需对应位写1。
  • 如果是带子中断的内部中断,需清除SRCPND和SUBSRCPND、INTPND,注意先清除SUBSRCPND,再清除SRCPND。 因为,如果你先清除SRCPND的话,然后在清除SUBSRCPND的过程中,SRCPND会以为又有中断发生, 又会置1,也就是说一次中断会响应两次。所以必须先掐断源头。
  • 如果是外部中断,对于EINT4-23需要清除EINTPEND和SRCPND、INTPND(同样注意顺序)。对于EINT0-EINT3只需清除SRCPND、INTPND。

外部中断源,次级中断源,主中断源的关系

在这里插入图片描述
平级映射
S3C2440A的中断控制器所能提供的信息只是哪个主中断源上来了中断,例如,28号主中断源上来了中断,还需要进一步确定到底是哪一个次级中断源上(INT_RXD0、INT_TXD0、INT_ERR0)来了中断。

因为有多个中断源,自然用数组表示最方便直观,并且这个数组包含在LMOSEM内核的可执行文件中。IRQ_MAX定义为71。为什么是71,不是只有60个中断源吗?因为我们为了直接用数组下标寻找intfltdsc_t结构,采用了平级映射的方法,例如,28号主中断源发生了中断,发现它其中包含有3个次级中断源,就用28加上一个次级偏移量:SINT_OFFSET(32),找到相应的intfltdsc_t结构。再如,5号主中断源发生了中断,发现它其中包含有16个外部中断源,就用5加上一个外部次级偏移量EINT_OFFSET(47),找到相应的intfltdsc_t结构。不难发现,数组下标031对应的是主中断源,数组下标3246对应的是次级中断源,数组下标47~70对应的是外部中断源。

HAL_DEFGLOB_VARIABLE(intfltdsc_t,machintflt)[IRQ_MAX];	//71

相关文章:

  • kotlin $ (字符串模版)的使用
  • yarn的安装及使用教程
  • C# wpf利用Clip属性实现截屏框
  • C++11手撕线程池 call_once 单例模式 Singleton / condition_variable 与其使用场景
  • 一文(10图)了解Cornerstone3D核心概念(万字总结附导图)
  • 【Emotion】 自动驾驶最近面试总结与反思
  • 【深度学习】BasicSR训练过程记录,如何使用BasicSR训练GAN
  • elastic search入门
  • 为什么 HTTPS 协议能保障数据传输的安全性?
  • 【Unity学习笔记】New Input System 部分源码和测试用例补充
  • 数学建模学习笔记||层次分析法
  • C# 创建多线程的函数
  • LeetCode59 螺旋矩阵 II
  • 轻量化CNN网络 - MobileNet
  • 知识笔记(八十九)———链式语句中partition和strict用法
  • JavaScript 如何正确处理 Unicode 编码问题!
  • 《Java编程思想》读书笔记-对象导论
  • 【comparator, comparable】小总结
  • 【面试系列】之二:关于js原型
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • Centos6.8 使用rpm安装mysql5.7
  • gcc介绍及安装
  • k8s如何管理Pod
  • Linux下的乱码问题
  • Objective-C 中关联引用的概念
  • React中的“虫洞”——Context
  • Spring-boot 启动时碰到的错误
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 计算机在识别图像时“看到”了什么?
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 浏览器缓存机制分析
  • 那些被忽略的 JavaScript 数组方法细节
  • 入口文件开始,分析Vue源码实现
  • 微服务入门【系列视频课程】
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • puppet连载22:define用法
  • ​ 轻量应用服务器:亚马逊云科技打造全球领先的云计算解决方案
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • #微信小程序:微信小程序常见的配置传旨
  • (007)XHTML文档之标题——h1~h6
  • (Java数据结构)ArrayList
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (十一)c52学习之旅-动态数码管
  • (学习日记)2024.01.19
  • (转)EOS中账户、钱包和密钥的关系
  • (转)EXC_BREAKPOINT僵尸错误
  • (转)甲方乙方——赵民谈找工作
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (轉貼)《OOD启思录》:61条面向对象设计的经验原则 (OO)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .NET 4.0中的泛型协变和反变
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?