首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

10_异常与中断

R13(在所有模式下)是堆栈指针,但是当堆栈操作不需要时,它可以用作通用寄存器。 ​ R14(链接寄存器)保存BL分支指令的下一条指令的地址。当它不支持子程序的返回时,它也可以用作通用寄存器。...FIQ的优先级高于IRQ。由于FIQ在向量表中的位置以及FIQ模式下可用的更多的备份寄存器,因此FIQ还具有一些潜在的速度优势。这样可以节省将寄存器保存到堆栈时耗费的时钟周期。...ARMv7体系结构不需要外部中止的类型是同步的。例如,在一个特定的实现上,页表翻译时报告的外部异常中止被认为是精确的,但这并不是所有处理器核都需要的。...为此,异常处理程序必须将以下内容保存到堆栈中: ​ —调用处理程序时,所有需要使用的工作寄存器。 ​ —修改链接寄存器以产生与数据处理指令相同的效果。 ​...4.中断处理程序将异常返回地址保存在新模式的堆栈中,并重新启用中断。 ​ 5.它调用适当的处理程序代码。 ​ 6.完成后,中断处理程序将禁用IRQ并从堆栈中弹出异常返回地址。 ​

1.4K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux调度系统全景指南(上篇)

    而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。...中断上下文:中断代码运行于内核空间,中断上下文即运行中断代码所需要的CPU上下文环境,需要硬件传递过来的这些参数,内核需要保存的一些其他环境(主要是当前被打断执行的进程或其他中断环境),这些一般都保存在中断栈中...中断亲和力是指将一个或多个中断源绑定到特定的 CPU 上运行; 在 /proc/irq 目录中,对于已经注册中断处理程序的硬件设备,都会在该目录下存在一个以该中断号命名的目录 IRQ# ,IRQ# 目录下有一个...合理的根据自己的生产环境和应用的特点来平衡 IRQ 中断有助于提高系统的整体吞吐能力和性能; Linux系统常见中断分类 时钟中断: 时钟芯片产生,主要工作是处理和时间有关的所有信息,决定是否执行调度程序以及处理下半部分...中断上下文 中断代码运行于内核空间,中断上下文即运行中断代码所需要CPU上下文环境,需要硬件传递过来的这些参数,内核需要保存的一些其他环境(主要是当前被打断执行的进程或其他中断环境),这些一般都保存在中断栈中

    1.6K21

    Linux内核17-硬件如何处理中断和异常

    x86架构中,每个处理器包含自己的APIC,每个APIC具有32位的寄存器,内部时钟,内部定时器以及2个额外的IRQ线,LINT0和LINT1,用作APIC的中断。...所有私有的APIC都连接到I/O-APIC,组成一个多APIC系统。 图4-1展示了一个多APIC系统的原理图。I/O-APIC通过APIC总线和各个APIC连接在一起。...也就是说,中断重定向表就是外部IRQ到私有APIC的映射关系。 中断请求被分配到CPU上的方式有两种: 静态分配 按照重定向表中的定义把IRQ请求分配到相应的私有APIC高级可编程中断控制器上。...中断可以指定给单个CPU,或者一组CPU,或者所有的CPU(相当于广播)。 动态分配 IRQ请求被发送给正在运行低优先级进程的处理器的私有APIC中断控制器上。...,将其保存在堆栈中; 根据IDT表中的第N项内容,加载cs和eip寄存器。

    2.1K10

    内核中断子系统介绍

    mask_irq 和 unmask_irq 的处理; 中断控制器是否需要 eoi 回应? 何时打开 cpu 的本地 irq 中断?...arm 核上处于触发状态的中断线需要结合 SCR、HCR 和 PSTATE.DAIF 寄存器判断是否触发中断,不论当前是否处于中断。...x86 上软件使用 CLI 指令将本 CPU 的 EFLAGS 寄存器的 IF 位清 0,阻止接收中断;STI 指令将 IF 位置为 1,允许接收中断。...另外,CPU interface 还负责将这个待处理的中断按照 GROUP 属性和当前的特权级和安全域决定触发 IRQ 还是 FIQ 中断线;并且当 PE 当前处于中断时,CPU interface 还需要通过中断优先级分组的机制判断待处理的中断是否需要被通知给...Local APIC 支持 0-255 的中断向量号,它们可以同时存在于寄存器 IRR 上,引入中断优先级进行选择:优先级 = 中断向量号 / 16 因为 32 以下的中断向量号是保留的,所以可用中断优先级范围为

    1.2K21

    uCOSII操作系统移植笔记

    笔记一: 今天粗略的看了一下周立功关于uc/osII在lpc2104上的移植方面的说明,这之中印象最深的应该是irq中断和软中断方面的处理,由于arm芯片的特殊性(拥有7种处理器模式),即每种处理器模式都有自己的堆栈...语言声明的__irq关键字来完成了,移植中irq中断不能采用__irq关键字,因为c语言不能 保证堆栈结构,而uc/osII必须要保证堆栈结构。...之所以这样搞的原因是任务进行切 换的时候,都必须进入软中断的状态,而对于软中断的异常响应代码已经将任务的环境变量进行了保存,从而也不需要像osctxsw()里面规定的那样对将环 境变量进行保存。...而 osintctxsw_1以上的程序段的功能如周立功的移植说明里面的解释:前面的关于中断与c语言的接口已经说明,寄存器应当保存到任务的堆栈中,但为 了节省cpu时间和ram的空间,仅在必要的时候才将寄存器保存到任务的堆栈...osintctxsw_1,就是要实现任务的恢复运行(从新任务堆栈中恢复所有寄存器,执行中断返回指令)。

    78840

    ARM体系架构_armv7l是什么架构

    半导体厂商固然可以光购买ARM公司的设计而直接生产ARM处理器芯片,但是更好的方法是以ARM处理器为核心,在同一块芯片上配上自己开发的外围模块,形成面向特定应用和市场的专用芯片,甚至“片上系统(System...而且为了保证数据安全,一般MMU会对地址空间进行划分,只有特权模式才能访问所有的地址空间。而用户模式如果需要访问硬件,必须切换到特权模式下,才允许访问硬件。 5....通用寄存器包括R0-R15,可以分为3类: (1)未分组寄存器R0-R7 在所有运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途。...R13常用作存放堆栈指针,用户也可以使用其他寄存器存放堆栈指针,但在Thumb指令集下,某些指令强制要求使用R13存放堆栈指针。...本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

    2K30

    系统启动流程-armV7

    初始化核心模式堆栈和寄存器。 初始化任何关键的 I/O 设备。 执行NEON 或VFP 的任何必要初始化。 启用中断。 更改核心模式或状态。 处理安全世界所需的任何设置(参见第 21 章)。...例如,可能需要对将保存未初始化 C 变量的内存进行零初始化,将其他变量的初始值从 ROM 映像复制到 RAM,并设置应用程序堆栈和堆空间。...当内核存在于内存中时,基于 ARM 处理器的系统上的序列类似于台式计算机上可能发生的序列。...数据结构被组织成一棵树,有一个名为 / 的根节点。除根节点外,每个节点都有一个父节点。每个节点都有一个名称,并且可以有任意数量的子节点。节点还可以包含具有任意数据的命名属性值,它们以键值对表示。...内核必须处于超级用户模式,并设置 CPSR寄存器的 I 和 F 位(禁用 IRQ 和 FIQ)。R0 必须包含 0,R1 是 MACH_TYPE 值,R2 是标记参数列表的地址。

    1.1K10

    嵌入式:ARM的工作模式与寄存器组织

    它供需要访问系统资源的操作系统任务使用,但避免了使用与异常模式有关的附加寄存器,这就使得当任何异常出现时,都不会使任务的状态不可靠。...这意味着在所有处理器模式下,它们每一个都访问的是同一个物理寄存器。它们是真正并且在每种状态下都统一的通用寄存器。...LR 程序计数器R15 寄存器R15被用作程序计数器,也称为PC R15值的改变将引起程序执行顺序的变化,这有可能引起程序执行中出现一些不可预料的结果 ARM处理器采用多级流水线技术,因此保存在R15...的程序地址并不是当前指令的地址 一些指令对于R15的用法有一些特殊的要求 ARM程序状态寄存器 所有处理器模式下都可以访问当前的程序状态寄存器CPSR。...程序员可以直接访问8个通用的寄存器(R0~R7),程序计数器PC、堆栈指针SP、连接寄存器LR和当前状态寄存器CPSP。每一种特权模式都各有一组SP,LR和SPSR。

    1K20

    开发应该知道的Linux系统分析-CPU篇

    简要介绍一下proc文件系统,因为所有的性能监控工具获取的性能指标都是从proc文件系统获取并计算得出的.proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提供接口...,和大部分万兆网卡都多条IRQ输出线)。...;每个进程都会分配到一定的CPU时间一旦超时就会被高优先级的抢占掉(比如硬件中断)被扔回队列,这就是所谓的上下文切换每次上下文切换,线程所需要的资源就从CPU寄存器移除转移到队列里面 系统除了第一个进程是...进程由可执行的指令代码、数据和堆栈区组成。进程中的代码和数据部分分别对应一个执行文件中的代码段、数据段。每个进程只能执行自己的代码和访问自己的数据及堆栈区。...在多CPUs系统里,其不但能查看所有CPU的平均状况信息,而且能够查看特定CPU的信息。 你是否遇到过系统CPU整体利用率不高,而应用缓慢的现象?

    84230

    ARM(十一).ADC(1)

    项目中添加源代码 只有以下几个方面需要稍微注意一下 选择三星 S3C2440A芯片 Device 选项卡中确保是正确的设备选型(和头文件相关,寄存器的正确地址决定于此) 设定时钟频率和栈大小 Target...cpsr中的值读到R0中 ORR R0, R0, #0xc0 ;将R0与(1100 0000)进行或操作,结果放到R0中,这个过程其实是保持其它位不变,将第6(FIQ)位和7(IRQ)位置1,就是禁止所有中断...1101 0010)加载到CPSR_c中(代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE在另一个文件中定义,将中断模式中的堆栈指针...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR...#include "2440addr.h" //将"2440addr.h"包含进来,这里面放的是所有寄存器的地址宏 //查询方式使用ADC void UART0Init(void)

    54940

    Linux内核22-软中断和tasklet

    那么,将这些任务从中断处理程序中剥离出来,可以有效地保证内核对于中断响应时间尽可能短。这对于时间苛刻的应用来说,这是一个很重要的属性,尤其是那些要求中断请求必须在毫秒级别响应的应用。...如果内核没有使用多个内核态堆栈,该宏查找的是当前进程的thread_info描述符。但是,如果使用了多个内核态堆栈,则查找irq_ctx联合体中的thread_info描述符。...执行local_irq_save来保存IF标志的状态,并在本地CPU上禁用中断。 如果thread_union等于4KB,如果有必要,切换到软IRQ堆栈中。 调用__do_softirq()函数。...如果在第3步切换到软IRQ堆栈,则恢复原来的堆栈指针到esp寄存器中,然后切换到之前使用的异常堆栈中。 执行local_irq_restore恢复中断标志。...第二种策略就是do_softirq()函数持续地检查是否有挂起的软中断。只有当所有的软中断被处理完该函数才退出。

    1.6K30

    嵌入式软件工程师笔试面试指南-ARM体系与架构

    所谓特权模式,即具有如下权利: a. MRS(把状态寄存器的内容放到通用寄存器); b. MSR(把通用寄存器的内容放到状态寄存器中)。...通用寄存器包括R0-R15,可以分为3类: 未分组寄存器R0-R7 在所有运行模式下,未分组寄存器都指向同一个物理寄存器,他们未被系统用作特殊的用途。...回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后再传输下一个数据。...回应(用来确定这个设备是否存在),然后就可以传输数据,传输数据之后,要有一个回应信号(确定数据是否接受完成),然后在传输下一个数据。...大端模式:低位字节存在高地址上,高位字节存在低地址上。 小端模式:高位字节存在高地址上,低位字节存在低地址上。

    1.7K50

    ARM架构的一次充电

    x0-x7: 用于传递子程序的参数和返回值,使用时不需要保存,多余的参数用堆栈传递,64位的返回结果保存在x0中; x8: 它是用于保存子程序的返回地址,使用时不需要保存; x9-x15: 它是临时寄存器...,也叫可变寄存器,子程序使用时不需要保存; x16-x17: 子程序内部调用寄存器(IPx),使用时不需要保存,尽量不要使用; x18: 它是平台寄存器, 它的使用与平台相关, 尽量不要使用; x19-...Arm 架构有2种异常类型:IRQ(外部中断异常)和FIQ(快速中断异常),旨在用于生成外设中断,在IRQ和FIQ都具有独立的路由控制,通常用于实现安全和非安全中断。...处理元件 (PE) 将更新当前状态并分支到向量表中的某个位置。通常这个位置将包含通用代码,用于将当前程序的状态推送到堆栈上,然后分支到进一步的代码。 异常产生的指令主要有2个:SWI和BKPT。...通过这4M的窗口可以重复映射所有的高端内存; 4、固定映射区(1020—1024M): 这4M的地址是有特定用途的固定地址,这4M的区域映射的物理内存作为ACPI电源管理等寄存器的地址。

    1.1K20

    C和汇编如何互相调用?嵌入式工程师必须掌握

    帧指针 R12 ip 指令指针 R13 sp 栈指针 R14 lr 连接寄存器 2、堆栈使用规则: ATPCS规定堆栈为FD类型,即满递减堆栈。...在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的. 3、参数的传递规则: 根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的...在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。...然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈....浮点参数将按照下面的规则传递: (1)各个浮点参数按顺序处理; (2)为每个浮点参数分配FP寄存器; 分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3

    1.9K40

    ARM(十).RTC and TICK(1)

    创建项目文件 项目中添加源代码 只有以下几个方面需要稍微注意一下 选择三星 S3C2440A芯片 Device 选项卡中确保是正确的设备选型(和头文件相关,寄存器的正确地址决定于此) 设定时钟频率和栈大小...cpsr中的值读到R0中 ORR R0, R0, #0xc0 ;将R0与(1100 0000)进行或操作,结果放到R0中,这个过程其实是保持其它位不变,将第6(FIQ)位和7(IRQ)位置1,就是禁止所有中断...R0中 LDR R1, =0xFFFFFFFF ;将全1加载到R1中 STR R1, [R0] ;将全1加载到中断配置寄存器中,让所有中断屏蔽掉 LDR R0, =INTSUBMSK...1101 0010)加载到CPSR_c中(代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE在另一个文件中定义,将中断模式中的堆栈指针...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    87230

    ARM(九).RTC and ALARM(1)

    新建文件夹 创建项目文件 项目中添加源代码 只有以下几个方面需要稍微注意一下 选择三星 S3C2440A芯片 Device 选项卡中确保是正确的设备选型(和头文件相关,寄存器的正确地址决定于此) 设定时钟频率和栈大小...cpsr中的值读到R0中 ORR R0, R0, #0xc0 ;将R0与(1100 0000)进行或操作,结果放到R0中,这个过程其实是保持其它位不变,将第6(FIQ)位和7(IRQ)位置1,就是禁止所有中断...R0中 LDR R1, =0xFFFFFFFF ;将全1加载到R1中 STR R1, [R0] ;将全1加载到中断配置寄存器中,让所有中断屏蔽掉 LDR R0, =INTSUBMSK...1101 0010)加载到CPSR_c中(代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE在另一个文件中定义,将中断模式中的堆栈指针...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR

    83310

    ARM(十四).WatchDog with IRQ

    概要 ---- 看门狗 要求 使用 ARM 板上的看门狗实现自动复位功能 看门狗电路原理图 蜂鸣器电路原理图 创建项目 创建项目的总体过程就是 新建文件夹 创建项目文件 项目中添加源代码 只有以下几个方面需要稍微注意一下...cpsr中的值读到R0中 ORR R0, R0, #0xc0 ;将R0与(1100 0000)进行或操作,结果放到R0中,这个过程其实是保持其它位不变,将第6(FIQ)位和7(IRQ)位置1,就是禁止所有中断...1101 0010)加载到CPSR_c中(代表禁止所有中断,使用ARM模式,进入中断模式) LDR SP, =IRQStack_BASE ;IRQStack_BASE在另一个文件中定义,将中断模式中的堆栈指针...,{R0-R12, PC}^ ;进行现场恢复,将之前压栈的环境变量从堆栈中读出,覆盖到当前的寄存器中,在LDM指令的寄存器列表中包含有PC时使用'^',那么除了正常的多寄存器传送外,将SPSR拷贝到CPSR...#include "2440addr.h" //将"2440addr.h"包含进来,这里面放的是所有寄存器的地址宏 volatile int i=0,j=0; //定义两个全局变量 void

    99640

    ARM 架构简介_芯片arm架构

    ,而且指令集实施加载存储式架构,也就意味着能够直接处理内存中内容的指令只有加载和存储指令,如果需要对内存中的值执行任何处理,程序必须将这些值加载到寄存器中,执行所需的处理,然后将结果存回到内存中,其他常见架构则能够直接操控或修改内存中的内容...下面我们重点讲下这些模式是如何与寄存器组交互工作的: 比如我们来看看核心切换到IRQ模式以处理外部异常时会发生什么,从图中你可以看到User模式的r13和r14切换为IRQ模式中与它们对应的寄存器,由于...r13用作堆栈指针,所以这表示IRQ中断在独立的堆栈中进行处理。...在以上描述的寄存器集合和组织适用于 Cotex-M 之外的所有ARM内核,Cotex-M 内核具有不同的寄存器集合和组织,见下图。...当一个应用程序在逐一执行各个指令时,异常来时内核要做的第一件事就是确保它能够在异常之后回到这一点上,为此我们必须对当前状态抓取一个快照,所以内核复制 CPSR 并保存在 SPSR 中,再复制PC并保存在

    2.9K40
    领券