中断服务程序

计算机组成:输入输出系统

老子叫甜甜 提交于 2020-01-29 18:22:09
输入输出系统 通道可以看做是DMA的升级版,通道有自己的控制器甚至是存储器、内存 通道可以执行由通道指令编写的程序,由操作系统完成 如果使用通道,就不是连接接口了,而是连接设备管理器 I/O处理机可以使用微处理器甚至直接使用和主处理器相同的处理器来做,当然这就不是家用电脑的范畴了,强大的I/O处理机甚至在没有IO工作时,可以作为主机的处理器来使用 I/O和主机的连接方式 统一编址:将io地址看成内存地址的一部分。这种方式实现了io和内存的统一不需要单独的io指令,CPU指令集相对简单,如果内存空间比较大(eg.64位)可以采用这种方式 单独编址: 串行速度慢,但是适合长距离传输 不便于增删设备 外部设备输出的数据可以先缓存到io接口,进行数据格式的转换等操作再输入主机 便于增删设备、采用标准接口,可移植性强 信息传送的控制方式 CPU直接对IO进行管理 缺点就是广为人知的,浪费CPU DMA请求:向CPU申请占用一个存取周期的总线控制权从而将外部设备的数据加载到内存中,这个周期内CPU不能使用总线对内存进行访问,但是这段时间CPU依然可以正常使用(由于CPU会预先取一部分指令,这段时间不能访问内存有可能影响不大) 外部设备简介 主观图像:用户绘制的图像,由点线面构成,就是简单的那种 客观图像:eg.GUI A:模拟信号 D:数字信号 IO接口 为什么使用接口 主机可能使用并行传输

QNX驱动开发——中断处理 http://www.cnblogs.com/splovecyk/p/4383162.html的描述

感情迁移 提交于 2020-01-29 05:32:04
中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感) http://blog.csdn.net/samantha_sun/article/details/6790492 1,中断处理程序中不能使用有睡眠功能的函数,如ioremap,kmalloc,msleep等,理由是中断程序并不是进程,没有进程的概念,因此就没有休眠的概念; 2,中断处理程序中的延时可以用忙等待函数来代替,如ndelay,udelay,mdelay等,这些函数在实现上本质是根据CPU频率进行一定 次数的循环;最好不要使用mdelay,因为毫秒延时对内核来说已经是非常大了。而在中断处理程序中使用msleep却绝对不行。(见linux设备驱动开发详解第二版p210页) 3,printk函数在中断处理函数中可以使用,但是会占用较多时间,降低效率。在调IIC驱动的时候,由于IIC读取写入处理时必须进行一定延 时,在我没有使用udelay的时候,竟然用printk就使IIC中断正常运行,当时在调试的时候,发现有些printk加上程序就正常,去掉就不正 常,当时真是匪夷所思,但现在明白了,因此printk占用时间比较大,正好充当了IIC延时的功能。最后我把printk全部去掉,在需要延时的地方加 入udelay,才使程序正常运行。 4,使用for和while等的空循环在中断处理函数中进行延时操作

Java 并发:线程基础

怎甘沉沦 提交于 2020-01-29 03:57:22
线程状态转换 新建(New) 创建后尚未启动。 可运行(Runnable) 可能正在运行,也可能正在等待 CPU 时间片。 包含了操作系统线程状态中的 Running 和 Ready。 阻塞(Blocking) 等待获取一个排它锁,如果其线程释放了锁就会结束此状态。 无限期等待(Waiting) 等待其它线程显式地唤醒,否则不会被分配 CPU 时间片。 限期等待(Timed Waiting) 无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。 调用 Thread.sleep() 方法使线程进入限期等待状态时,常常用“使一个线程睡眠”进行描述。 调用 Object.wait() 方法使线程进入限期等待或者无限期等待时,常常用“挂起一个线程”进行描述。 睡眠和挂起是用来描述行为,而阻塞和等待用来描述状态。 阻塞和等待的区别在于,阻塞是被动的,它是在等待获取一个排它锁。而等待是主动的,通过调用 Thread.sleep() 和 Object.wait() 等方法进入。 死亡(Terminated) 可以是线程结束任务之后自己结束,或者产生了异常而结束。 线程使用方式 有三种使用线程的方法: 实现 Runnable 接口; 实现 Callable 接口; 继承 Thread 类。 实现 Runnable 和 Callable 接口的类只能当做一个可以在线程中运行的任务

信号和中断的比较 + 中断和异常的比较

巧了我就是萌 提交于 2020-01-28 11:56:02
概念太多了,信号,软中断,中断等等。试着做总结。 下面这个里面主要讲了硬件中断: http://www.cnblogs.com/charlesblc/p/6261741.html 下面这个里面主要讲了软中断,硬中断: http://www.cnblogs.com/charlesblc/p/6263208.html 这里先比较一下异常和中断 参考 http://blog.csdn.net/dodo_check/article/details/8806961 l 中 断(也称硬件中断) 定义:中断是由 其他硬件设备 依照CPU时钟周期信号随机产生的。 分类: 可屏蔽中断 非可屏蔽中断 来源: 间隔定时器和I/O l 异 常(也称软件中断) 定义:当指令执行时 由CPU控制单元 产生的。 分类: 处理器探测到的异常 ² 故障 ² 陷阱 ² 异常终止 编程异常(也称软中断) ² int指令 来源: 程序的错误产生的 内核必须处理的异常(例如:缺页和内核服务的请求-int) 异常处理 l 当发生异常时,CPU控制单元产生一个硬件出错码。 l CPU根据该中断吗找到中断向量表内的对应向量,根据该向量转到中断处理程序。 l 中断处理程序处理完之后向当前进程发送一个SIG***信号。 l 若进程定义了相应的信号处理程序则转移到相应的程序执行,若没有,则执行内核定义的操作。 中断处理 l

Linux网络驱动整理

大城市里の小女人 提交于 2020-01-26 00:54:26
网络设备是 完成用户数据包在网络媒介上发送和接收的设备 ,它将上层协议传递下来的数据包以 特定的媒介访问控制方式 进行发送,并将接收到的数据包传递给上层协议。应用程序使用 套接字(socket) 完成与网络设备的接口。 Linux网络设备驱动的结构 Linux 系统对网络设备驱动的驱动体系从上到下划分为4个层次,依次为为 网络协议接口层、网络设备接口层、提供实际功能的设备驱动功能层和网络设备与媒介层 ,4层的作用如下: 网络协议接口层 向 网络层协议提供统一的数据包收发接口 ,不论上层协议为 ARP 还是 IP,都通过 dev_queue_init()函数发送数据 ,并通过 netif_rx()函数接收数据 。这一层的存在使得上层协议独立于具体的设备。 网络设备接口层 向 协议接口层提供统一的用于描述具体网络设备属性和操作的结构体net_device ,该结构体是设备驱动功能层中各函数的容器。实际上,网络设备接口层从宏观上规划了具体操作硬件的设备驱动功能层的结构。 设备驱动功能层 各函数是 网络设备接口层 net_device 数据结构的具体成员 ,是驱使网络设备硬件完成相应动作的程序,它通过 hard_start_xmit()函数启动发送操作 ,并通过网络设备上的 中断触发接收操作 网络设备与媒介层 是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介

FreeRTOS 中断优先级配置(重要)

為{幸葍}努か 提交于 2020-01-24 03:01:52
以下转载自安富莱电子: http://forum.armfly.com/forum.php NVIC 的全称是 Nested vectored interrupt controller,即嵌套向量中断控制器。 对于 M3 和 M4 内核的 MCU,每个中断的优先级都是用寄存器中的 8 位来设置的。 8 位的话就可以 设置 2^8 = 256 级中断,实际中用不了这么多,所以芯片厂商根据自己生产的芯片做出了调整。比如 ST 的 STM32F1xx 和 F4xx 只使用了这个 8 位中的高四位[7:4],低四位取零,这样 2^4=16,只能表示 16 级中断嵌套。 对于这个 NVIC,有个重要的知识点就是优先级分组,抢占优先级和子优先级,下面就以 STM32 为 例进行介绍,STM32F1xx 和 F4xx 都是只使用了这个 8 位寄存器的高四位[7:4]。 从上面的表格可以看出,STM32 支持 5 种优先级分组,系统上电复位后,默认使用的是优先级分组 0,也就是没有抢占式优先级,只有子优先级,关于这个抢占优先级和这个子优先级有几点一定要说清楚。  具有高抢占式优先级的中断可以在具有低抢占式优先级的中断服务程序执行过程中被响应,即中 断嵌套,或者说高抢占式优先级的中断可以抢占低抢占式优先级的中断的执行。  在抢占式优先级相同的情况下,有几个子优先级不同的中断同时到来

UEFI EVENT 全解

点点圈 提交于 2020-01-23 09:15:36
Event和Timer在UEFI当中是怎么实现的以及原理,我们先从Timer开始,然后细细的拨开隐藏在底层的实现。 先说Timer,那什么是Timer呢?其实在中文里面我们把它叫做定时/计数器,但是我的理解它不仅仅是一个定时/计数器硬件而是一个被程序设计者设定为工作在特殊模式下的 做定时/计数器 ,仅仅是一个硬件的定时器还不能算是Timer。定时/计数器在几乎所有的数字处理器系统当中都是一个必备的设备,没有它我们的各种运行在cpu上的系统软件都会瘫痪,他们就会变成生活在桃花源当中的世外人一样,完全没有时间参考,不知世事更替,所有的原来的秩序都会变得混乱,所以来说他应该是我们系统软件人员必须要关注和处理的一个设备。 说到 做定时/计数器 ,最经典的当数intel兼容的8253/8254定时器,它几乎是所有的PC必须兼容支持的一颗IC,当然在其他的微处理器系统当中也是支持的,比如MSC8051,以及其他的微处理器当中。不过Timer不止一种在PC当中有许多的定时器可以作为Timer来使用,比如ACPI timer,HPET timer等等,虽然他们叫法不一,功能强弱不一,所提供给系统软件设计者的编程接口不完全相同,但是他们都提供了一个最基本的功能,那就是定时,计数功能。几乎所有的Timer都能在不需要外力干涉的情况下在系统的时钟脉冲的驱动之下,自动计数

接口知识点总结

浪尽此生 提交于 2020-01-22 03:20:19
数据传送三种方式:查询、中断和DMA AD主要技术指标:分辨率、转换时间、量程、绝对精度、相对精度、线性度 接口概念 微机接口就是微处理器CPU与“外部世界”的连接电路,是CPU与外界进行信息交换的中转站。其中外部世界指除CPU本身以外的所有设备或电流,包括存储器、I/O设备、控制设备、测量设备、通信设备、多媒体设备、A/D与D/A转换器等。 比如源程序或原始数据要通过接口从输入设备送进去,运算结果要通过接口向输出设备送出来;控制命令通过接口发出去,现场状态通过接口取进来,这些来往信息都要通过接口进行变换与中转。 结合芯片:中断控制器8259A、可编程并行接口8255A、可编程定时/计数器8253、可编程串行接口8251A(考) 接口的功能(考) (1)对外部设备的寻址功能 (2)信号转换功能 (3)数据缓冲功能 (4)联络功能 CPU <- - ->外设 (5)中断管理功能 (6)可编程功能 微机系统的性能指标 (1) CPU性能指标:字长、运算速度 总线宽度与字长;主频、MIPS与运算速度; 字长是CPU中运算器一次能处理的最大数据位数。 主频表示在CPU内数字脉冲信号振荡的速度。 (2) 存储器性能指标 速度、容量、位价->层次结构 (3) I/O性能指标由设备决定 显示器:分辨率、颜色深度、刷新; 声卡:采样率、采样精度 I/O端口编址方式(考) (1)统一编址 (2

计算机组成原理复习题目

微笑、不失礼 提交于 2020-01-22 02:10:21
计算机组成原理期末复习题 世界第一台通用电子计算机ENIAC,1946 第一台存储程序式计算机-EDSAC,1949 数据校验码主要有奇偶校验码、海明校验码和循环冗余校验码 磁表面存储器记录信息是利用磁性材料的磁滞回归线特性( 计算机的字长取决于运算器一次运算二进制数的位数 模m交叉存储器有m个存储模块,它们有各自的地址寄存器和数据缓冲寄存器 使用虚拟存储器时,由操作系统完成地址转换 若显示器灰度级为32,则每像素应用5位表示 RAM芯片位扩展可以增加存储器字长 输入输出指令的功能是CPU与外设的数据传送 假设校验位的个数为r,k=2r-1-r个信息能用于纠正被传送数据的位数,需满足:2r≥k+r+1 某计算机字长是16位,它的存储容量是1MB,按字编址,它的寻址范围是0-219-1 操作数在寄存器中的寻址方式称为寄存器寻址;操作数在指令中的寻址方式称为立即寻址,相对寻址中,指令地址码给出一个偏移量(带符号数),基准地址隐含由PC给出。 操作码的编码有两种方式:定长操作码法,扩展操作码编法 串行传输时数据位的低位在前,高位在后。 DMA控制器与CPU分时使用内存常采用以下三种方法:停止CPU访内,周期挪用和交替访问。 流水线中的主要相关问题指资源相关、数据相关和控制相关。 双端口存储器中一个存储器具有两组相互独立的读写控制电路,可进行并行的独立操作。

Java多线程

懵懂的女人 提交于 2020-01-20 02:54:47
《Java核心技术》第十版笔记 概念 进程具有自己变量的完备集;线程则共享相同的数据。 抢占式调度:直接中断而不需要实现和 被中断程序 协商 协作式调度:只有在被中断程序同意交出控制权之后才能执行中断 多线程实现 方法一: class MyRunnable implements Runnable { public void run ( ) { . . . } } Runnable r = new MyRunnable ( ) ; Thread t = new Thread ( r ) ; t . start ( ) ; 方法二(不建议): class MyThread extends Thread { public void run ( ) { . . . } } Thread t = new MyThread ( ) ; t . start ( ) ; Thread类 sleep(t):static|线程暂停t毫秒,暂停当前线程的活动,会抛出 InterruptedException void run() void start() static Thread currentThread():返回代表当前执行线程的Thread对象 void interrupt():发送中断请求给一个线程,中断状态为true,如果线程当前被sleep调用阻塞