Ⅰ linux里的抢占-preempt
1. 什么是抢占?
抢占就是进城切换, 以thread_info->preempt_count标识。
thread_info->preempt_count一物多用:
bit0-7代表的是抢占的次数,最大抢占深度为256次,
bit8-15代表的是软中断的次数,最大也是256次,
bit16-19表示中断的次数,注释的大概意思是避免中断嵌套,但是也不能防止某些驱动中断嵌套使用中断,所以嵌套16层也是最大次数了。
bit20~23代表的NMI中断
2.抢占的函数:
spin_lock()/spin_unlock()
disable_preempt()/enable_preempt()--禁止或使能内核抢占,调用下面的inc_preempt_count()/dec_preempt_count(),加了memory barrier。
inc_preempt_count()/dec_preempt_count()
get_cpu()/put_cpu()
3.调度点
a) 进程被阻塞时
b) 调整参数时,比如通过sched_setscheler() ,nice()等函数调整进程的调度策略,静态优先级时
c) 睡眠进程被唤醒时,比如wake_up唤醒等待队列中的进程时,如果该进程具有更高优先级则会设置当前
进程TIF_NEED_RESCHED,如果允许内核态抢占,则会调度一次
d)中断处理完时,如果中断处理过程中设置了TIF_NEED_SCHED标志,中断返回时,不论是要返回内核态还是用户态,都会发生一次抢占.当然,在这也会检查有没有软中断需要处理。
e)执行了preempt_enable()函数。
Ⅱ 现在大火的嵌入式实时操作系统,你都了解多少
嵌入式实时操作系统强调了什么?
系统最大的特点当然是嵌入。嵌入就意味着它和硬件的联系很强,对硬件的适配和依赖度都是很高的,对于系统移植的难易度也就成了评价嵌入实时系统的重要方面。嵌入式操作系统移植的目的是使嵌入式操作系统能在某个微处理器或微控制器上运行。比如VxWorks是商用操作系统的有很多API函数及相关技术支持,所以移植和二次开发比较容易,但是移植成本较高。嵌入还意味着对于小型的硬件要求,主要是面对实时产生的数据,在数据产生终端进行快速的运算。所以系统极其强调灵敏性和实时性。
另一个特点就是实时。对于实时性的要求,有很多种实现措施。我们一一道来。首先就是分区处理的思想。对于核心的功能划分,使用户信息和系统程序和运行分列在不同的区划里,保证任务的有效有序运转。其次, 任务管理是嵌入式实时操作系统的核心和灵魂,决定了操作系统的实时性能。它通常包含优先级设置、多任务调度机制和时间确定性等部分。 嵌入式操作系统支持多任务,每个任务都具有优先级,任务越重要,赋予的优先级应越高。优先级的设置分为静态优先级和动态优先级两种。静态优先级指的是每个任务在运行前都被赋予一个优先级,而且这个优先级在系统运行期间是不能改变的;动态优先级则是指每个任务的优先级(特别是应用程序的优先级)在系统运行时可以动态地改变。 嵌入式操作系统支持多任务,每个任务都具有优先级。任务调度主要是协调任务对计算机系统资源的争夺使用。对系统资源非常匮乏的嵌入式系统来说,任务调度尤为重要,它直接影响到系统的实时性能。通常,多任务调度机制分为基于优先级抢占式调度和时间片轮转调度。
基于优先级抢占式调度:系统中每个任务都有一个优先级,内核总是将CPU分配给处于就绪态的优先级最高的任务运行。如果系统发现就绪队列中有比当前运行任务更高的优先级任务,就把当前运行任务置于就绪队列中,调入高优先级任务运行。系统采用优先级抢占方式进行调度,可以保证重要的突发事件及时得到处理。
时间片轮转调度:让优先级相同的处于就绪状态的任务按时间片使用CPU,以防止同优先级的某一任务长时间独占CPU。
在一般情况下,嵌入式实时操作系统采用基于优先级抢占式调度与时间片轮转调度相结合的调度机制。
第三,在运行的执行方式上,VXworks等系统采用进程和线程的执行方式,而市面上其他的系统多采用任务执行方式。
嵌入式实时操作系统函数调用与服务的执行时间应具有可确定性。系统服务的执行时间不依赖于应用程序任务的多少。基于此特征,系统完成某个确定任务的时间是可预测的。表1具体列出了4种操作系统的调度机制。
VxWorks具有高效的任务管理功能,它支持多任务,可分配256个优先级,支持优先级抢占式调试和时间片轮转调度,实时性最好。μC/OS-II内核是针对实时系统的要求设计实现的,只支持基于固定优先级抢占式调度;调度方法简单,可以满足较高的实时性要求。μClinux在结构上继承了标准Linux的多任务实现方式,分为实时进程和普通进程,分别采用先来先服务和时间片轮转调度;仅针对中低档嵌入式CPU特点进行改良,且不支持内核抢占。eCos调度方法丰富,提供了两种基于优先级的调度器(即位图调度器和多级队列调度器),允许用户在进行配置时选择其中一个凋度器,适应性好。
此外,还涉及到任务的中断管理。
中断管理是实时系统中一个很重要的部分,系统经常通过中断与外部事件交互。主要考虑是否支持中断嵌套、中断处理机制、中断延时等。
以VXwoks为例,xWorks操作系统中断管理采用中断处理与普通任务分别在不同栈中处理的中断处理机制,使得中断只会引发一些关键寄存器的存储,而不会导致任务的上下文切换,从而极大地缩短了中断延时。同时,VxWorks的中断处理程序只能在最短时间内通告中断的发生,而将其他的非实时处理尽量放入被引发的中断服务程序中来完成,这也缩短了中断延时。但是凼为中断服务程序不在一个固定的仟务上下文中执行,而目没有任务控制块,所以所有中断服务程序使用相同的中断堆栈。为了能处理最坏情况下的中断嵌套,必须分配足够大的中断堆栈空间。
因商业原因,不对其他新型嵌入式实时操作系统做分析。
·有哪些厉害的MPU实时操作系统?
1、VXworks
VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的 F-16、FA-18战斗机、B-2 隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器、2008年5月登陆的凤凰号,和2012年8月登陆的好奇号也都使用到了VxWorks上。
VxWorks操作系统有以下部件组成:
多任务调度(采用基于优先级抢占方式,同时支持同优先级任务间的分时间片调度)
任务间的同步
进程间通信机制
中断处理
定时器和内存管理机制
总之,VxWorks的系统结构是一个相当小的微内核的层次结构。内核仅提供多任务环境、进程间通信和同步功能。这些功能模块足够支持VxWorks在较高层次所提供的丰富的性能的要求。
2、QNX
QNX是一种商用的遵从POSIX规范的类Unix实时操作系统,目标市场主要是面向嵌入式系统。它可能是最成功的微内核操作系统之一。
QNX成立于1980年,是加拿大一家知名的嵌入式系统开发商。
QNX的应用范围极广,包含了:控制保时捷跑车的音乐和媒体功能、核电站和美国陆军无人驾驶Crusher坦克的控制系统[2],还有RIM公司的BlackBerry PlayBook平板电脑。
3、Rtems
RTEMS, 即: 实时多处理器系统(Real Time Executive for Multiprocessor Systems),是一个开源的无版税实时嵌入操作系统RTOS。
它最早用于美国国防系统,早期的名称为实时导弹系统(Real Time Executive for Missile Systems),后来改名为实时军用系统(Real Time Executive for Military Systems),现在由OAR公司负责版本的升级与维护。无论是航空航天、军工,还是民用领域RTEMS都有着极为广泛的应用。
Ⅲ 5.2 Linux中断注册
注册中断最常用的函数是request_irq
第 1个参数 irq 为中断号
第 2 个参数 handler 为要中断服务函数
第 3 个参数 flags为中断标志位包含触发方式,是否共享,是否支持嵌套等
第 4 个参数 name,通常是 设备驱动程序的名称。该值用在 /proc/interrupt 系统文件上
第 5 个参数 dev 中断名称 可作为共享中断时的中断区别参数,也可以用来指定中断服务函数需要参考的数据地址。建议将 设备结构指针作为 dev参数
flags参数定义
注册中断的另一个函数是request_threaded_irq
request_threaded_irq是将中断处理函数线程化执行的接口,其实request_irq也是直接调用的request_threaded_irq,只不过线程化回调thread_fn设置为NULL,不进行中断处理程序线程化处理。
和request_irq的参数有少许差异
handler:表示中断服务例程,指向primary handler 和request_irq的中断处理函数handler类似。中断发生时优先执行primary handler;
如果primary handler 为NULL,且thread_fn不为NULL,那么执行默认primary handler = irq_default_primary_handler。
thread_fn:中断线程化,NULL表示没有中断线程化。thread_fn如果该参数不为NULL,内核会为该irq创建一个内核线程,
当中断发生时,如果handler回调返回值是IRQ_WAKE_THREAD,内核将会激活中断线程,
在中断线程中,该回调函数将被调用,所以,该回调函数运行在进程上下文中,允许进行阻塞操作。
其中
其中
Ⅳ 当处理器开始处理异常时,异常的挂起状态如何处理
热门频道
首页
博客
研修院
VIP
APP
问答
下载
社区
推荐频道
活动
招聘
专题
打开CSDN APP
Copyright © 1999-2020, CSDN.NET, All Rights Reserved
arm
打开APP
ARM异常处理(2):中断的输入和挂起的6种情况分析 原创
2022-12-05 14:14:43
tilblackout
码龄6年
关注
本节将描述中断输入和挂起的分析,这也同样适用于NMI输入,NMI在大多数情况下都将立即执行,除非:已经在执行NMI中断处理程序、由调试器暂停或由于一些严重的系统错误导致芯片锁定。
1、
当一个中断输入时,它将被挂起,然后被置于等待处理器处理请求的状态,此时即使失能该中断源,挂起的中断最后仍会触发其相应的中断处理程序,而一旦中断处理程序开始执行,该挂起状态将被自动清除。
在这里插入图片描述
2、
但是,如果挂起状态在处理器开始响应挂起中断之前被清除(例如,因为PRIMASK/FAULTMASK被设置为1,中断没有被立即执行,且挂起状态需要通过软件写NVIC中断控制寄存器来清除),此时中断是可以被取消的。
在这里插入图片描述
中断的挂起状态可以通过访问NVIC寄存器来读写,所以用户可以清除一个挂起的中断标志位或者用软件设置挂起寄存器以挂起一个新的中断。
3、
当处理器开始执行一个中断时,该中断的状态变为active,且挂起的位将被自动清除。同一个中断处理函数在处理的过程中不能嵌套,只有当异常退出(exception exit)将其active状态被清除后,才可以继续响应同一中断。
在这里插入图片描述
4、
如果中断源继续发送中断请求信号,中断将会在终端服务处理函数的最后被再次挂起。
在这里插入图片描述
5、
如果一个中断在被处理之前在中断请求线上产生了多个脉冲,它将被处理一次。
在这里插入图片描述
6、
如果一个中断的请求被取消,然后在中断服务程序中再次被触发,它将再次被挂起
在这里插入图片描述
总结:
即使中断被失能,挂起的中断仍然可能产生
被失能的挂起的中断在后面将其使能时仍然可以被触发
因此,在启用中断之前,检查是否设置了挂起寄存器是很有用的。中断源可能在你启用之前就已经被激活并设置了挂起状态。如果有必要,可以在启用中断之前清除挂起状态。
点击阅读全文
打开CSDN,阅读体验更佳
【RTOS】ARM Cortex-M异常处理过程
Cortex-M3与Cortex-M4 1. 处理器输入、输出和外设访问 一般来说,外设在使用前需要初始化,一般包括以下几步: 如果需要,设置时钟控制回路使能连接到外设和对应引脚的时钟。许多现代微控制器允许对时钟信号分布的精细调节,如使能/禁止到每个外设的时钟连接以节省功耗。外设时钟一般是默认关闭的,需要在编程外设前使能时钟。有些情况下,可能还需要使能外设总线系统的时钟。 有些情况下,可能还需要配置I/O引脚的操作模式。大多数微控制器都有复用的I/O引脚,可用于多种目的。为了使用外设,配置I/O引脚以匹配
继续访问
ARM:ARM中断异常的处理流程
裸板开发中,使用的就是现在的框架: ……………………………………………………………… main (void) { // 一系列的初始化 while (1) { // 周期性的事物 } } ↓+↓ 异常处理 (异步事件的处理) ………………………
继续访问
ARM V8A体系结构-第十章 AArch64异常处理
概述 严格地说,中断是指中断软件执行的流程。然而,在ARM术语中,这通常称为异常。异常是指需要特权级(异常处理程序)执行某些操作以确保系统顺利运行的条件或系统事件。每个异常都有一个相关的异常处理程序。一旦异常得到处理,特权级软件会将core恢复到处理异常前的位置,以继续处理它正在做的事情。 存在的异常类型如下: 中断: 有两种类型的中断称为IRQ和FIQ。FIQ的优先级高于IRQ。 ...
继续访问
最新发布 ARM异常处理(1):异常类型、优先级分组和异常向量表
Cortex-M3提供了一个功能丰富的异常体系结构,它支持很多系统异常和外部中断。异常编号1-15表示系统异常,16及以上表示外部中断输入。大多数异常具有可编程优先级,少数具有固定优先级。当前正在运行的异常可以通过特殊寄存器或者中的字段来查看。当一个使能的异常产生但不能被立即执行的时候(比如有一个更高优先级的中断服务程序正在处理),它会被挂起。
继续访问
ARM中断和异常
中断的定义:在CPU在执行一个程序时,对系统发生的某个事情,作出一种反应:CPU暂停正在执行的程序,保护现场后自动转去处理相应的事件,处理完该事情,到会返回刚才的位置。 例子:如读盘,盘有问题,无法读,产生中断,解决后,程序恢复,软件错误也会中断。 特点: 1) 中断随机的,提高实时性。 2) 中断是可恢复的 3) 中断是自动进行处理的 中断源
继续访问
ARM 之六 Cortex-M 内核中断/异常系统、中断优先级/嵌套 详解
问题 最近在使用STM32F3芯片的时候,遇到这样一个问题:如果外部中断来的频率足够快,上一个中断没有处理完成,新来的中断如何处理? 在调试时,发现有中断有 挂起、激活、失能等状态,考虑这些状态都是干啥用的呢!他们是Cortex-M核所共有的,因此这里不针对与具体用的STM32 MCU,直接上升到 Cortex-M内核来了解一下! 简介 中断(也称为“异常”)是微控制器一个很常见的特性。中断一......
继续访问
Linux操作系统原理与应用05:中断和异常
目录 1. 中断概述 1.1 什么是中断 1.2 为什么引入中断 1.3 中断的分类 1.4 CPU什么时候响应中断 2. 中断控制器简介 2.1 中断的C/S模型结构 2.2 作为中介的中断控制器 2.3 高级可编程中断控制器(APIC) 2.4 机制与策略分离的中断机制 3. Linux内核中断子系统框架 4. 中断向量与中断描述符表 4.1 中断向量 4.1.1 中断向量的概念 4.1.2 中断向量的分配 4.2 中断描述符表(IDT) 4.2.1 实模式中断向量表
继续访问
ARM 处理器 ~ 中断与异常
教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社 中断与异常定义ARM 中的工作模式除 User 和 System 外,均为异常模式,这里的异常是广义的,包含以下三类情况外部中断(外部中断)由于 CPU 外部的原因而改变程序执行流程,属于异步事件,可以屏蔽软件中断(自陷) 通过处理器拥有的软件指令,可预期地使正在执行的程序改变执行流程,以执行特定的程序 显式的事件,无条件执行 属同步事
继续访问
嵌入式-ARM-学习总结(7):按键与中断
嵌入式-ARM-学习总结(7):按键与中断一、按键1.S5PV210的按键2.按键的2中相应方法:轮询方式和中断方式3.按键对应的GPIO模式设置4.轮询方式处理按键的程序流程5.代码编写6.按键消抖二、中断1.什么是中断2.为什么需要中断3.异常向量表4.异常和中断的区别和联系5.为什么中断处理要先在汇编中进行6.中断的基本过程7.S5PV210中断处理的主要寄存器三、中断代码(1)绑定中断异常向量表(2)初始化中断控制器的基本寄存器(3)绑定我们写的isr到VICnVECTADDR寄存器(4)使能中断(
继续访问
异常和中断
一、异常和中断简介 中断一般由硬件(如外设和外部输入引脚)产生的事件,它会引起程序流偏离正常的流程(如给外设提供服务)。当外设或硬件需要处理器的服务时,一般会出现下面的流程: ①外设确认到处理器的中断请求。 ②处理器暂停当前执行的任务 ③处理器执行外设的ISR,若有必要可以选择由软件清除中断请求。 ④处理器继续执行之前暂停的任务。 所有的cortex-m处理器都会提供一个用于中断处理的嵌套向量中断控制器(NVIC)。除了中断请求,还有其他需要服务的事件,将其称为异常。按照ARM的说法,中断也是一种异常。co
继续访问
十.ARM裸机学习之中断系统2(S5PV210按键外部中断及中断处理)
一.轮询方式处理按键 参考 E:\Linux\8.key_open 二.中断方式处理按键 2017/11/21 23:30 参考:http://blog.csdn.net/u010479322/article/details/51447181 http://blog.51cto.com/9291927/1787523 1.异常向量表分析: (1)、复位(
继续访问
ARM之按键K2触发中断,并在超级终端上打印‘S‘
ARM之按键K2触发中断,并在超级终端上打印'S'
继续访问
嵌入式RTOS---异常和中断处理流程
ARM中断体系 以S3C2440讲解 1 中断体系硬件原理 中断处理分为统一的中断处理和独立的中断处理; 1.1 统一的异常和中断处理 1.1.1 ARM的异常模式 所谓异常,指的是中止了程序正常的执行过程而不得不完成一些特殊的工作(异常工作)。 中断也是一种异常,中断包括由外部硬件产生的外部中断和内部硬件产生的内部中断。 异常分为同步异常(SWI 软件指令产生的异常)和异步异...
继续访问
ARM V8 程序指南—— 第十章 AArch64 异常处理(翻译)
第十章 AArch64 异常处理 严格来说,中断是说软件执行流程的东西,但是,在arm术语中,统称为异常。异常是需要特权软件(异常处理程序)执行某些操作以确保系统顺利运行的条件或系统事件。每种异常类型都有一个异常处理程序。一旦处理完异常,特权软件就会让内核准备好恢复它在处理异常之前所做的任何事情。 下面介绍了几种异常: Interrupt: 一般有两种,分为irq 和 fiq。fiq的优先级高于IRQ,这两种异常通常都与内核上的输入引脚相关。假设中断未被禁用,外部硬件断言了一个中断请求并在当前指令完成执行时
继续访问
ARM 之十二 Cortex-M 内核异常处理、异常定位方法、在线调试、Keil MDK-ARM 的使用
在 ARM 平台上开发,开发工具的选择其实并不是很多,基本可以分为三大类:Keil MDK-ARM、IAR for ARM、GCC for ARM 系,其中用的比较多的基本就是 Keil MDK-ARM、IAR for ARM 这俩。而 GCC for ARM 系的 IDE 有很多,但是他们统一都是使用 GCC for ARM 作为编译器构建套件,IDE 都是各家自定义的。例如,ST 有、SEGGER 有 Embedded Studio。 构建(Build) 从源文件到可执行文件,需要经过预处理、编
继续访问
【Linux】ARM篇八--中断实验
ARM篇8--中断实验一、前言二、准备工作三、CPU与硬件的交互方式四、轮询方式实现按键实验1、电路原图2、按键的实现五、RAM中断实现原理六、GPIO中断1、GPX1CON2、EXT_INT41CON寄存器3、EXT_INT41_MASK寄存器七、中断控制器1、ICDDCR寄存器2、ICDISER寄存器3、ICDIPTR寄存器八、中断的实现1、ICCIAR寄存器2、EXT_INT41_PEND寄存器3、ICCEOIR寄存器九、完整代码与烧入1、中断完整代码2、程序烧入步骤十、实验现象1、轮询按键实验现象.
继续访问
【ARM】arm异常中断处理知识点
ARM处理器7种类型异常 按优先级从高到低的排列如下: 复位异常(Reset) 数据异常(Date Abort) 快速中断异常(FIQ) 外部中断异常(IRQ) 预取异常(Prefetch Abort) 软件中断异常(SWI) 未定义指令异常(Underfined instruction) 当异常发生时 处理器会把...
继续访问
arm裸机的按键设置和中断
按键的物理特性 **(1)、平时没人按的时候,弹簧把按键按钮弹开。此时内部断开的。 (2)、有人按下的时候,手的力量克服弹簧的弹力,将按钮按下,此时内部保持接通(闭合)状态;如果手拿开,则弹簧作用下按钮又弹开,同时内部又断开。 (3)、一般的按键都有4个引脚,这4个引脚成2对:其中一对是常开触点(像上面描述的不按则断开,按下则闭合);一对是常闭触点(平时不按时是闭合的,按下后是断开的)** 按键的电学原理(结合原理图分析) **(1)硬件接法: SW5:GPH0_2 SW6:GPH0_3 SW78
继续访问
ARM接口实验—中断实验
ARM—中断实验
继续访问
【ARM】中断控制 ——第六篇
中断可以理解为当系统出现了意外情况,可以自动停止当前正在执行的程序,并转入执行新情况的程序中进行执行,处理完后会回到原被暂停的程序继续执行。
继续访问
arm
写评论
评论
收藏
点赞
踩
分享
打开CSDN APP阅读体验更佳
Ⅳ 什么时候会kernel panic
什么时候可能出现内核崩溃,kernrl panic呢?
Linux在中断处理程序中,它不处于任何一个进程上下文,如果使用可能睡眠的函数,则系统调度会被破坏,导致kernel panic。因此,在中断处理程序中,是不能使用有可能导致睡眠的函数(例如信号量等)。
在中断发起的软中断中,其上下文环境有可能是中断上下文,同理,也不能调用可能导致睡眠的函数。软中断执行时,全局中断是打开的,而中断程序执行时,全局中断是禁止的。
软中断除了系统调度进入点,当软中断数量频繁时,内核中有一个专门的软中断的后台程序daemon来处理其事务。
还有内核堆栈溢出,或者指针异常访问时,也会出现kernel panic。
堆栈溢出:程序循环或者多层嵌套的深度过多时,可能会导致栈溢出。
显而易见,除0异常、内存访问越界、缓冲区溢出等错误时,当这些事件发生在应用程序时,Linux内核的异常处理机制可以对这些由应用程序引起的情况予以处理。当应用程序出现不可恢复性错误时,Linux内核可以仅仅终止产生错误的应用程序,而不影响其他程序。如果上述操作发生在内核空间,就会引起kernel panic。
还有内核陷入死锁状态,自旋锁嵌套、在内核线程中,存在死循环的操作等等都会引起kermel panic。
Ⅵ linux中软中断(softirq)为什么不能嵌套
硬中断能嵌套........................嗯..........这个说法很奇怪................
根据我的理解是硬中断能被硬中断抢断.................不知道你所谓的嵌套何指.
软中断都在下半部处理.处理时间即长.涉及资源又多.在这里需要同步的地方非常多.难度也比较高..........软中断如果没记错的话.是不能被同种类型抢断.可以被非同类型抢断.因为同类型多涉及相同资源.如果被同类抢断的话.上一个占有的资源未释放.这一个又一直得不到资源.就会一直被阻塞.造成系统进退不得.所以才禁止同类抢断.
不过在不同下半部解决方案设计中.限制也不一样.具体可以自行了解.
不知道你说的可以嵌套指的是什么东西..................
Ⅶ Linux如何及时响应外部中断
FPGA每隔100us给运行linux的ARM一个中断,要求在20us内响应中断,并读走2000*16bit的数据。
目前主要的问题是,当系统同时发生多个中断时,会严重影响linux对FPGA中断的响应时间。如何解决?
1、首先想到了ARM的FIQ,它可以打断IRQ中断服务程序,保证对外部FIQ的及时响应。但是发现linux只实现了IRQ,没有显示FIQ。
linux是从devicetree读取中断号,加入中断向量表的。
interrupts = <0x0 0x32 0x0>;中的第一个字段0表示非共享中断,非零表示共享中断,SDK产生的dts统一为0,此时第二字段的值比XPS中的小32;如果第一字段非零,则第二字段比XPS小16.
最后字段表示中断的触发方式。
IRQ_TYPE_EDGE_RISING =0x00000001,
IRQ_TYPE_EDGE_FALLING =0x00000002,
IRQ_TYPE_LEVEL_HIGH =0x00000004,
IRQ_TYPE_LEVEL_LOW =0x00000008,
很明显,devicetree根本没有提供通知linux有FIQ的渠道。
2、再来看linux的IRQ
linux的中断分为上半部和下半部,上半部运行在IRQ模式,会屏蔽所有中断,下半部运行在SVC模式,会重新打开中断。
也就是说,当一个中断的上半部正在运行时(不能再次响应中断),FPGA的中断是不能被linux响应的;
反过来,当FPGA中断的上半部正在运行时(不能再次响应中断),其他的中断也不能被linux响应;
unsigned long flags;
...
local_irq_save(flags);
....
local_irq_restore(flags);
3.
ARM有七种模式,我们这里只讨论SVC、IRQ和FIQ模式。
我们可以假设ARM核心有两根中断引脚(实际上是看不见的),一根叫 irq pin, 一根叫fiq pin.
在ARM的cpsr中,有一个I位和一个F位,分别用来禁止IRQ和FIQ的。
先不说中断控制器,只说ARM核心。正常情况下,ARM核都只是机械地随着pc的指示去做事情,当CPSR中的I和F位为1的时候,IRQ和FIQ全部处于禁止状态。无论你在irq
pin和fiq pin上面发什么样的中断信号,ARM是不会理你的,你根本不能打断他,因为他耳聋了,眼也瞎了。
在I位和F位为0的时候,当irq
pin上有中断信号过来的时候,就会打断arm的当前工作,并且切换到IRQ模式下,并且跳到相应的异常向量表(vector)位置去执行代码。这个过程是自动的,但是返回到被中断打断的地方就得您亲自动手了。当你跳到异常向量表,处于IRQ的模式的时候,这个时候如果irq
pin上面又来中断信号了,这个时候ARM不会理你的,irq
pin就跟秘书一样,ARM核心就像老板,老板本来在做事,结果来了一个客户,秘书打断它,让客户进去了。而这个时候再来一个客户,要么秘书不断去敲门问,要么客户走人。老板第一个客户没有会见完,是不会理你的。
但是有一种情况例外,当ARM处在IRQ模式,这个时候fiq pin来了一个中断信号,fiq
pin是什么?是快速中断呀,比如是公安局的来查刑事案件,那才不管你老板是不是在会见客户,直接打断,进入到fiq模式下,并且跳到相应的fiq的异常向量表处去执行代码。那如果当ARM处理FIQ模式,fiq
pin又来中断信号,又就是又一批公安来了,那没戏,都是执法人员,你打不断我。那如果这个时候irq
pin来了呢?来了也不理呀,正在办案,还敢来妨碍公务。
所以得出一个结论: IRQ模式只能被FIQ模式打断,FIQ模式下谁也打不断。
在打不断的情况下,irq pin 或 fiq pin随便你怎么发中断信号,都是白发。
所以除了fiq能打断irq以外,根本没有所谓中断嵌套的情况。
Linux不用FIQ,只用到了IRQ。但是我们有时候一个中断需要处理很长时间,那我们就需要占用IRQ模式那么长的时间吗?没有,linux在IRQ模式下只是简单的记录是什么中断,马上就切换回了SVC模式,换句话说,Linux的中断处理都是在SVC模式下处理的。
只不过SVC模式下的ISR上半部关闭了当前中断线,下半部才重新打开
Ⅷ 中断服务函数能不能带形参和返回值
从本质上来讲,中断是一种电信号,当设备有某种事件发生时,它就会产生中断,通过总线把电信号发送给中断控制器。如果中断的线是激活的,中断控制器就把电信号发送给处理器的某个特定引脚。处理器于是立即停止自己正在做的事,跳到中断处理程序的入口点,进行中断处理。
(1) 硬中断
由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。
(2) 软中断
为了满足实时系统的要求 ,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。
(3) 中断嵌套
Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。
(4) 软中断指令
int是软中断指令。
中断向量表是中断号和中断处理函数地址的对应表。
int n - 触发软中断n。相应的中断处理函数的地址为:中断向量表地址 + 4 * n。
(5)硬中断和软中断的区别
软中断是执行中断指令产生的,而硬中断是由外设引发的。
硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。
硬中断是可屏蔽的,软中断不可屏蔽。
硬中断处理程序要确保它能快速地完成任务,这样程序执行时才不会等待较长时间,称为上半部。
软中断处理硬中断未完成的工作,是一种推后执行的机制,属于下半部。
(1) 注册中断处理函数
注册中断处理函数:
/** * irq: 要分配的中断号 * handler: 要注册的中断处理函数 * flags: 标志(一般为0) * name: 设备名(dev->name) * dev: 设备(struct net_device *dev),作为中断处理函数的参数 * 成功返回0 */ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
中断处理函数本身:
所以中断服务函数带不带形参和返回值主要是看中断是发生在裸机上还是实时系统中。
http://blog.csdn.net/xy010902100449/article/details/49247527
Ⅸ Linux进入临界去开关中断的几种方式
进入中断时候关闭全局的中断是为了避免程序处理中断过程中,再进入另一个中断打乱执行的顺序,也就是为了防止中断嵌套的情况发生。比如在irq_handler函数中首先就应该关闭中断。或者,在某些操作顺序中是不允许中断发生打断的情况。例如在驱动中常用的方式:
unsigned int flag;
local_irq_save(&flag);
... ... ... ...
local_irq_restore(&flag);
spin_loc_irqsave 禁止中断(只在本地处理器)在获得自旋锁之前; 之前的中断状态保存在 flags 里. 如果你绝对确定在你的处理器上没有禁止中断的(或者, 换句话说, 你确信你应当在你释放你的自旋锁时打开中断),你可以使用 spin_lock_irq 代替, 并且不必保持跟踪 flags. 最后, spin_lock_bh 在获取锁之前禁止软件中断, 但是硬件中断留作打开的。