中断处理

Linux设备驱动程序学习(10) -时间、延迟及延缓操作

僤鯓⒐⒋嵵緔 提交于 2020-03-06 08:46:15
度量时间差 时钟中断由系统定时硬件以周期性的间隔产生,这个间隔由内核根据 HZ 值来设定,HZ 是一个体系依赖的值,在 <linux/param.h>中定义或该文件包含的某个子平台相关文件中。作为通用的规则,即便如果知道 HZ 的值,在编程时应当不依赖这个特定值,而始终使用HZ。对于当前版本,我们应完全信任内核开发者,他们已经选择了最适合的HZ值,最好保持 HZ 的默认值。 对用户空间,内核HZ几乎完全隐藏,用户 HZ 始终扩展为 100。当用户空间程序包含 param.h,且每个报告给用户空间的计数器都做了相应转换。对用户来说确切的 HZ 值只能通过 /proc/interrupts 获得:/proc/interrupts 的计数值除以 /proc/uptime 中报告的系统运行时间。 对于ARM体系结构:在<linux/param.h>文件中的定义如下: #ifdef __KERNEL__ # define HZ CONFIG_HZ /* Internal kernel timer frequency */ # define USER_HZ 100 /* 用户空间使用的HZ,User interfaces are in "ticks" */ # define CLOCKS_PER_SEC (USER_HZ) /* like times() */ #else # define

第十一周学习报告

ⅰ亾dé卋堺 提交于 2020-03-06 03:35:58
第八章 异常控制流 指令的地址的过渡称为 控制转移 控制转移序列叫做处理机的 控制流 过程中发生的突变叫做 异常控制流 8.1 异常 异常就是控制流中的突变 一部分由硬件实现,一部分由操作系统实现 当处理器检测到有事情发生时,它就会通过一张叫做异常表的跳转表,进行一个间接程序调用,到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序) 异常处理程序完成处理后: (1) 处理程序将控制返回给当事件发生时正在执行的指令 (2) 处理程序将控制返回给如果没有发生异常将会执行的下一条指令 (3) 处理程序终止被中断的程序 8.1.1 异常处理 每种类型的异常都分配了一个唯一的非负整数的异常号 在程序启动时,操作系统会分配和初始化一张称为异常表的跳转表 异常号是异常表的索引,异常表的起始地址放在一个叫做异常表基址寄存器的特殊CPU寄存器中 在处理程序处理完事件之后,它通过执行一条“从终端返回”指令,可选的返回到被中断的程序 如果异常中断的是一个用户程序,就将状态恢复为用户模式,然后将控制返回给被中断的程序 8.1.2 异常的类别 分为四类:中断、陷阱、故障、终止 1.中断 中断是异步发生的(其他都是同步发生的,叫做故障指令),是来自处理器外部的I/O设备的信号的结果 硬件中断的异常处理程序通常称为中断处理程序 中断处理程序将控制返回给应用程序控制流中的下一条指令 2.陷阱和系统调用

Linux中断处理机制

ぐ巨炮叔叔 提交于 2020-03-06 00:46:11
一:中断概述 中断是指在CPU正常运行期间,由于内外部事件或由程序预先安排的事件引起的CPU暂时停止正在运行的程序,转而为该内部或外部事件或预先安排的事件服务的程序中去,服务完毕后再返回去继续运行被暂时中断的程序。 中断类型: 同步中断由CPU本身产生,又称为内部中断。这里同步是指中断请求信号与代码指令之间的同步执行,在一条指令执行完毕后,CPU才能进行中断,不能在执行期间。所以也称为异常(exception)。 异步中断是由外部硬件设备产生,又称为外部中断,与同步中断相反,异步中断可在任何时间产生,包括指令执行期间,所以也被称为中断(interrupt)。 异常又可分为可屏蔽中断(Maskable interrupt)和非屏蔽中断(Nomaskable interrupt)。而中断可分为故障(fault)、陷阱(trap)、终止(abort)三类。 从广义上讲,中断又可分为四类:中断、故障、陷阱、终止。 二:中断处理流程 1. 中断处理流程   当中断发生时,Linux系统会跳转到asm_do_IRQ()函数(所有中断程序的总入口函数),并且把中断号irq传进来。根据中断号,找到中断号对应的irq_desc结构(irq_desc结构为内核中中断的描述结构,内核中有一个irq_desc结构的数组irq_desc_ptrs[NR_IRQS]),然后调用irq_desc中的handle

第12章 内中断

微笑、不失礼 提交于 2020-03-05 23:49:51
第12章 内中断 12.1内中断的产生 除法错误:0,表示出发错误,如执行div指令产生的除法溢出; 单步执行:1; 执行into指令:4; 执行int指令,该指令的格式为int n,指令中的n为字节型立即数,是提供的CPU的中断类型码。 12.2 中断处理程序 CPU在收到中断信息后,应该转去执行该中断信息的处理程序。 12.3 中断向量表 CPU用8位的中断类型码通过中断向量表找到相应的中断处理程序的入口地址。中断向量表就是中断向量的列表。所谓的中断向量,就是中断处理程序的入口地址。展开来说,中断向量表,就是中断处理程序入口地址的列表。 中断向量表在内存中存放,对于8086PC机,中断向量表指定存放在内存地址0处。从内存0000:0000到0000:03FF的1024个单元中存放着中断向量表。 在中断向量表中,对于8086CPU,一个表项占两个字,高地址字存放段地址,低地址字存放偏移地址。 12.4中断过程 CPU收到中断信息后,要对中断信息进行处理,首先将引发中断过程。硬件在完成中断过程后,CS:IP将指向中断处理程序的入口,CPU开始执行中断处理程序。 下面是8086CPU收到中断信息后,所引发的中断过程 12.5 中断处理程序和iret指令 中断处理程序的编写方法与子程序的编写方法比较相似,下面是常规的步骤: 1、 保存用到的寄存器 2、 处理中断 3、 恢复用到的寄存器

深入理解 Java 线程池:ThreadPoolExecutor

妖精的绣舞 提交于 2020-03-05 01:48:35
线程池介绍 在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题: 如果并发的请求数量非常多,但每个线程执行的时间很短,这样就会频繁的创建和销毁线程,如此一来会大大降低系统的效率。可能出现服务器在为每个请求创建新线程和销毁线程上花费的时间和消耗的系统资源要比处理实际的用户请求的时间和资源更多。 那么有没有一种办法使执行完一个任务,并不被销毁,而是可以继续执行其他的任务呢? 这就是线程池的目的了。线程池为线程生命周期的开销和资源不足问题提供了解决方案。通过对多个任务重用线程,线程创建的开销被分摊到了多个任务上。 什么时候使用线程池? 单个任务处理时间比较短 需要处理的任务数量很大 使用线程池的好处 引用自 ifeve.com/java-thread… 的说明: 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,使用线程池可以进行统一的分配,调优和监控。 Java中的线程池是用ThreadPoolExecutor类来实现的. 本文就结合JDK 1.8对该类的源码来分析一下这个类内部对于线程的创建,

消息邮箱的概念及其作用

蹲街弑〆低调 提交于 2020-03-05 00:20:18
RTX 的消息邮箱实际上就是消息队列,通过内核提供的服务,任务或中断服务子程序可以将一个消息 (注意,RTX 消息邮箱传递的是 消息的地址 而不是实际的数据)放入到消息队列。同样,一个或者多个任 务可以通过内核服务从消息队列中得到消息。通常,先进入消息队列的消息先传给任务,也就是说,任务 先得到的是最先进入到消息队列的消息,即先进先出的原则(FIFO)。 也许有不理解的初学者会问采用消息邮箱多麻烦,搞个全局数组不是更简单,其实不然。在裸机编程 时,使用全局数组的确比较方便,但是在加上 RTOS 后就是另一种情况了。使用全局数组相比消息邮箱主 要有如下四个问题: 使用消息邮箱可以让 RTOS 内核有效的管理任务,全局数组是无法做到的,任务的超时等机制需要用 户自己去实现 使用了全局数组就要防止多任务的访问冲突,使用消息邮箱已经处理好了这个问题。用户无需担心。 使用消息邮箱可以有效的解决中断服务程序跟任务之间消息传递的问题。 FIFO 机制更有利于数据的处理。 RTX 中断方式消息邮箱的实现 RTX 中断方式消息邮箱的实现是指中断函数和 RTX 任务之间使用消息邮箱。下面我们通过如下的框 图来说明一下 RTX 消息邮箱的实现,让大家有一个形象的认识。 运行条件 创建消息邮箱,可以存放 10 个消息。 创建 1 个任务 Task1 和一个串口接收中断。 RTX 的消息读取和存放仅支持

java中断机制

时光怂恿深爱的人放手 提交于 2020-03-04 22:46:31
java中断机制 中断线程 在 run() 方法中,如果语句执行到了最会一句,或是遇到 return 方法,或是方法中出现了没有被捕获的异常,run() 方法将会执行结束。在java中,Thread中的interrupt() 方法被调用时,线程中断状态将被置位,由于线程在运行期间,会不断的检测这个状态位,以判断程序是否被中断。 检测线程是否被中断 在实际开发中,要判断中断状态位是否被置位,首先使用静态方法 Thread.currentThread() 方法来获取当前线程,在调用 interrupted() 方法来判断中断位的状态。如下: while (!Thread.currentThread().interrupted() && more work to do) {} interrupted 和 isInterrupted 区别 interrupted 是一个静态方法,他检测当前线程是否中断,并且会清除当前线程的中断位。isInterrupted 是一个实例方法,检测线程中断位,不会清除状态位。 如何中断线程 如果线程被Object.wait, Thread.join和Thread.sleep三种方法之一阻塞,那么,它将接收到一个中断异常(InterruptedException),从而提早地终结被阻塞状态。interrupt 不会中断一个正在运行的线程。 要注意的是

si4438 cca 侦听

我们两清 提交于 2020-03-04 19:12:44
/* set GPIO0 for RSSI interrupt / CCA */ txbuf[0] = CMD_GPIO_PIN_CFG; txbuf[1] = 27; /* GPIO[0] = 27: CCA or 37: CCA_LATCH */ txbuf[2] = 0; /* GPIO[1] = DONOTHING */ txbuf[3] = 0; /* GPIO[2] = DONOTHING */ txbuf[4] = 0; /* GPIO[3] = DONOTHING */ txbuf[5] = 0; /* NIRQ = behavior not modified */ txbuf[6] = 0; /* SDO = behavior not modified*/ txbuf[7] = 0; /* GEN_CONFIG = GPIO outputs will have the highest drive strength*/ si446x_SendCommand(8, txbuf); si446x_WaitForCTS(); /* set RSSI threshold */ txbuf[0] = CMD_SET_PROPERTY; txbuf[1] = PROP_MODEM_GROUP; txbuf[2] = 0x03; /* num of property */

《操作系统》知识点复习

佐手、 提交于 2020-03-04 15:43:38
定义:操作系统是对计算机资源(硬件、软件)管理、为用户提供服务(交互、运行环境)的软件、是种系统软件。 计算机用户与硬件之间一直运行的一个程序,狭义称为内核(kernel)程序 目标:方便用户解决问题、使用计算机,通过管理软件有效使用计算机硬件资源 结构:层次 用户—》应用程序-》操作系统-》硬件 组织:启动:先确认每个设备是否正常->开启引导程序Bootstrap(主板):设备初始化、操作系统载入内存、运行进程 中断 :一个事件的触发是由软中断、硬中断实现 Ctrl+Alt+Delete快捷启动是什么中断? 软中断是执行中断指令产生的,而硬中断是由外设引发的。 硬中断的中断号是由中断控制器提供的,软中断的中断号由指令直接指出,无需使用中断控制器。 硬中断是可屏蔽的,软中断不可屏蔽。 有专门的文件标识符 标准输入:键盘 标准输出:显示器 多道程序设计的基本特征:无序性、多道性、间断性 分时系统追求:快速响应用户 I/O结构 :设备控制器有本地缓冲器,CPU负责内存与本地缓冲器之间的数据传递,设备控制器控制本地缓冲器和外设之间的。通过中断通知I/O设备操作完成 所以为了提高cpu利用率,采用DMA直接访问内存方式,以块为单位完成传送触发中断 I/O操作:同步:只有I/O结束后,用户程序才能运行 异步:I/O期间,用户程序也能运行 存储结构:存储设备:1.磁盘 2.闪存 3.固态硬盘

interrupt ,interrupted,isInterrupted 区别

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-02 18:11:19
1、interrupt interrupt方法用于中断线程。调用该方法的线程的状态为将被置为"中断"状态。 注意:线程中断仅仅是置线程的中断状态位,不会停止线程。需要用户自己去监视线程的状态为并做处理。支持线程中断的方法(也就是线程中断后会抛出interruptedException的方法)就是在监视线程的中断状态,一旦线程的中断状态被置为“中断状态”,就会抛出中断异常。 2.interrupted 是作用于当前线程,isInterrupted 是作用于调用该方法的线程对象所对应的线程。(线程对象对应的线程不一定是当前运行的线程。例如我们可以在A线程中去调用B线程对象的isInterrupted方法。) 这两个方法最终都会调用同一个方法,只不过参数一个是true,一个是false; 这两个方法很好区分,只有当前线程才能清除自己的中断位(对应interrupted()方法) package com.famous.thread; public class ThreadStopDemo { /** * * mock thread stop * * @author zhenglong * */ public static void main(String[] args) { Thread thread = new Thread(new StopThread()); thread.start