中断处理

ARM的七种工作模式

折月煮酒 提交于 2019-12-06 02:27:18
一、ARM处理器7种工作模式(特权模式 特权模式异常模式) 用户模式(USR):正常程序执行模式,不能直接切换到其他模式 系统模式(SYS):运行操作系统的特权任务,与用户模式类似,但具有可以直接切换到其他模式等特权 快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式 中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式 管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发) 中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处 未定义模式(UND):支持硬件协处理器的软件仿真,未定义指令异常响应时进入此模式 表3-1 ARM处理器工作模式 处理器工作模式 特权模式 异常模式 说明 用户(user)模式 用户程序运行模式 系统(system)模式 该组模式下可以任意访问系统资源 运行特权级的操作系统任务 一般中断(IRQ)模式 通常由系统异常状态切换进该组模式 普通中断模式 快速中断(FIQ)模式 快速中断模式 管理(supervisor)模式 提供操作系统使用的一种保护模式,swi命令状态 中止(abort)模式 虚拟内存管理和内存数据访问保护 未定义指令终止(undefined)模式 支持通过软件仿真硬件的协处理

CPU上下文切换详解

二次信任 提交于 2019-12-05 13:54:12
我们都知道CPU上下文切换,会增加系统负载。那什么是CPU上下文,为什么要切换? 什么是CPU上下文 我们都知道,Linux 是一个多任务操作系统,它支持远大于 CPU 数量的任务同时运行。当然,这些任务实际上并不是真的在同时运行,而是因为系统在很短的时间内,将 CPU 轮流分配给它们,造成多任务同时运行的错觉。 而在每个任务运行前,CPU 都需要知道任务从哪里加载、又从哪里开始运行,也就是说,需要系统事先帮它设置好 CPU 寄存器和程序计数器(Program Counter,PC)。 CPU 寄存器,是 CPU 内置的容量小、但速度极快的内存。而程序计数器,则是用来存储 CPU 正在执行的指令位置、或者即将执行的下一条指令位置。它们都是 CPU 在运行任何任务前,必须的依赖环境,因此也被叫做 CPU 上下文。 而这些保存下来的上下文,会存储在系统内核中,并在任务重新调度执行时再次加载进来。这样就能保证任务原来的状态不受影响,让任务看起来还是连续运行。 根据任务的不同,CPU的上下文切换可以分为不同的场景,也就是进程上下文切换、线程上下文切换、中断上下文切换。 进程上下文切换 Linux 按照特权等级,把进程的运行空间分为内核空间和用户空间,分别对应着下图中, CPU 特权等级的 Ring 0 和 Ring 3。 内核空间(Ring 0)具有最高权限,可以直接访问所有资源;

linux中断管理(二)

两盒软妹~` 提交于 2019-12-05 10:02:43
一、linux中断注册 1、request_irq函数 request_irq 函数就是驱动开发者向内核注册一个中断的接口。它有五个参数,分别是响:中断号,应中断时的中断处理函数,中断的触发方式,中断的名字,传给中断处理的参数。代码块如下: /********************************************************* * irq : 中断号 * handler : 中断处理函数 * irqflags : 中断的触发方式 * devname : 中断名称 * dev_id : 传给中断服务函数的参数 *********************************************************/ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long irqflags, const char *devname, void *dev_id) { struct irqaction *action; int retval; #ifdef CONFIG_LOCKDEP /* * Lockdep wants atomic interrupt handlers: */ irqflags |= IRQF_DISABLED; #endif /* *

Linux进程调度原理

送分小仙女□ 提交于 2019-12-05 07:23:52
Linux进程调度原理 Linux进程调度的目标     1.高效性:高效意味着在相同的时间下要完成更多的任务。调度程序会被频繁的执行,所以调度程序要尽可能的高效;     2.加强交互性能:在系统相当的负载下,也要保证系统的响应时间;     3.保证公平和避免饥渴;     4.SMP调度:调度程序必须支持多处理系统;     5.软实时调度:系统必须有效的调用实时进程,但不保证一定满足其要求; Linux进程优先级   进程提供了两种优先级,一种是普通的进程优先级,第二个是实时优先级。前者适用SCHED_NORMAL调度策略,后者可选SCHED_FIFO或SCHED_RR调度策略。 任何时候,实时进程的优先级都高于普通进程 ,实时进程只会被更高级的实时进程抢占,同级实时进程之间是按照FIFO(一次机会做完)或者RR(多次轮转)规则调度的。    首先,说下实时进程的调度   实时进程,只有静态优先级,因为内核不会再根据休眠等因素对其静态优先级做调整,其范围在0~MAX_RT_PRIO-1间。默认MAX_RT_PRIO配置为100,也即,默认的实时优先级范围是0~99。而nice值,影响的是优先级在MAX_RT_PRIO~MAX_RT_PRIO+40范围内的进程。   不同与普通进程,系统调度时,实时优先级高的进程总是先于优先级低的进程执行。知道实时优先级高的实时进程无法执行

计算机组成原理之组成_2019-10-29

假如想象 提交于 2019-12-05 07:20:55
内容主要关于计算机总线与IO设备、计算机储存器、计算机的CPU; 计算机的总线  概述   平常我们日常所见的USB,既是通用串行总线(Universal Serial Bus),它提供了提供了对外连接的接口,且不同设备可以通过USB接口进行连接;是一种连接的标准,可以解决不同设备之间的通 信问题,也能够促使外围设备接口的统一。   总线(Bus)也是计算机各种功能部件之间传送信息的公共通信干线,它是由导线组成的传输线束,按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传 输数据、数据地址和控制信号。   在不使用总线进行传输的时候,一般采用分散连接的方式,既输入设备同时与存储器、运算器、控制器连接,这样做会使得线路过于复杂。总线可以用来替代原来的基于运算器为主的分散式连接,通过总 线将多个部件连接在一起,使得运算器只需要与总线打交道,实现了存储器为主的计算机并且方便了硬件的扩展。  总线的分类   总线分为片内总线和系统总线。   片内总线    片内总线,既是高集成度芯片内部的信息传输线。如:寄存器与寄存器之间或寄存器与控制器、运算器之间。    系统总线     系统总线分为数据总线、地址总线、控制总线。是CPU、主内存、IO设备、各组件之间的信息传输线。     数据总线,可以双向传输各个部件的数据信息,数据总线的位数(宽度)

总线与输入输出子系统

江枫思渺然 提交于 2019-12-05 07:13:43
总线与I/O子系统 ​ 总线:一种用来连接各功能部件并承当部件之间信息传送任务的信息公共通路。 接口的功能与类型 I/O接口:主机和外设的衔接部分,位于总线和外部设备之间。 I/O接口的基本功能: ​ 设备寻址: 接收CPU送来的地址码,选择接口中的寄存器供CPU访问。 ​ 数据缓冲: 实现主机和外设的匹配速度,缓冲深度和传送的数据量有关。 ​ 预处理功能: 串 —并格式转换(串口);数据通路宽度转换(并口);高—低电平转换 ​ 控制逻辑功能: 接收主机CPU的控制命令、保存状态信息,协助主机实现对I/O传送操作的控制。 对接口中寄存器编址: ​ 单独编址:为接口中的每个寄存器(I/O端口)分配独立的端口地址(可与主存地址重叠) ​ 与主存统一编址:把接口中的寄存器(I/O端口)当成特殊的主存单元,并与其他主存单元统一编址。I/O端口地址将占据主存的部分地址空间。 I/O接口的分类: ​ 按数据传送格式划分: 并行接口:接口两侧均并行传输数据; 串行接口:接口与外设一侧串行传送; ​ 按时序控制方式划分: 同步接口:接口与系统总线的信息传送采用同步方式控制; 异步接口:接口与系统总线的信息传送采用异步方式控制; ​ 按I/O操作的控制方式: PIO 接口,程控方式; 中断接口,可采用查询方式; DMA接口,可插入中断做DMA善后处理; IOP/PPU接口,专用处理器/机方式。 总线

GPIO常见问题分析

被刻印的时光 ゝ 提交于 2019-12-05 07:08:18
1. GPIO中断 GPIO中断处理函数中千万不要写耗时的处理函数。 中断防抖一般使用定时器,通过定时器的回调判断GPIO的电平,当然在电平变化的时候可能再来中断,就关闭定时器重起定时器。 一般GPIO中断回调函数的调用可以写在一个线程中。当防抖成功之后,抛消息给这个线程 来源: https://www.cnblogs.com/wangjian1226/p/11912926.html

并发知识点

有些话、适合烂在心里 提交于 2019-12-05 06:52:37
1、线程与进程 1. 进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。 2. 一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。 3. 区别不同 进程是资源分配的最小单位,线程是程序执行的最小单位。 进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。 线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据,而进程之间的通信需要以通信的方式(IPC)进行。不过如何处理好同步与互斥是编写多线程程序的难点。 但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响

(转载)中断和异常的再总结

☆樱花仙子☆ 提交于 2019-12-05 04:32:46
中断和异常的再总结 原文链接: https://blog.csdn.net/u011240016/article/details/53117093 @(OS) 内部异常(内中断) 故障(fault) 自陷(trap) 终止(abort) 是源自CPU执行指令内部的事件。如:非法操作码,地址越界,算术溢出, 虚存系统的缺页 ,陷入指令等引起的事件。内部异常不可被屏蔽,一旦出现立马处理。 外中断:来自CPU执行指令以外的事件。如:I/O中断,时钟中断等。   在操作系统层次上,我们多听到“异常”(Exception)而少见“中断”(Interrupt),且往往笼统地称其为异常,但处理器微体系结构规范通常会区分中断和异常。   一般而言, 中断是异步的,异常是同步的 ,所谓同步和异步的概念,又与我们网络通信或函数调用中的同步异步有所不同。中断是 来自处理器外部的I/O设备的信号 的结果,它 不是由指令流中某条指令执行引起 的,从这个意义上讲,它是异步的,是 来自指令流之外 的。   异常又分为三类:陷阱(Trap)、故障(Fault)和终止(Abort),它们都是 执行当前指令流中的某条指令 的结果,是来自 指令流内部 的,从这个意义上讲它们都是同步的。   (1)陷阱是有意而为之的异常,是明知有套还往里钻——人家要的就是这个结果,其最常见的用途就是 操作系统的系统调用 。   (2

[内核同步]自旋锁spin_lock、spin_lock_irq 和 spin_lock_irqsave 分析【转】

a 夏天 提交于 2019-12-05 01:49:50
转自: https://www.cnblogs.com/x_wukong/p/8573602.html 转自;https://www.cnblogs.com/aaronLinux/p/5890924.html 自旋锁的初衷 :在短期间内进行轻量级的锁定。一个被争用的自旋锁使得请求它的线程在等待锁重新可用的期间进行自旋(特别浪费处理器时间),所以自旋锁不应该被持有时间过长。如果需要长时间锁定的话, 最好使用信号量。 单处理器的自旋锁 : 首先,自旋锁的目的如果在系统不支持内核抢占时,自旋锁的实现也是空的,因为单核只有一个线程在执行,不会有内核抢占,从而资源也不会被其他线程访问到。 其次,支持内核抢占,由于自旋锁是禁止抢占内核的,所以不会有其他的进程因为等待锁而自旋. 最后,只有在多cpu下,其他的cpu因为等待该cpu释放锁,而处于自旋状态,不停轮询锁的状态。所以这样的话,如果一旦自旋锁内代码执行时间较长,等待该锁的cpu会耗费大量资源,也是不同于信号量和互斥锁的地方。 简单来说,自旋锁在内核中主要用来防止多处理器中并发访问临界区,防止内核抢占造成的竞争。 自旋锁内睡眠禁止睡眠问题 :如果自旋锁锁住以后进入睡眠,而此时又不能进行处理器抢占(锁住会disable prempt),其他进程无法获得cpu,这样也不能唤醒睡眠的自旋锁,因此不相应任何操作。 自旋锁为什么广泛用于内核