中断处理

蜂鸟E203 硬件学习-两级流水线的实现(三)

蓝咒 提交于 2020-01-26 06:40:16
(二)EXU模块 EXU段包括指令译码,指令派发,指令发射,指令执行,内存操作,数据写回。而E203是简单的顺序单发射,顺序执行,顺序写回类型的处理器。 将IFU通过IR寄存器发送给EXU的指令进行译码和派遣。 通过译码出的操作数寄存器索引(Index)读取Regfile(如图中RD-Regfile) 维护指令的数据相关性(如OITF) 将指令派遣(Dispatch)给不同的运算单元执行(ALU、Long-Pipes、LSU、以及EAI) 将指令交付(检查指令分支预测是否正确,是否产生中断和异常) 将指令运算的结果写回Regfile(WB ARB) (1)EXU译码模块 (e203_exu_decode.v) 译码模块的输入信号来自于IR阶段,包含当前需要译码的指令,执行PC,预测结果,非对齐和存储器访问错误。 首先根据最后两个比特位判断当前译码指令是RV32还是RV16,再根据指令格式,产生不同的指令类型信息。如:寄存堆的索引和控制信号,跳转类型和所需计算的信息。 输出dec_info包含很多模块的控制信息,有BJP单元的控制信息,ALU单元的控制信息,CSR单元的控制信息,乘除单元的控制信息,AGU单元的控制信息。同时还要生成后面执行所需要的各类型立即数,当执行的指令为非法指令时,译码器模块还将产生各类型的异常指令异常信息。 (2)整数通用寄存器组 (e203_exu

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()函数启动发送操作 ,并通过网络设备上的 中断触发接收操作 网络设备与媒介层 是完成数据包发送和接收的物理实体,包括网络适配器和具体的传输媒介

AVR单片机教程——UART进阶

社会主义新天地 提交于 2020-01-25 23:27:48
本文隶属于 AVR单片机教程 系列。 在第一期中,我们已经开始使用UART来实现单片机开发板与计算机之间的通信,但只是简单地讲了讲一些概念和库函数的使用。在这一篇教程中,我们将从硬件与软件等各方面更深入地了解UART。 USART组件 一直在讲的UART其实是USART组件的一部分,USART比UART多了同步的一部分,但这一部分用得太少(我从来没用过),而且缺乏实例,所以就略过了。然而,单片机的设计者很机智地把这个鸡肋功能升华了一下,USART组件可以支持SPI模式。SPI是一种同步串行总线,可以支持很高的传输速率。这个功能使得ATmega324PA支持最多3个SPI通道,其中一个是纯SPI,另两个就是SPI模式下的USART。我们将在下一讲中揭开SPI的神秘面纱。 回到UART模式下的USART组件。开发板引出的 RX 和 TX 引脚是属于USART0组件的,因此使用时以下 n 都用 0 代替。 UART共有5个寄存器: UDRn 是收发数据寄存器,收( RXB )和发( TXB )使用不同的寄存器,但都通过 UDRn 来访问。向 TXB 写入一个字节,UART就开始发送; RXB 保存接收到的数据,带有额外一个字节的缓冲(如同下一节要讲的缓冲区)。 UCSRnA 包含UART状态位,如三个中断对应的标志,以及一些不常用的设置位。 UCSRnB 主要用于使能

linux 中断管理(一)

这一生的挚爱 提交于 2020-01-25 16:46:02
一、中断作用 Linux 内核需要对连接到计算机上的所有硬件设备进行管理。如果要管理这些设备,首先得和它们互相通信才行。 一般有两种方案可实现这种功能: 轮询(polling) 让内核定期对设备的状态进行查询,然后做出相应的处理; 中断(interrupt) 让硬件在需要的时候向内核发出信号(变内核主动为硬件主动)。 使用轮询的方式会占用CPU比较多的时间,效率极低。例如:要读取一个按键有没有被按下时,一个进程需要不断地查询按键有没有被按下。这样这个任务就占用CPU大量得时间,使得CPU做了大量的无用功。使用中断提供这样的一个机制。当按键没有被按下的时候,挂起当前进程,将控制权转交给其他进程。当按键按下的时候,操作系统把当前进程设为活动的,从而允许该进程继续执行。 二、linux中断管理 linux 内核将所有的中断统一编号,使用一个 irq_desc 结构体数组描述中断。一个数组项对用一个中断(或者是一组中断,它们共用中断号)。 struct irq_desc 结构体记录了,中断的名称、中断状态,底层硬件访问接口(使能中断,屏蔽中断,清除中断),中断处理函数的入口, 通过它可以调用用户注册的中断处理函数。 1、struct irq_desc struct irq_desc 在 include\linux\irq.h 文件里面定义 struct irq_desc { irq

Java多线程基础——Lock类

独自空忆成欢 提交于 2020-01-25 07:29:32
Java多线程基础——Lock类 转自:https://www.cnblogs.com/qifengshi/p/6354890.html 之前已经说道,JVM提供了synchronized关键字来实现对变量的同步访问以及用wait和notify来实现线程间通信。在jdk1.5以后,JAVA提供了Lock类来实现和synchronized一样的功能,并且还提供了Condition来显示线程间通信。 Lock类是Java类来提供的功能,丰富的api使得Lock类的同步功能比synchronized的同步更强大。本文章的所有代码均在 Lock类例子的代码 本文主要介绍一下内容: Lock类 Lock类其他功能 Condition类 Condition类其他功能 读写锁 Lock类 Lock类实际上是一个接口,我们在实例化的时候实际上是实例化实现了该接口的类 Lock lock = new ReentrantLock(); 。用synchronized的时候,synchronized可以修饰方法,或者对一段代码块进行同步处理。 前面讲过,针对需要同步处理的代码设置对象监视器,比整个方法用synchronized修饰要好。Lock类的用法也是这样,通过Lock对象lock,用 lock.lock 来加锁,用 lock.unlock 来释放锁。在两者中间放置需要同步处理的代码。 具体的例子如下

线程定义、生命周期、常用方法

百般思念 提交于 2020-01-24 12:55:40
目录 一 线程的定义 1.1 概述 1.2 定义 二 interrupt 终止线程的方式 终止处于“阻塞状态”的线程 终止处于“运行状态”的线程 结合 interrupted() 和 isInterrupted()的区别 参考 三线程状态 四 常用方法 sleep和wait 参考 一 线程的定义 1.1 概述 线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在 1.2 定义 1.继承Thread类 /** * 使用继承java.lang.Thread类的方式创建一个线程 * * @author DreamSea 2011-12-29 20:17:06 */ public class ThreadTest extends Thread { /** * 重写(Override)run()方法 JVM会自动调用该方法 */ public void run ( ) { System . out . println ( "I'm running!" ) ; } } 缺陷:不建议使用此方法定义线程,因为采用继承Thread的方式定义线程后,你 不能再继承 其他的类了,导致程序的可扩展性大大降低。 2.实现java.lang.Runnable接口 /** * 通过实现Runnable接口创建一个线程 * @author DreamSea */ public class

操作系统核心原理-5.内存管理(中):分页内存管理

北城余情 提交于 2020-01-23 21:24:23
   在上一篇介绍的几种多道编程的内存管理模式中,以交换内存管理最为灵活和先进。但是这种策略也存在很多重大问题,而其中最重要的两个问题就是空间浪费和程序大小受限。那么有什么办法可以解决交换内存存在的这些问题呢?答案是分页,它是我们解决交换缺陷的“不二法门”。 一、分页内存管理 1.1 解决问题之道   为了解决交换系统存在的缺陷,分页系统横空出世。分页系统的核心在于: 将虚拟内存空间和物理内存空间皆划分为大小相同的页面,如4KB、8KB或16KB等,并以页面作为内存空间的最小分配单位,一个程序的一个页面可以存放在任意一个物理页面里 。   (1)解决空间浪费碎片化问题   由于将虚拟内存空间和物理内存空间按照某种规定的大小进行分配,这里我们称之为页(Page),然后按照页进行内存分配,也就克服了外部碎片的问题。   (2)解决程序大小受限问题   程序增长有限是因为一个程序需要全部加载到内存才能运行,因此解决的办法就是使得一个程序无须全部加载就可以运行。使用分页也可以解决这个问题,只需将当前需要的页面放在内存里,其他暂时不用的页面放在磁盘上,这样一个程序同时占用内存和磁盘,其增长空间就大大增加了。而且,分页之后,如果一个程序需要更多的空间,给其分配一个新页即可(而无需将程序倒出倒进从而提高空间增长效率)。 1.2 虚拟地址的构成与地址翻译   (1)虚拟地址的构成   在分页系统下

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都能在不需要外力干涉的情况下在系统的时钟脉冲的驱动之下,自动计数

Java面试题-并发篇十六

孤者浪人 提交于 2020-01-23 03:39:17
161,Java内存模型是什么? Java内存模型规定和指引Java程序在不同的内存架构、CPU和操作系统间有确定性地行为。它在多线程的情况下尤其重要。Java内存模型对一个线程所做的变动能被其它线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了: 线程内的代码能够按先后顺序执行,这被称为程序次序规则。 对于同一个锁,一个解锁操作一定要发生在时间上后发生的另一个锁定操作之前,也叫做管程锁定规则。 前一个对volatile的写操作在后一个volatile的读操作之前,也叫volatile变量规则。 一个线程内的任何操作必需在这个线程的start()调用之后,也叫作线程启动规则。 一个线程的所有操作都会在线程终止之前,线程终止规则。 一个对象的终结操作必需在这个对象构造完成之后,也叫对象终结规则。 可传递性 更多介绍可以移步并发编程网: (深入理解java内存模型系列文章:http://ifeve.com/java-memory-model-0) 162,Java中interrupted 和isInterruptedd方法的区别? interrupted() 和 isInterrupted()的主要区别是前者会将中断状态清除而后者不会。Java多线程的中断机制是用内部标识来实现的,调用Thread

ARM裸机开发(二)中断编程

青春壹個敷衍的年華 提交于 2020-01-22 20:52:48
以下裸机程序基于GT2440,编译器为arm-linux-gcc-4.4.3。 程序布局:源代码由interrupt.S和led.c两个文件组成,interrupt负责初始化工作,led.c里定义了中断处理程序。 程序流程:首先安装异常向量表,在复位异常里关闭看门狗,然后进入普通中断模式,设置普通中断的栈指针(为C语言写的中断处理程序做准备),接着设为特权模式,初始化中断(设置IO管脚,开启中断),最后CPU一直死循环等待外部中断触发。当外部中断到来时,先保护现场,跳到led.c里的handle_irp()函数,在该函数里将四个LED点亮,接着返回,最后恢复现场,返回到死循环。 interrupt.S: 1 //寄存器物理地址宏定义 2 #define WTCON 0x53000000 3 4 #define GPFCON 0x56000050 5 #define nGPF_INT2 (0x02<<4) 6 #define nGPF_INT0 (0x02<<0) 7 #define EXINT0 0x56000088 8 9 #define SRCPND 0X4A000000 10 #define INTMOD 0X4A000004 11 #define INTMSK 0x4A000008 12 #define PRIORITY 0x4A00000C 13 #define