中断服务程序

DMA简介

好久不见. 提交于 2019-11-29 15:05:14
注意: 个人整理,有误无责。 0. CPU控制的数据传输方式介绍 由CPU控制的数据传输方式有两种:查询、中断。 0.1 查询方式    查询方式是由程序控制的,如果CPU中执行的程序需要进行数据传输,CPU查询外设状态,如果外设准备好,那么进行数据传输。 0.2 中断方式    当外设需要与CPU进行数据交换的时候,外设向CPU发出中断请求,CPU中断当前执行的程序,相应外设的数据传输请求。当外设的数据传输结束后,CPU继续执行被中断的程序. 上面两种方式,数据都需经过CPU来传递,下面介绍DMA控制的数据传递。 1. DMA介绍    DMA方式,Direct Memory Access,也称为成组数据传送方式,有时也称为直接内存操作。DMA方式在数据传送过程中,没有保存现场、恢复现场之类的工作。    由于CPU根本不参加传送操作,因此就省去了CPU取指令、取数、送数等操作。内存地址修改、传送字 个数的计数等等,也不是由软件实现,而是用硬件线路直接实现的。所以DMA方式能满足高速I/O设备的要求,也有利于CPU效率的发挥。 (参考自百度) 2. 工作原理    直接存储器存取(DMA)用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传 输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。   

SylixOS定时器测试误差分析

元气小坏坏 提交于 2019-11-29 14:38:41
测试模型 1.1 测试流程 图 1.1 运行流程 如图 1.1所示为测试代码运行流程,通过GPIO拉高到拉低的时间来判断定时器的精准度。 1.2 测试方法 1.2.1 测试模型 利用ZYNQ内部私有定时器,设置定时时间250μs并绑定中断。在中断服务程序中拉高GPIO,下一次进入中断服务程序时拉低GPIO并且发送二进制信号量。在应用程序中创建高优先级任务接收二进制信号量并且模拟负载,创建10个中优先级任务模拟负载,连接示波器测量时间。 1.2.2 测试干扰项 其他不同优先级的中断; 其他负载程序; 二进制信号量; 1.3 测试结果 程序运行时会产生如图 1.2所示波形。 图 1.2 正常波形 使用示波器抓波功能,如图 1.3图 1.4所示抓取电平拉低与拉高的时间间隔,经过12小时抓取小于242μs的的波形未出现,经过12小时抓取大于258μs的波形未出现。 图 1.3 抓取小于242μs波形 图 1.4 抓取大于258μs波形 测试结果可以看到误差范围在242μs到258μs之间,所以误差大小为±8μs。 误差分析 从程序运行流程来看,到达定时时间250μs后: ○1中断产生; ○2响应中断服务程序; ○3拉GPIO; (一) 如果到达250μs定时时间时,中断产生之前发生系统关中断,则中断无法响应;SylixOS最大关中断时间7μs;此时则可能产生误差; (二)

Java中断机制

泄露秘密 提交于 2019-11-29 13:20:50
中断的原理 Java中断机制是一种协作机制,中断并不能直接终止另一个线程,而需要被中断的线程自己处理中断。 java.lang.Thread类提供了几个方法来操作这个中断状态,这些方法包括: public static boolean interrupted() 测试当前线程是否已经中断。线程的中断状态由该方法清除。 public boolean isInterrupted() 测试线程是否已经中断。线程的中断状态不受该方法的影响。 public void interrupt() 中断线程 线程1通过调用interrupt方法将线程2的中断状态置为true,2可以在合适的时候调用interrupted或isInterrupted来检测状态并做相应的处理。 类库中的有些类的方法也可能会调用中断: 如FutureTask中的cancel方法,如果传入的参数为true,它将会在正在运行异步任务的线程上调用interrupt方法, 如果正在执行的异步任务中的代码没有对中断做出响应,那么cancel方法中的参数将不会起到什么效果; 又如ThreadPoolExecutor中的shutdownNow方法会遍历线程池中的工作线程并调用线程的interrupt方法来中断线程, 所以如果工作线程中正在执行的任务没有对中断做出响应,任务将一直执行直到正常结束。 thread.stop():

操作系统运行机制

醉酒当歌 提交于 2019-11-29 05:12:56
画图操作是系统调用 交互式系统是用户交互的提出请求 使用多级反馈队列 时间片轮转 高级优先级优先 并发执行和顺序执行的不同特性: 1.并发程序在执行期间具有相互制约的关系 2.程序与计算不在一一对应 3.并发程序结果不可更改 4.并发执行的过程失去了封闭性 中断处理程序的入口地址在中断向量表上 动态请求释放系统资源进行系统调用 open文件操作类 允许抢位的系统中 一个进程从运行——>就绪 可能的事件为该进程的时间片用完 用户态到核心态通过唯一途径访管指令 核心态到用户态通过修改程序状态字PSW进行 异常:程序性中断 访管指令异常 中断:时钟中断 I/O中断 控制台中断 硬件故障中断 交互式系统调度算法的设计目标:较快的响应时间 较均衡的性能 程序中断与当前运行的程序有关 处理器包括两类寄存器:一类为用户可见寄存器 第二类为控制和状态寄存器 引起中断的事件是中断源 处理器暂停当前程序 转而进入中断处理程序 中断响应 正在出来运行程序的暂停点 中断断点 系统分为三类环境:批处理环境 交互式环境 实时环境 过程调用在调用完成前返回调用程序系统先运行调度程序再返回调用程序 PCB进程控制块主要有:进程名 进程号 存储信息 优先级 当前状态 资源清单 家族关系 消息队列 进程队列 当前打开文件 批处理调度算法:先来先服务 最短作业优先 响应比最高者优先 时间片轮转

linux中断

北城以北 提交于 2019-11-29 00:40:23
INT-中断 按照CPU与中断源(把能够提出中断请求的设备和事件称为中断源)的位置关系可分为 内部中断和外部中断。 内部中断:也称为异常中断,属于非屏蔽中断,是处理器检测到异常情况或执行软件 中断指令引起的一种中断。通常有:除法出错中断(INT0)、断点中断(INT3)、 溢出中断(INT4)和单步执行中断(INT1)等。异常又分为故障和陷阱。 外部中断:也称为硬件中断,是由CPU外部引脚触发的一种中断, 分为不可屏蔽中断NMI(INT2)和可屏蔽中断INTR。 中断源的优先权级别 内部中断最高(除单步执行中断),其次为NMI中断,再次为INTR中断。单步执行中断最低 中断响应 CPU在每条指令执行结束之后,都会去查询有无中断申请。 PIC-可编程中断控制器 PIC(programming interrupt controller),8259可编程中断控制芯片可以管理8个中断源, 通过级联可以构成64个中断向量系统 工作过程:当PIC向cpu处理器的INT引脚发送一个中断信号时候,处理器停下所做事情 询问PIC需要执行那个服务请求,PIC发送终端号,查询中断向量表,执行中断服务程序 原理:8259A芯片可以处于编程状态和操作状态,cpu可以通过IN/OUT指令对芯片 进行初始化编程,还可以通过操作字命令修改中断处理方式,完成了初始化编程, 芯片即进入操作状态

操作系统

孤街醉人 提交于 2019-11-28 21:35:18
C的内存分配 32bitCPU可寻址4G线性空间, 每个进程都有各自独立的4G逻辑地址, 其中0~3G是用户态空间, 3~4G是内核空间, 不同进程相同的逻辑地址会映射到不同的物理地址中. 其逻辑地址其划分如下: 正文段(code segment/text segment, .text段): 或称代码段, 通常是用来存放程序执行代码的一块内存区域. 这部分区域的大小在程序运行前就已经确定, 并且内存区域通常属于只读, 某些架构也允许代码段为可写, 即允许修改程序. 在代码段中, 也有可能包含一些只读的常数变量, 例如字符串常量等 . CPU执行的机器指令部分. ( 存放函数体的二进制代码 . ) 只读数据段(RO data, .rodata):只读数据段是程序使用的一些不会被改变的数据, 使用这些数据的方式类似查表式的操作, 由于这些变量不需要修改, 因此只需放在只读存储器中. 已初始化读写数据段(data segment, .data段):通常是用来存放程序中已初始化的全局变量的一块内存区域. 数据段属于静态内存分配. 常量字符串就是放在这里的, 程序结束后由系统释放(rodata—read only data). 已初始化读写数据段(RW data, .data):已初始化数据是在程序中声明, 并且具有初值的变量, 这些变量需要占用存储器空间,

中断机构和中断处理程序

筅森魡賤 提交于 2019-11-28 13:54:33
  中断在操作系统中有着重要地位,它是多道程序得以实现的基础,没有中断就没有多道程序,因此进程之间的切换是通过中断来完成的。此外,为了提高处理机的利用率和实现CPU与I/O设备的并行执行,也必须要有中断的支持。 中断和陷入 中断:是指CPU对I/O设备发来的中断信号的一种响应。CPU保护暂停当前进程,转而去处理引发中断的进程。执行完后,再返回到原进程,继续执行。I/O设备可以是字符设备(键盘),块设备(磁盘)或通信设备(网络)等。由于中断是外部造成的,所以又叫外中断。 陷入:显然,陷入是由CPU进程内部事件引发的中断,因此叫陷入或内中断。其产生的原因往往是由于进程本身出现运行时异常。 两者的区别仅仅是信号的来源 中断向量表和中断优先级 1.中断向量表   用于记录相应中断处理程序入口地址的映射表。表中有为中断类型分配的中断号和相对应的中断处理程序的入口地址。当中断来临时,由中断控制器确定中断号,再到表中寻找程序。 2.中断优先级   对于并发的中断请求,必须要给出合理的中断顺序,比如键盘中断和磁盘中断谁更重要等,要给出解决中断的优先级。 多中断的处理方式 试想一种情况:当处理机正在处理键盘引起的终端,此时又收到了高优先级的磁盘中断,应该如何处理? 1.屏蔽(禁止)中断   对于新来的中断,在当前中断未完成之前,对于其他中断不予理睬,直到当前处理完。采用先来先服务的方式。 2

用户态和内核态&操作系统

限于喜欢 提交于 2019-11-28 10:15:36
用户态和内核态 内核态:cpu可以访问内存的所有数据,包括外围设备,例如硬盘,网卡,cpu也可以将自己从一个程序切换到另一个程序。 用户态:只能受限的访问内存,且不允许访问外围设备,占用cpu的能力被剥夺,cpu资源可以被其他程序获取。 为什么要有用户态和内核态? 由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态和内核态。 用户态与内核态的切换 所有用户程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 或者从键盘获取输入等. 而唯一可以做这些事情的就是操作系统, 所以此时程序就需要先操作系统请求以程序的名义来执行这些操作. 这时需要一个这样的机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行的指令 这种机制叫系统调用, 在CPU中的实现称之为陷阱指令(Trap Instruction) 他们的工作流程如下: 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈(stack frame), 以此表明需要操作系统提供的服务. 用户态程序执行陷阱指令 CPU切换到内核态, 并跳到位于内存指定位置的指令, 这些指令是操作系统的一部分, 他们具有内存保护, 不可被用户态程序访问 这些指令称之为陷阱(trap)或者系统调用处理器

Linux性能优化从入门到实战:03 CPU篇:CPU上下文切换

ぃ、小莉子 提交于 2019-11-28 01:25:40
  linux操作系统是将CPU轮流分配给任务,分时执行的。而每次执行任务时,CPU需要知道 CPU寄存器 (CPU内置的内存)和 程序计数器PC (CPU正在执行指令和下一条指令的位置)值,这些值是CPU执行任务所依赖的环境,也就是 CPU上下文 。    CPU上下文切换 ,就是把前一个任务的CPU上下文(CPU寄存器和程序计数器)保存起来,然后加载入新任务的上下文到CPU寄存器和程序计数器中,最后跳转到程序计数器所指的位置,运行新任务。   保存下来的上下文会在系统内核中,并在任务重新调度执行时再次加载进来,让任务看起来是连续执行的。   根据任务的不同,CPU上下文切换分为进程上下文切换、线程上下文切换、中断上下文切换。       进程上下文切换   Linux把进程的运行空间分为内核空间和用户空间,并对进程按照 特权等级 划分,从内核空间Ring 0至用户空间Ring 3:Ring 0具有最高权限,可以直接访问所有资源;Ring 3只能访问受限资源,不能直接访问内存等硬件设备,需要通过 系统调用 陷入到内核中,才能访问这些特权资源。      进程运行在用户空间为进程的用户态,陷入内核空间为进程的内核态。从用户态到内核态的转变,需要通过系统调用来完成,期间涉及CPU上下文的切换:先保存原来用户态指令位置,然后更新内核态指令新位置,最后执行内核态代码;系统调用结束后

探究为什么FreeRTOS 有些API不能在中断服务函数中调用,转而需要调用带ISR的版本

左心房为你撑大大i 提交于 2019-11-27 15:46:49
  用了好久的FreeRTOS以前只是知道,如果在中断服务程序中调用某一些FreeRTOS的API函数时需要注意,如果有ISR版本的一定要调用,末尾带ISR的函数,并且要调用系统的API函数,中断服务程序的中断优先级不能高于配置宏(configMAX_SYSCALL_INTERRUPT_PRIORITY)的值这是为什么呢。刚好今天受台风影响只能在家里窝着,所以就想着趁有时间看看这一部分的内容,研究一下为什么,那么废话不多说开干。   找了几个函数简化一些安全检查的内容再把一些宏函数替换后对比观察了下内容如下: TickType_t xTaskGetTickCount( void ) { TickType_t xTicks; { xTicks = xTickCount; } return xTicks; } /*-----------------------------------------------------------*/ TickType_t xTaskGetTickCountFromISR( void ) { TickType_t xReturn; UBaseType_t uxSavedInterruptStatus; portASSERT_IF_INTERRUPT_PRIORITY_INVALID(); uxSavedInterruptStatus =