C14 流式IO和文件

合集下载

PIC单片机教程-内部硬件资源之I-O口

PIC单片机教程-内部硬件资源之I-O口

PIC单片机教程-内部硬件资源之I/O口I/O 口单片机作为一个控制器件必定有数据输入和输出。

输入量可能是温度、压力、转速等,而输出量可能是开关量和数据,以保证受控过程在规定的范围内运行。

数据的输入和输出都需通过单片机内部有关电路,再与引脚构成输入/输出(I/O)端口。

PIC16F84 单片机芯片有两个I/O 端口(PROTA 和PORTB)。

端口A 为5 位口,端口B 为8 位口,共占用13 位引脚。

每个端口由一个锁存器(即数据存储器中的特殊功能寄存器05H、06H 单元)、一个输出驱动器和输入缓冲器等组成。

当把I/O 口作输出时,数据可以锁存;作输入口时,数据可以缓冲。

16F84 PORTA 口中的RA4 是斯密特触发输入、漏极开路输出。

而其它的RA 口引脚都是TTL 电平输入和全CMOS 驱动输出。

端口PORTB 是一个八位双向可编程I/O 口。

各端口虽然也由锁存器、驱动器、缓冲器等构成,但因功能略有不同而导致电路亦存在差别。

现以PORTA 口的RA0 ~RA3 的电路(见左图)为例,说明其基本工作原理。

图中RA 口的I/O 引脚是由数据方向位(寄存器TRISA)来定义数据流向。

当TRISA 寄存器的位置为“1”时,其输出驱动器(由P 沟道和N 沟道MOS 管串接而成)呈高阻态,即两个MOS 管均截止,I/O 口被定义为输入。

此时,数据由I/O 端输入,经TTL 输入缓冲器到D 触发器。

当执行读指令时,此D 触发器使能,数据经三态门进入数据总线。

当TRISA 的位置为“0”时,I/O 口被定义为输出,此时输出锁存器的输出电平就是I/O 口的输出电平。

读PORTA 寄存器的结果就是读取I/O 引脚上的电平,而写PORTA 寄存器的结果是写入I/O 锁存器。

所有的写I/O 口的操作都是一个“读入/修改/写入”的过程,即先读I/O 引脚电平,然后由程序修改(按要求给定一个值),再置入I/O 锁存器。

Linux中的IO系统

Linux中的IO系统

网络
I/O的另一个例子是网络,由Berkeley UNIX首创并在Linux 引入。在Berkeley 的设计中,嵌套字是关键概念。
发送进程
接受进程
嵌套字
图1 网络中使用嵌套字
嵌套字允许用户连接到网络,就像邮筒允许用户连接到邮 政统一样。嵌套字的位置如图1。
每种嵌套字支持一种特定的网络类型,这在嵌套字创建时
图三 典型字符设备支持的部分文件操作
I/O系统被划分为两大部分:处理块特殊文件的部分和处理
字符特殊文件。 系统中处理块特殊文件I/O部分的目标是它必须完成的传输
次数最小。为了实现这个目标,Linux系统在磁盘驱动程序
和文件系统之间放置了一个高速缓存(cache)。 与字符设备的交互是很简单的。因为字符设备产生和接收 的是字符流或字节数据,所以让字符设备支持随机访问是 几乎没有意义的。当然,除了行规则以外。
用"CTRL+C"去中断正在运行的程序。当然,这些方法并
不是唯一的。且Linux允许自定义这些特殊功能。Linux提 供一个专门的系统调用用来设置这些选项,只有字符特殊
文件可以使用这个系统调用。
另外,每个特殊文件都与一个设备的设备驱动相匹配。每 每个设备驱动程序都用主设备号和副设备号来标识,主设 备号与副设备号能够唯一确定一个I/O设备。
Linux中的I/O系统
基本概念
Linux和其他的UNIX系统一样,I/O系统相当的简洁明了。 Linux计算机也像所有计算机一样具有磁盘、打印机、网 络等I/O设备。需要一些策略才能使程序访问这些设备。 Linux把设备当作一种 特殊文件 整合到文件系统中。每 个I/O设备都被分配一条路径,通常在/dev目录下。如打 印机的路径可能是 “/dev/lp”。 访问这些特殊文件与访问普通文件的方式相同,常用open、 read、write等系统调用。 例如: cp file/dev/lp

MLC 9000+ 说明书

MLC 9000+ 说明书

保修
我们可以担保这些产品在出厂之前,在材料和工艺方面无任何功能缺陷,并且可以担保此类 产品在三年内符合相关说明手册资料中所提到的技术规范。 除此处及上述所提及的保修条例外,无任何其他明示或暗示保修。WEST 不会因任何特殊原 因对该产品的适销性和适用性做任何担保。
限制
对于任何意外损坏、后续损坏、特殊损坏或任何其他损坏,或者除上述所提及的任何维修或 更换之外的成本或费用,供应商概不承担责任。用户必须按照说明安装和维护产品。对于因 腐蚀性而造成的产品损坏,供应商没有保修责任。用户自己对于这些产品与其应用程序的适 用性负责。对于一个有效的保修声明,产品在保修期内进行返修必须向供应商支付运费。产 品必须进行适当包装,以免在运输过程中因静电放电或其他形式的危害导致产品受损。
MLC 9000+ 用户指南
MLC 9000+ 用户指南
59371-1
价格:
£11.00 €15.00 $15.00
ii
59327,第 1 期 – 2003 年 5 月 4 日
本安装、接线和操作手册中的信息可能会有所变动,恕不另行通知。 Copyright © 2004 年 5 月,Danaher ICG,保留所有权利。未经厂商书面许可,不得以任何 形式或通过任何方式在检索系统中复制、传播、改写或存储本出版物的任何部分,或者将本 出版物的任何部分翻译成任何其他语言。 注意:
ii
59327,第 1 期 – 2003 年 5 月 4 日
MLC 9000+ 用户指南
目录
目录
1 2 MLC 9000+ 系统概述 ................................................................................

智能电表的设计

智能电表的设计

四川理工学院课程设计书学院计算机学院专业物联网工程20121班课程无线传感器网络题目现代小区智能电表课程设计教师符长友学生胥玉环刘依粒胡伟杰宋治桦设计时间:2014年7月5日至2017年7月11日前言近年来,在低碳经济、绿色节能及可持续发展思想的推动下,如何进一步提高电网效率,积极应对环境挑战,提高供电可靠性和电能质量,完善电力用户服务,适应更加开放的能源及电力市场化环境需要,对未来电网的发展提出了更高的要求。

智能电网的概念应运而生并成为全球电力行业共同研究和探讨的热点,支撑中国乃至全球智能电网的将是通信技术、信息处理技术和控制技术。

智能电表作为智能电网建设的重要基础装备,加快智能电表产业链整合,促进其产业化,对于电网实现信息化、自动化和互动化具有支撑作用。

基于以上分析,本文研究旨在基于AT89C51单片机的智能电表的设计。

本次设计基于单片机AT89C51是以微处理器或微控制器芯片为核心的可以存储大量的测量信息并具有对测量结果进行实时分析、综合和做出各种判断能力的仪器。

一般具有自动测量功能,强大的数据处理能力,进行自动调零和单位换算功能,能进行简单的故障提示,具有操作面板和显示器,有简单的报警功能。

本文主要包括以下三个方面的工作:(1)智能电表的设计背景、优点及发展现状本文首先分析智能电表的设计背景,其次讨论智能电表的优点及相关的应用。

(2)智能电表的硬件和软件实现分析智能电表应该具备的功能,给出该仪表的总体设计框图;详细讨论了该电路的核心芯片选取、数据采集电路的设计、通信电路及输入输出系统的实现并给出了核心芯片.AT89C51的详细参数;使用结构化程序设计手段,利用单片机C语言程序实现按键的扫描并处理程序、数据的采集及后续的算法程序、红外或RS485通信方式的自动抄表程序、CPU卡的读写操作程序以及段式LCD的显示驱动程序。

(3)设计的结论分析、不足及未来的展望阐述了设计的测试结果并对结论进行了分析,给出了设计中的不足之处,并提出了将来的修改意见及改进之处,对智能电表的未来进行展望。

安全生产标准化验收评级汇报材料文书

安全生产标准化验收评级汇报材料文书

贵州永基矿业投资纳雍县康金煤矿安全生产标准化验收汇报材料尊敬的各位领导、专家,大家好!各位领导、专家来我矿进展安全生产标准化等级验收和指导工作,是对我们极大的关心和帮助,也是对我矿安全生产标准化工作的有力推进。

在此,我代表康金煤矿全体干部职工,向验收组的各位领导、专家表示热烈的欢迎和衷心的感谢!下面,就我矿安全生产标准化工作的建设情况向各位领导、专家作简要汇报:一、矿井概况纳雍县康金煤矿隶属贵州永基矿业投资,设计生产能力45万吨/年。

井田面积L5947km2,开采深度+1950〜+1400m,可采煤层9层(C3、C4、C5、C6、Cl4、CI6、C27、C28、C31),保有资源量2466万吨,设计可采储量1778.02万吨,矿井服务年限30.1年。

矿井为煤与瓦斯突出矿井,首采区27煤在鉴定范围内(+16OOm〜+195OnI 之内)无突出不安全性,一采区开采保护层作为区域防突措施;CI6、C27、C28、C31煤层无煤尘爆炸性,CI6、C27、C31煤为三类不易自燃煤层;根据本区及邻区开采情况调查,矿井无冲击地压现象。

矿床水文地质勘查类型简单型,正常涌水量为20.Im3∕h,最大涌水量为6L7m3∕h;2014年8月14日由贵州省煤矿企业兼并重组领导小组办公室、贵州省能源局以“黔煤兼并重组办[2014]84号文件〃批复保存康金煤矿为45万吨/年保存技改矿井。

2014年3月13日,贵州省国土资源厅下发了贵州永基矿业投资有限公纳雍县新房乡康金煤矿采矿许可证,证号C5200002011091110118256,有效期20年。

2018年7月4日取得安全生产许可证(黔MK安证许字[2356]号)。

二、当前生产和采掘接续部署情况目前井下布置一个11603采煤工作面和11601补运、11601补回。

接续工作面12706采面正在进展瓦斯抽采,目前采掘接续正常。

三、各生产系统简述(一)开拓系统1、阶段、采区划分矿井煤层划分为上、下两个煤组(上煤组包括C3、C4、C5、C6、C14煤层,下煤组包括CI6、C27、C28、C31煤层),矿井布置两个开采阶段,第一阶段为+195OnI〜+160Onb阶段垂高350m;第二阶段为+160Om〜+1400m,阶段垂高200%矿井划分4个采区,第一阶段下煤组划分为一采区,第二阶段下煤组划分为二采区,第一阶段上煤组划分为三采区,第二阶段上煤组划分为四采区。

CP1H系列PLC存储器的各功能区及其作用

CP1H系列PLC存储器的各功能区及其作用

PLC知识(一)用户程序存储区用户程序存储区是由多个任务构成的,程序包括作为中断使用的任务最多可编写288个。

通过CX-Programmer软件将这些程序按1:1分配到执行任务中后,传送到CPU单元。

(二)I/O存储区CP1H系列PLC的I/O存储区(也称为I/O存储器)是指通过指令的操作数可以进入的区域。

I/O存储区主要是用来存储输入、输出数据和中间变量,提供定时器、计数器、寄存器等,还包括系统程序所使用和管理的系统状态和标志信息。

I/O存储区分为输入/输出通道继电器区(CIO区)、内部辅助继电器区(WR)、保持继电器区( HR)、特殊辅助继电器区(AR)、暂存继电器区(TR)、定时器区(TIM)、计数器区(CNT)、数据存储器区(DM)、变址寄存器区(IR)、数据寄存器区(DR)、任务标志(TK)等。

CP1H系列PLC I/O存储区的分配见表1-14。

表1-14 CP1H系列PLC I/O存储区的分配注:CIO区中不使用的继电器编号可作为内部辅助继电器使用。

对于各区的访问,CP1H系列PLC采用字(也称为通道)和位的寻址方式,前者是指各个区可以划分为若干个连续的字,每个字包含16个二进制位,用标识符及3~5个数字组成字号来标识各区的字;后者是指按位进行寻址,需在字号后面再加00 N15二位数字组成位号来标识某个字中的某个位。

这样整个数据存储区的任意一个字、任意一个位都可用字号或位号唯一表示。

注意:在CP1H系列PLC的I/O存储区中,TR区、TK区只能进行位寻址;而DM区和DR区只能进行字寻址,除此以外的其他区域既支持字寻址又支持位寻址方式。

(三)参数区参数区包括各种不能由指令操作数指定的设置,这些设置只能由编程装置设定,包括PLC系统设定、路由表及CPU高功能单元系统设定区域。

(四)内置内存CP1H系列PLC的CPU单元中内置有闪存,通过CX- Programmer软件向用户程序区和参数区写入数据时,该数据可自动备份在内置闪存中,下次电源接通时,会自动地从闪存中传送到RAM内的用户内存区。

HC-04蓝牙串口通信模块用户手册 V1.0说明书

HC-04蓝牙串口通信模块用户手册 V1.0说明书

HC-04蓝牙串口通信模块用户手册V1.0软件版本:HC-04V1.0硬件版本:V1.0发布日期2020年03月16日修改记录HC-04蓝牙串口通信模块是新一代的基于V2.1(SPP)经典蓝牙协议和V4.0(BLE)蓝牙协议的双模数传模块。

无线工作频段为2.4GHz ISM,调制方式是GFSK。

模块发射功率为3dBm,接收灵敏度为-90dBm。

模块采用邮票孔封装方式,可贴片焊接,模块大小18.5mm×13mm×2.2mm,很方便客户嵌入应用系统之内。

产品尺寸管脚定义HC-04模块适用于贴片焊接,共有16个引脚,板载PCB天线,引脚具体定义如下表:引脚定义I/O方向说明1GND模块公共地2VCC输入电源脚,要求直流3.3V电源,供电电流不小于200mA 3TXD输出UART输出口,3.3V TTL电平4RXD输入,弱上拉UART输入口,3.3V TTL电平5NC悬空6NC悬空7NC悬空8NC悬空9PB1输出模块连线指示,连线前为高电平,连线后输出低电平。

10PB2输入,下拉AT指令设置脚(注②)11PB3输出模块指示灯输出脚(注①)12PB4输入,弱上拉AT指令设置脚(注③)13NC悬空14NC悬空15NC悬空16RST输入,弱上拉模块复位脚,要求不小于100ms的低电平进行复位注①:模块指示灯输出脚,高电平输出,接LED时请串接电阻。

连线前,LED快闪。

连线后,LED常亮。

注②:输入脚,内部下拉。

在连线状态下,此脚接高电平,可以进入AT指令设置模式;此脚接低电平(或者悬空),返回到串口透传模式。

注③:输入脚,内部弱上拉。

在连线状态下,此脚接低电平,可以进入AT指令设置模式;此脚接高电平(或者悬空),返回到串口透传模式。

电气特性:参数测试条件参考值工作电压-DC3.0V~3.6V工作电流BLE未连接20mA~60mA变化已连接约22mA SPP未连接20mA~60mA变化已连接约30mA模块参数设置AT指令AT指令用来设置模块的参数,模块在未连线状态下可以进行AT指令操作,连线后进入串口透传模式。

优化AIX 7磁盘性能 第一部分磁盘I O概述和长期监控工具【sar+nmon+ topas】

优化AIX 7磁盘性能 第一部分磁盘I O概述和长期监控工具【sar+nmon+ topas】

优化AIX 7磁盘性能第一部分磁盘I/O概述和长期监控工具【sar+nmon+ topas】简介磁盘 I/O 优化的关键部分涉及到在构建系统之前实现最佳实践。

因为当系统已经启动并处于运行状态时,很难再对数据进行移动,所以需要在规划磁盘和 I/O 子系统环境时正确地完成这项任务,这一点是非常重要的。

这包括物理架构、逻辑磁盘排列以及逻辑卷和文件系统配置。

当系统管理员听到可能出现了磁盘争用问题时,他或她首先会求助于 iostat。

iostat 等同于使用 vmstat 提供有关内存的报告,它是获得有关 I/O 子系统的当前运行概况的一种快速而原始的方法。

尽管运行 iostat 并不是一种完全不合理的反应,但是很早就应该着手考虑磁盘 I/O 的问题,而不是等到必须进行调优的时候。

如果没有从一开始就正确地为环境配置磁盘,那么任何调优工作都无法提供帮助。

而且,有一点非常重要,需要了解磁盘 I/O 的具体情况,以及它与 AIX® 和 your System p™ 硬件之间的关系。

对于磁盘 I/O 调优来说,AIX 特有的工具和实用工具比通用的 UNIX® 命令和工具能够提供更多的帮助,因为它们的任务就是帮助优化本机 AIX 磁盘 I/O 子系统。

在本文中,我们要定义和介绍 AIX I/O 栈,并将其与磁盘性能的物理和逻辑方面关联起来。

本文介绍直接、并发和异步 I/O:它们是什么,如何启用它们,以及如何监控和优化它们。

本文还介绍一些长期监控工具,应该使用它们来帮助优化系统。

听到 iostat 并不是我们推荐的帮助长期收集统计数据的工具,您可能会感到奇怪。

本文讨论 AIX 7 的 beta 版中的支持和变化,包括不同子系统的配置方式方面的变化。

AIX 7 中的主要变化进一步简化了许多 I/O 子系统的操作和配置,这个改进过程从 AIX 6 就开始了。

其结果是许多 I/O 子系统不再需要启用和配置了。

IAR SAM8 V3.10中文使用指南

IAR SAM8 V3.10中文使用指南

IAR Embedded Workbench用户指南(翻译:老韦)版权声明版权所有1996–2006 IAR系统。

保留所有权利。

没有这个文件的一部分可能没有IAR事先书面同意转载系统。

本文档中描述的软件是提供一个许可下,只能使用或与这样的许可条款规定的复制。

免责声明本文档中的信息如有变更,恕不另行通知,不代表在IAR系统的任何部分的承诺。

而所包含的信息这里被认为是准确的,IAR系统的任何错误不承担任何责任或遗漏。

在任何情况下都不得IAR系统,其雇员,承包商,或该作者文档将承担特别的,直接的,间接的,直接或间接损害,损失,费用,费用,索赔,要求,主张对利润损失,费用,或任何种类或性质的费用。

商标IAR系统,从理念到目标,IAR Embedded Workbench,IAR编程能力makeapp和C-SPY通过IAR 系统拥有的商标的微软和Windows是微软公司的注册商标。

Adobe和Acrobat Reader是注册商标的Adobe系统incorporated.codewright是一个注册商标的母星公司。

所有其他产品名称是其各自的商标或注册商标业主。

版预告第六版:六月2006零件号:uew-6内部参考:4.7.0。

内容简介表..............................................................................................................................十九数字......................................................................................................................二十二前言.......................................................................................................................二十九1部分。

从PROFIBUS DP到PROFINET IO编程手册

从PROFIBUS DP到PROFINET IO编程手册

从 PROFIBUS DP 到 PROFINET IO
编程手册, 10/2006, A5E00879152-01
3
前言
指南
本手册中涵盖的主题: • PROFIBUS DP 与 PROFINET IO 的比较: • 诊断和状态请求的数据记录 • 用户程序中的诊断实例 • 附录
词汇表解释了重要的术语。 索引中包含了重要的关键字,可以通过关键字快速访问相关的文 本段落。
5.2 5.2.1 5.2.2
PROFINET IO 的设备模型 ...........................................................................................................39 IO 设备的设备模型 .......................................................................................................................39 PROFINET IO 的诊断级别 ...........................................................................................................40
回收和处理
本文档中所说明的设备由于污染物少,可以进行回收。 为了环保可持续地回收和处理旧设 备,请联系有资质处理电子废弃物的公司。
相对于先前版本的变更 本手册说明了 SIMATIC 设备系列的新技术和增强功能。
读者群
本手册主要针对致力于使用 SIMATIC 产品的联网自动化解决方案的设计和工程的人群: • 决策者 • 计划人员 • 项目工程师

realviewarmulatoriss

realviewarmulatoriss

Copyright © 2002, 2003 ARM Limited版权所有ARM DUI 0207ASC-00RealView ™ARMulator ®ISS1.3 ۈ፿ઓᒎฉii Copyright © 2002, 2003 ARM Limited版权所有ARM DUI 0207ASC-00RealView ARMulator ISS፿ઓᒎฉCopyright ©2002, 2003 ARM Limited版权所有ۈ۾ቧᇦ本书进行了以下更改Ⴥᎌཚᄰস标有 ®或 ™ 的词语和徽标是 ARM Limited拥有的注册商标或商标此处提及的其它品牌和名称可能是其相关所有者的商标除非事先得到版权所有人的书面许可否则不得以任何形式改编或复制本文档包含或产品描述的全部或部分信息本文档描述的产品将进行持续的开发和改进ARM 将如实提供所有产品特性以及本文档包含的使用方法但是所有暗示或明示的担保包括但不限于对特定用途适销性或适用性的暗示担保均不包括在内本文档的目的仅在于帮助读者使用产品对由于使用本文档中的任何信息这些信息中的任何错误或遗漏或任何不正确的使用产品而导致的任何损失或损害ARM Limited概不负责ৎখ଑ഺ྇໐खቲ੓ৎখ2002 年 8 月A1.3 版ARM DUI 0207ASC-00Copyright © 2002, 2003 ARM Limited版权所有iii目录RealView ARMulator ISS ፿ઓᒎฉ༄ዔ关于本书 ......................................................................................................... vi 反馈 . (ix)࢒ 1 ᐺ଼஑1.1RealView ARMulator ISS 概述 .................................................................... 1-2࢒ 2 ᐺARMulator ૥߻ᒀဤ2.1关于 ARMulator ........................................................................................... 2-22.2ARMulator 组件 ........................................................................................... 2-32.3跟踪器 ......................................................................................................... 2-52.4Profiler ....................................................................................................... 2-122.5ARMulator 周期类型 .................................................................................. 2-142.6页表模块 .................................................................................................... 2-192.7缺省存储器模型 ......................................................................................... 2-272.8使用映射文件进行存储器建模 ................................................................... 2-282.9Semihosting .............................................................................................. 2-312.10外围设备模型 ............................................................................................ 2-32࢒ 3 ᐺܠቖ ARMulator ෝቯ3.1ARMulator 扩展套件 .................................................................................... 3-23.2写新外围设备模型 ....................................................................................... 3-6iv Copyright © 2002, 2003 ARM Limited版权所有ARM DUI 0207ASC-003.3构建新模型 .................................................................................................. 3-83.4配置 ARMulator 以使用新模型 .................................................................. 3-103.5配置 ARMulator 以禁用模型 ..................................................................... 3-12࢒ 4 ᐺARMulator ݬఠ4.1ARMulator 模型 .......................................................................................... 4-24.2与内核进行通信 .......................................................................................... 4-34.3基本模型接口 ............................................................................................ 4-124.4协处理器模型接口 ..................................................................................... 4-154.5异常 .......................................................................................................... 4-264.6事件 .......................................................................................................... 4-294.7处理程序 ................................................................................................... 4-334.8存储器访问函数 ........................................................................................ 4-384.9事件调度函数 ............................................................................................ 4-404.10通用函数 ................................................................................................... 4-414.11访问调试器 ................................................................................................ 4-544.12跟踪器 ....................................................................................................... 4-584.13映射文件 ................................................................................................... 4-604.14ARMulator 配置文件 ................................................................................. 4-644.15ToolConf ................................................................................................... 4-694.16外围设备参考 ............................................................................................ 4-74ࠤ૏ܭARM DUI 0207ASC-00Copyright © 2002, 2003 ARM Limited版权所有v༄ዔ此前言对 RealView ™ ARMulator ® 指令集模拟器 (RealView ARMulator ISS) 目标进行了介绍它包含以下内容•第 vi 页关于本书•第 ix 页反馈前言vi Copyright © 2002, 2003 ARM Limited版权所有ARM DUI 0207ASC-00ਈ᎖۾ၗ本书提供了有关 RealView ARMulator ISS即 ARM 处理器模拟器的参考信息း፿࣪ሷ本书专为使用远程调试接口 1.5.1兼容调试器的所有开发人员而写前提是假定您是一位有经验的软件开发人员并且您熟悉 ADS v1.2 Getting Started Guide 或 RealView Compilation Tools v1.2 Getting Started Guide 中描述的 ARM开发工具ဧ፿۾ၗ本书由以下章节组成࢒ 1 ᐺ简介阅读本章以简单了解本书内容以及 RealView ARMulator ISS 的概要描述第 2 章ARMulator 基础知识阅读本章以简单了解RealView ARMulator ISS 即 ARM 指令集模拟器第 3 章编写 ARMulator 模型阅读本章以帮助您记录您对 RealView ARMulator ISS 的扩展和修改第 4 章ARMulator 参考本章提供帮助您使用 RealView ARMulator ISS的更多详细内容前言ARM DUI 0207ASC-00Copyright © 2002, 2003 ARM Limited版权所有vii፝ၮਏಿ本书使用了以下印刷惯例斜体突出显示重要注释介绍特殊术语表示内部交叉链接和引用࠰ᄏ突出显示界面要素如菜单名称必要时也用于强调说明列表中的重点以及 ARM处理器信号名称等宽表示可以从键盘输入的文本如命令文件和程序名以及源代码等宽表示允许的命令或选项缩写可只输入下划线标记的文本无需输入命令或选项的全名等宽斜体表示此处的命令和函数变量可用特定值代替ࢀ౑࠰ᄏ表示使用示例代码以外的语言关键字前言viii Copyright © 2002, 2003 ARM Limited版权所有ARM DUI 0207ASC-00໚჈ࣗᇕ本部分列出了 ARM Limited和第三方发布的可提供有关 ARM 系列处理器开发代码附加信息的相关读物ARM将定期对其文档进行更新和更正有关最新勘误表附录以及 ARM 常见问题请访问 ARM ၗఓ本书包含特定 RealView ARMulator ISS 的信息有关将 RealView ARMulator ISS与调试器配合使用的信息请参阅调试器说明文档前言ARM DUI 0207ASC-00Copyright © 2002, 2003 ARM Limited版权所有ixनౣARM Limited 乐于收到有关 RealView ARMulator ISS及其文档的任何反馈ਈ᎖ RealView ARMulator ISS ࡼनౣ如果您对 RealView ARMulator ISS有任何疑问请与供应商联系为便于供应商提供快捷有用的答复请提供•您的姓名和公司•产品序列号•您所用的版本的详情•您运行的平台的详情如硬件平台操作系统类型和版本•再现问题发生的独立样本代码•您期望发生和实际发生的情况的详细说明•您使用的命令包括所有命令行选项•解释问题的示例输出•工具的版本字符串包括版本号和日期ਈ᎖۾ၗࡼनౣ如果您对本书有任何问题请发送电子邮件到 **************并提供•文档标题•文档编号•您有意见的页码•您的意见的简单说明我们还欢迎您对新增和改进之处提出一般建议前言x Copyright © 2002, 2003 ARM Limited版权所有ARM DUI 0207ASC-00第 1 章଼஑本章介绍了RealView ARMulator 指令集模拟器 (RealView ARMulator ISS) 1.3 版提供的调试支持工具本章包含以下内容•第 1-2 页RealView ARMulator ISS 概述简介1.1RealView ARMulator ISS গၤ您可以使用远程调试接口 (RDI) 1.5.1 兼容调试器调试您的原型软件调试器在主计算机上运行并连接至运行原型软件的目标系统您的目标系统可以是以下任何一个•软件模拟器RealView ARMulator ISS模拟 ARM 硬件•ARM 评估或开发板•基于 ARM 的第三方开发板•您自己设计的基于 ARM 的硬件本文档只介绍 RealView ARMulator ISS有关其它目标系统的详情请参阅该目标的说明文档1.1.1ဠඐဵ RealView ARMulator ISSRealView ARMulator ISS后文称为 ARMulator随 ARM 调试器提供是一个独立产品ARMulator 在与调试器相同的主计算机上运行并且包括与调试器通信的工具ARMulator 是一个指令集模拟器 (ISS)它与存储器系统和外围设备一起可以模拟指令集和 ARM 处理器的结构您还可以将其扩展至模拟其它外围设备和自定义存储器系统请参阅第 3 章编写 ARMulator 模型您可以将 ARMulator 用于软件开发也可以将其作为以 ARM 为目标的软件的基准程序它可以模拟指令集和计数周期作为基准程序的精度会受到限制请参阅第 2-2 页精度1.1.2Semihosting您可以使用主计算机上的 I/O 设备而非目标系统提供的设备这就是所谓的semihosting有关详情请参阅RealView Compilation Tools v1.2 Compilers andLibraries Guide缺省情况下ARM C 和 C++ 代码使用 semihosting 设备要从汇编代码访问 semihosting 设备请使用 semihosting 软件中断 (SWI)ARMulator 中止 semihosting SWI 并从主计算机请求服务第 2 章ARMulator ૥߻ᒀဤ本章描述 ARMulator即提供 ARM 处理器软件模拟的程序集成它包含以下内容•第 2-2 页关于 ARMulator•第 2-3 页ARMulator 组件•第 2-5 页跟踪器•第 2-12 页Profiler•第 2-14 页ARMulator 周期类型•第 2-19 页页表模块•第 2-27 页缺省存储器模型•第 2-28 页使用映射文件进行存储器建模•第 2-31 页Semihosting•第 2-32 页外围设备模型ARMulator 基础知识2.1ਈ᎖ ARMulatorARMulator 是一种指令集模拟器它可以模拟指令集和各种 ARM 处理器结构要在 ARMulator 上运行软件请通过 RDI 1.5.1 兼容调试器进行访问ARMulator 适用于软件开发并可作为以 ARM 为目标的软件的基准程序它可以模拟指令集和计数周期请参阅第 2-14 页ARMulator 周期类型作为基准程序的精度和周期计数精度会受到一定限制请参阅精度ARMulator 可提供使全部 C 或 C++ 程序在模拟系统上运行所需的全部工具有关 ARMulator 支持的 C 库 semihosting SWI 的信息另请参阅RealViewCompilation Tools v1.2 Compilers and Libraries Guide2.1.1றࣞARMulator 不能达到 100% 的精度因为它并不是基于真实处理器的一般而言不是很复杂非高速缓存的 ARM 处理器内核模型精度较高而带高速缓存的那些内核模型可能与实际硬件的精度不完全相同ARMulator 适合用作系统设计的软件开发工具但如果需要 100% 的精度则必须使用硬件模型在以下情况下您可以使用 ARMulator 作为基准程序•您正在建模的内核没有高速缓存•您只需要近似比较ARMulator 不会在高速缓存内核上建立 Asynchronous Mode 模型如果您在CP15 中设置了控制位以便指定 Asynchronous Mode ARMulator 将会发出警告Set to Asynch mode, WARNING this is not supported您可以继续调试但 ARMulator 将完全按照 Synchronous Mode 的方式运行ARMulator 基础知识2.2ARMulator ᔝୈARMulator 由一系列模块组成可作为动态链接库Windows 的.dll文件或共享对象Linux 或 Solaris 的.so文件或所有平台上的.sdi文件来执行主模块是•ARM 处理器内核模型•处理器所用存储器的模型这些部件中的每一个均有备选的预定义模块您可以选择要使用的处理器和存储器模型组合其中一个预定义的存储器模型mapfile允许您详细指定模拟的存储器系统mapfile允许您指定窄内存和等待状态请参阅第 2-28 页使用映射文件进行存储器建模另外还有其它您可以使用的预定义模块•建立附加硬件模型例如协处理器或外围设备•建立预安装的软件模型例如 C 库semihosting SWI 处理程序或操作系统•抽取调试或基准信息请参阅第 2-5 页跟踪器和第 2-12 页Profiler您可以使用不同的预定义模块组合和不同的存储器映射请参阅第 2-4 页配置ARMulator如果提供的模块不符合您的要求您也可以写自己的模块或者编辑预定义模块的副本例如•建立不同外围设备协处理器或操作系统的模型•建立不同存储器系统的模型•提供其它调试或基准信息一些模块的源代码已提供您可以这些模块为示例来写自己的模块请参阅第 3 章编写 ARMulator 模型ARMulator 基础知识2.2.1๼ᒙ ARMulator您可以从 RDI 1.5.1 兼容调试器配置一些 ARMulator 的详细资料要进行其它配置调整您必须编辑.ami文件副本随 ARMulator 提供以下.ami文件•bustypes.ami•default.ami•example1.ami•peripherals.ami•processors.ami•vfp.ami这些文件位于install_directory/RVARMulator/ARMulator/1.3/release/platform在此路径中•platform指—Windows win_32-pentium—Linux linux-pentium—Solaris solaris-sparc•对于 Windows请用 \ 替换 /如果要写自己的任何 ARMulator 模型请先生成其它的.ami文件以允许配置您的模型有关如何操作的详情请参阅第 4-64 页ARMulator 配置文件调试器启动 ARMulator 后ARMulator 会读取环境变量ARMCONF中定义的所有路径上的.ami文件初始设置为 ARMulator 目录install_directory/RVARMulator/ARMulator/1.3/release/platform以下小节依次描述每个预定义模块以及如何配置这些模块ᓖ如果.ami文件中的配置设置与您在调试器中的设置发生冲突则将优先采用调试器设置ARMulator 基础知识2.3ৌᔍ໭您可以使用跟踪器跟踪指令存储器访问和事件由配置文件peripherals.ami来控制跟踪内容请参阅第 4-64 页ARMulator 配置文件本节包括以下小节•调试器跟踪支持•第 2-6 页解释跟踪文件输出•第 2-10 页配置跟踪器2.3.1ࢯ၂໭ৌᔍᑽߒ如果您的调试器不直接支持跟踪功能跟踪器将使用 RDI 记录级别变量的第 4 位来启用或禁用跟踪功能记录级别变量为以下其中之一•$rdi_log•RealView 调试器中的@mdebug_rdi_log•调试器当量有关通过 ARMulator 使用跟踪功能的详情请参阅调试器文档ᓖ跟踪器由调试器开启或关闭但由.ami文件控制ARMulator 基础知识2.3.2ஊျৌᔍᆪୈၒ߲本节描述如何解释从跟踪器输出的信息ৌᔍᆪୈာಿ以下示例显示了部分跟踪文件Date: Thu Aug 9 16:41:36 2001Source: ArmulOptions: Trace Instructions (Disassemble) Trace Memory CyclesBNR4O___ A0000000 00000C1EBNR8O___ 00008000 E28F8090 E898000FBSR8O___ 00008008 E0800008 E0811008BSR8O___ 00008010 E0822008 E0833008BSR8O___ 00008018 E240B001 E242C001MNR4O___ 00008000 E28F8090IT 00008000 e28f8090 ADD r8,pc,#0x90 ; #0x8098MNR4O___ 00008004 E898000FIT 00008004 e898000f LDMIA r8,{r0-r3}BNR4O___ A0000000 00000C1EBNR8O___ 00008098 00007804 00007828BSR8O___ 00008080 10844009 E3C44003BSR8O___ 00008088 E2555004 24847004BSR8O___ 00008090 8AFFFFFC EAFFFFF2MNR8____ 00008098 00007804 00007828BNR8O___ 000080A0 00007828 00007840BSR8O___ 000080A8 E3A00840 E1A0F00EBSR8O___ 000080B0 E92D400C E28F0014BSR8O___ 000080B8 E5901000 E5900004MNR8____ 000080A0 00007828 00007840MNR4O___ 00008008 E0800008IT 00008008 e0800008 ADD r0,r0,r8MNR4O___ 0000800C E0811008IT 0000800C e0811008 ADD r1,r1,r8MNR4O___ 00008010 E0822008以下类型的行可以出现在跟踪文件中•第 2-7 页跟踪存储器M 行•第 2-8 页跟踪指令I 行•第 2-8 页跟踪事件 E 行•第 2-9 页跟踪寄存器R 行•第 2-9 页跟踪总线 B 行ARMulator 基础知识ৌᔍࡀ߼໭M ቲM 行表示•存储器访问用于不带片上存储器的内核•片内存储器访问用于带片内存储器的内核它们具有以下通用存储器访问格式M<type><rw><size>[O][L][S] <address> <data>其中<type>表示周期类型S连续N不连续<rw>表示读或写操作R读W写<size>表示存储器访问的大小4字32 位2半字16 位1字节8 位O表示操作码获取指令获取L表示锁定的访问SWP指令S表示推测性的指令获取D表示 ARM9TDMI™数据接口的DMORE信号是 HIGH<address>按十六进制格式给出的地址例如00008008<data>可显示为以下一种模式value给定读/写值例如EB00000C(wait)表示nW AIT为 LOW相对于插入等待状态而言(abort)表示ABORT为 HIGH相对于中止访问而言跟踪存储器行也可以有以下格式MI用于空闲周期MC用于协处理器周期MIO用于 Harvard 体系结构处理器如 ARM9TDMI™指令总线上的空闲周期ARMulator 基础知识ৌᔍᒎഎI ቲ跟踪指令 (I) 行的格式如下[ IT | IS ] <instr_addr> <opcode> [<disassembly>]例如IT 00008044 e04ec00f SUB r12,r14,pc其中IT表示指令被执行IS表示指令被跳过几乎所有 ARM 指令都能有条件执行<instr_addr>按十六进制格式显示指令地址例如00008044<opcode>按十六进制格式给出操作码例如e04ec00f<disassembly>表示反汇编如果指令已被执行则大写例如SUBr12,r14,pc此为可选项可通过在peripherals.ami中设置Disassemble=True启用Thumb 代码中带链接的分支显示为两个条目第一个标记为1st instr of BL pair.ৌᔍူୈ E ቲ事件 (E) 行的格式如下E <word1> <word2> <event_number>例如E 00000048 00000000 10005其中<word1>给出一对字的第一个例如 pc 值<word2>给出一对字的第二个例如中断地址<event_number>给出事件编号例如0x10005这是 MMU Event_ITLBWalk事件在第 4-29 页事件中有描述ৌᔍ଎ࡀ໭R ቲ事件 (R) 行的格式如下R <register>=<newvalue>[,<anotherregister>=<newvalue>[...]]例如R r14=20000060, cpsr=200000d3其中<register>当前指令的结果寄存器,保存指令执行结果<newvalue>是<register>中的新内容ৌᔍᔐሣ B ቲ总线 (B) 行的格式与 M 行的格式相同 B 行表示片外存储器访问2.3.3๼ᒙৌᔍ໭ARMulator 外围设备配置文件 (peripherals.ami) 中有关于跟踪器的部分{ Default_Tracer=Tracer;; Output options - can be plaintext to file, binary to file or to RDI log;; window. (Checked in the order RDILog, File, BinFile.);VERBOSE=True;RDILog=TrueRDILog=FalseFile=armul.trcBinFile=armul.trc;; Tracer options - what to traceTraceInstructions=TrueTraceRegisters=FalseOpcodeFetch=True;;Normally True is useful, but sometimes it's too expensive.TraceMemory=True;TraceMemory=FalseTraceIdle=TrueTraceNonAccounted=FalseTraceEvents=False;;If there is a non-core bus, do we trace it (as well).TraceBus=True;; Flags - disassemble instructions; start up with tracing enabled;Disassemble=TrueTraceEIS=FalseStartOn=False}其中RDILog指示跟踪器输出至调试器的 RDI 日志窗口File定义写跟踪信息的文件另外您还可以使用BinFile按二进制格式存储数据其它选项控制跟踪内容TraceInstructions跟踪指令TraceRegisters跟踪寄存器OpcodeFetch跟踪指令获取存储器访问TraceMemory跟踪存储器访问TraceIdle跟踪空闲周期TraceNonAccounted跟踪未统计的RDI存储器即那些由调试器产生的访问TraceEvents跟踪事件有关更多信息请参阅下面的跟踪事件TraceBus可能是TRUE总线已跟踪片外访问FALSE内核未跟踪片外访问Disassemble反汇编指令如果您启用反汇编则模拟速度会较慢TraceEIS如果设为TRUE则将输出格式与其它模拟器兼容这可使工具对跟踪进行比较StartOn指示 ARMulator 在执行一开始即进行跟踪໚჈ৌᔍ఼ᒜ您还可以通过以下指令控制跟踪Range=low address,high address只在指定的地址范围内执行跟踪Sample=n只将每n个跟踪条目发送至跟踪文件ৌᔍူୈ跟踪事件时您可以选择要跟踪的事件方法如下EventMask=mask,value只跟踪那些编号被mask屏蔽后位与与value相等的事件Event=number只跟踪number这相当于EventMask=0xFFFFFFFF,number例如以下指令只跟踪 MMU/高速缓存事件EventMask=0xFFFF0000,0x00010000有关更多信息请参阅第 4-29 页事件2.4ProfilerProfiler 由调试器控制有关详情请参阅调试器文档除配置程序执行时间外Profiler 还允许您使用配置机制对事件如高速缓存错误进行配置从调试器打开配置功能时您应指定一个数字n以便控制配置频率有关详情请参阅第 2-13 页配置 ProfilerProfiler 可以配置 C 和汇编语言函数要配置汇编语言函数您必须将函数用FUNCTION和ENDFUNC指令进行标记有关详情请参阅RealView Compilation Toolsv1.2 Assembler Guide2.4.1๼ᒙ ProfilerARMulator 外围设备配置文件peripherals.ami中有关于 Profiler 的部分{ Default_Profiler=Profiler;VERBOSE=False;; For example - to profile the PC value when cache misses happen, set:;Type=Event;Event=0x00010001;EventWord=pcType=MICROSECOND;;Alternatives for Type are;; Event, Cycle, Microsecond.;;If type is Event then alternatives for EventWord are;; Word1,Word2,PC.}本部分中的每一行均为一个注释因此 ARMulator 将执行其缺省配置缺省设置是每隔 100 微秒进行一次配置取样有关更多信息请参阅调试器文档如果本部分未加注释则会配置数据高速缓存出错有关更多信息请参阅第 4-29 页事件Type条目控制配置间隔Type=Microsecond指示 Profiler 每隔n微秒进行一次取样此为缺省值Type=Cycle指示 Profiler 每隔n个指令进行一次取样并记录自上次取样后的内存周期数量Type=Event指示 Profiler 每隔一定的相关事件即进行配置请参阅第 4-29 页事件n被忽略也允许EventMask=mask,value请参阅第 2-5 页跟踪器2.5ARMulator ᒲ໐ಢቯ除模拟 ARM 内核上的指令执行之外ARMulator 还可以计算总线和处理器周期从调试器您可以以$statistics或调试器当量访问这些计数本节描述所计算的各种周期类型的含义它包含以下部分•RealView Debugger 中的周期计数器•第 2-15 页未高速缓存的 von Neumann 内核•第 2-16 页未带缓存的 Harvard 架构内核•第 2-16 页带 MMU 或 PU 和 AMBA ASB 接口的高速缓存内核•第 2-17 页带 MMU 或 PU 和 AMBA AHB 接口的高速缓存内核•第 2-17 页带高速缓存内核的内部周期类型•第 2-18 页内核相关的详细统计数据2.5.1RealView Debugger ᒦࡼᒲ໐ଐၫ໭ARMulator 可以按 RDI 中周期计数器调用所报告的那样增加周期计数器有关详情请参阅第 4-35 页未知的 RDI 信息处理程序如果 RDI 周期计数器名称是X则符号@rdi_X即为周期计数器名称其中X可将所有非字母数字字符转换为带下划线字符这些计数器出现在寄存器选项卡中然而RealView Debugger 跟踪不使用$statistics RealView Debugger 使用@cycle_count这由监测内核和高速缓存或存储器之间总线的存储器回调服务提供并提供合理的时间定义ᓖ尽管@cycle_count可能与周期计数器如Total不同但这种差别并不重要内核内部和外部之间的总线比率意味着@cycle_count是其它时钟值的数倍2.5.2ᆚ঱Ⴅદࡀࡼ von Neumann ดਖ਼表 2-1 显示了未高速缓存的 von Neumann内核的周期类型的含义例如ARM7TDMI®即是一个未带高速缓存的 von Neumann 型内核ೌኚᒲ໐CPU可从以下地址请求转移或转移到以下地址•与前述周期访问地址相同的地址•在前述周期访问地址一字之后的地址•在前述周期访问地址一个半字之后的地址仅限于 Thumb指令获取੝݀ࡼ I-S ᒲ໐内存控制器可以在 I-Cycle期间推测性地开始解码地址如果 I_Cycle 后跟随一个 S_Cycle 则内存控制器可以比其它方式更早启动此周期的计时功能取决于内存控制器的实施ܭ 2-1 ᆚࡒદࡀࡼ von Neumann ଦ৩ดਖ਼ࡼᒲ໐ಢቯᒲ໐ಢቯSEQ ቧ੓nMREQ ቧ੓਺ፃS_Cycles 11连续周期有关详情请参阅连续周期N_Cycles 01非连续周期CPU 从与前述周期所用地址无关的地址请求转移或者转移到该地址I_Cycles 10内部周期CPU 不需要请求转移因为它正在执行内部函数C_Cycles 00协处理器周期Total --S_CyclesN_CyclesI_CyclesC_Cycles 和 Waits的总和IS--合并的 I-S 周期有关详情请参阅合并的 I-S 周期2.5.3ᆚࡒદࡀࡼ Harvard ଦ৩ดਖ਼表 2-2 显示了未带高速缓存的 Harvard型内核的周期类型的含义例如ARM9TDMI 即是一个没有高速缓存的 Harvard内核2.5.4ࡒ MMU ૞ PU ਜ਼ AMBA ASB ୻ాࡼ঱Ⴅદࡀดਖ਼表 2-3 显示了带 AMBA ASB接口的高速缓存内核的总线周期类型的含义有关这些内核的其它周期类型请参阅第 2-17 页带高速缓存内核的内部周期类型例如ARM920T 即是带 MMU和高速缓存的内核ARM940T 是带 PU 和高速缓存的内核示例这些内核没有 N_Cycles 非连续访问使用 A_Cycle 后面跟随 S_Cycle 这与合并的 I-S周期相同ܭ 2-2 ᆚࡒ঱Ⴅદࡀࡼ Harvard ଦ৩ดਖ਼ࡼᒲ໐ಢቯ਺ፃᒲ໐ಢቯᒎഎᔐሣၫ௣ᔐሣ਺ፃ内核周期--内核时钟运行的总数这包括由于互锁和指令需要多个周期而导致的管道中断ID_Cycles 活动活动-I_Cycles 活动空闲-空闲周期空闲空闲-D_Cycles 空闲活动-Total--内核周期ID_Cycles I_CyclesIdle_CyclesD_Cycles 和Waits 的总和ܭ 2-3 ࡒ AMBA ASB ୻ాࡼ঱Ⴅદࡀดਖ਼ࡼᒲ໐ಢቯࡼ਺ፃᒲ໐ಢቯ਺ፃA_Cycles 地址预测无数据转移在 $statistics 中作为 I_Cycles或调试器当量列出S_Cycles从当前地址连续传输数据2.5.5ࡒ MMU ૞ PU ਜ਼ AMBA AHB ୻ాࡼ঱Ⴅદࡀดਖ਼表 2-4 说明了在先进高速总线 (AHB) 上使用的传输类型例如ARM946E-S 即是带 AHB 接口的高速缓存内核有关这些内核的其它周期类型请参阅带高速缓存内核的内部周期类型2.5.6ࡒ঱Ⴅદࡀดਖ਼ࡼดݝᒲ໐ಢቯ表 2-5显示了高速缓存内核的内部周期类型的含义ᓖ如果您希望计算执行时间请使用外部总线周期计数请参阅第 2-16 页带 MMU 或 PU 和 AMBA ASB 接口的高速缓存内核或带 MMU 或 PU 和 AMBA AHB接口的高速缓存内核您不能使用 F_Cycles计算执行时间因为对于未经高速缓存的访问F_Cycles 不会增加ܭ 2-4 AMBA AHB ୻ా࿟ࡼᒲ໐ಢቯᒲ໐ಢቯ਺ፃIDLE 总线主控器不想使用总线从属器必须以 HRESP 上的零等待状态 OKAY 进行响应BUSY 总线主控器位于分段传输中间但不能进行下一个连续访问从属器必须以 HRESP上的零等待状态 OKAY 进行响应NON-SEQ 分段传输或单个访问的开始地址与上次访问的地址没有关联SEQ继续进行分段传输地址等于前一个地址加上数据长度ܭ 2-5 ঱Ⴅદࡀดਖ਼ࡼดݝᒲ໐ಢቯᒲ໐ಢቯ਺ፃF_Cycles 快速时钟 (FLCK ) 周期这些是访问高速缓存的内部内核周期对于非高速缓存的访问由于内核时钟转换为总线时钟因此 F_Cycles不会增加Core Cycles 内核周期是指内核时钟的跳转每次时钟跳转 Core Cycles 均会增加无论内核是运行在 FCLK 高速缓存访问还是总线时钟BCLK 非高速缓存访问下True Idle Cycles空闲周期并不是 I-S合并周期的一部分2.5.7StrongARM1表 2-6 显示了 StrongARM1周期类型的含义2.5.8ดਖ਼ሤਈࡼሮᇼᄻଐၫ௣在 default.ami文件中有以下一行Counters=False您可以将其更改为Counters=True这样ARMulator 会计算其它统计数据如高速缓存命中数和高速缓存未命中数并显示在$statistics或调试器当量中这些统计数据是特定内核相关的ܭ 2-6 StrongARM ᄂࢾᒲ໐ಢቯᒲ໐ಢቯ਺ፃCore_Idle 未从指令高速缓存获取指令未从数据高速缓存获取数据Core_IOnly 从指令高速缓存获取指令未从数据高速缓存获取数据Core_DOnly 未从指令高速缓存获取指令从数据高速缓存获取数据Core_ID从指令高速缓存获取指令从数据高速缓存获取数据2.6጑ܭෝ్本节包括以下小节•页表模块概述•第 2-20 页控制 MMU 或 PU 和高速缓存•第 2-21 页控制寄存器 2 和 3•第 2-22 页存储区域•第 2-24 页页表模块和存储器管理单元•第 2-25 页页表模块和保护单元2.6.1጑ܭෝ్গၤ页表模块可使您在带存储器管理单元 (MMU) 或保护单元 (PU) 的系统模型上运行代码而无需为 MMU 或 PU 写初始化代码ᓖ此模块允许您调试代码或执行近似的基准对于真实系统您必须写初始化代码才能设置 MMU 或 PU 您可以通过禁用页表模块在 ARMulator 上调试初始化代码在带 MMU 的 ARM v4 和 v5 处理器架构模型上页表模块可以设置页表并初始化 MMU 在带 PU 的处理器上页表模块可以设置 PU 要控制是否包括页表模型请在 ARMulator 配置文件 default.ami 中查找 PAGETAB 变量并根据需要进行修改另请参阅本文件中的Pagetables=$PAGETAB{PAGETAB=Default_Pagetables}或{PAGETAB=No_Pagetables}peripherals.ami 的 Pagetables 部分可控制页表内容以及高速缓存和 MMU 或 PU 的配置要找到 Pagetables 部分请查找以下行{Default_Pagetables=PageTables 有关本节所述的标记控制寄存器和页表的完整详情请参阅 ARM Architecture Reference Manual 或您模拟的处理器的技术参考手册2.6.2఼ᒜ MMU ૞ PU ਜ਼঱Ⴅદࡀ第一个标记集可以启用或禁用高速缓存和 MMU 或 PU 的功能MMU=YesAlignFaults=NoCache=YesWriteBuffer=YesProg32=YesData32=YesLateAbort=YesBigEnd=NoBranchPredict=YesICache=YesHighExceptionVectors=NoFastBus=No每个标记对应系统控制寄存器中的一个位即 CP15 中的 c1一些标记只适用于特定处理器例如•BranchPredict只适用于 ARM810™•ICache适用于 StrongARM®-110 和 ARM940T™处理器但不适用于ARM720 处理器这些标记会被其它处理器模型忽略ᓖ有关支持的处理器详情请参阅调试器文档FastBus标记被一些诸如 ARM940T 之类的内核使用请参阅适用于您的内核的技术参考手册如果您的系统使用 FastBus Mode请设置FastBus=Yes以便作为基准如果设置FastBus=No则由于MCCFG因素的影响ARMulator 会假定存储器时钟比内核时钟慢ARMulator 不会建立非同步模式的模型MMU 标记用于在带 PU 的处理器中启用 PU2.6.3఼ᒜ଎ࡀ໭ 2 ਜ਼ 3以下选项只适用于带 MMU 的处理器PageTableBase=0xA0000000DAC=0x00000001它们控制•转换表基址寄存器系统控制寄存器 2•域访问控制寄存器系统控制寄存器 3转换表基址寄存器中的地址必须与 16KB 界限相匹配2.6.4ࡀ߼ཌᎮ其它页表配置部分定义了一组存储区域每个区域均有自己的属性缺省情况下peripherals.ami包含两个区域的说明{ Region[0]VirtualBase=0PhysicalBase=0Size=4GBCacheable=NoBufferable=NoUpdateable=YesDomain=0AccessPermissions=3Translate=Yes}{ Region[1]VirtualBase=0PhysicalBase=0Size=128MbCacheable=YesBufferable=YesUpdateable=YesDomain=0AccessPermissions=3Translate=Yes}您可以按相同的通用格式添加更多区域Region[n]为区域命名以Region[0]开始n是一个整数VirtualBase只适用于带 MMU 的处理器它给出了处理器虚拟地址空间中的区域基址此地址必须与 1MB 边界对齐它由 MMU映射至PhysicalBasePhysicalBase给出了区域的物理基址对于带 MMU 的处理器此地址必须与 1MB 边界对齐对于带 PU 的处理器它所匹配的边界必须是区域大小的若干倍Size指定此区域的大小对于带 MMU 的处理器Size必须是一个以兆字节为单位的整数对于带 PU 的处理器Size必须是 4KB 或 4KB 的二次方倍Cacheable指定是否将区域标记为可高速缓存如果是则从该区域读取的内容会被高速缓存Bufferable指定是否将区域标记为可缓冲如果是则写入区域的内容将使用写缓冲器Updateable只适用于 ARM610™处理器它控制转换表条目中的U位Domain只适用于带 MMU 的处理器它指定表条目的域字段AccessPermissions指定对区域的访问控制有关更多信息请参阅处理器技术参考手册Translate控制对此区域的访问是否引起转换错误如果将区域设为Translate=No则无论何时处理器从该区域读取内容或写入内容都会导致中止您必须确保定义的区域比目标硬件所能支持的少必须至少定义一个区域。

内存c14时序参数

内存c14时序参数

内存c14时序参数内存c14时序参数是指内存模块的一种性能参数,它标识了内存的内部处理速度和数据传输速度。

下面将详细介绍内存c14时序参数的含义和作用。

一、内存c14时序参数的定义内存c14时序参数指的是内存时序中的CAS延迟时间,它是指内存处理一次读写操作所需要的时钟周期数。

在内存读写操作中,CAS是内存控制器命令与内存芯片行为之间的接口标准。

CAS时序参数的数值就代表了内存控制器向内存芯片发送读写指令后,到内存芯片响应该指令所需要的时间。

内存c14时序参数的数值越小,代表内存的处理速度越快。

二、内存c14时序参数的作用内存c14时序参数是内存模块性能的重要指标之一,它直接关系到内存的速度和响应能力。

内存模块的时序参数对于内存性能的影响比较大,不同的内存时序参数对于系统的整体性能也会有一定的影响。

在同等内存容量的情况下,内存c14时序参数越小,内存速度越快,系统的性能也越好。

因此,一些性能要求较高的应用场景,如游戏、视频渲染等领域,对内存c14时序参数的要求比较高。

三、内存c14时序参数的列表划分内存c14时序参数通常会被归为内存时序中的主时序参数之一,其他时序参数包括RAS、FAS、RP、RC等。

这些时序参数一般都是由内存生产厂商进行设置和调整,用户很少需要自己去设置。

此外,内存c14时序参数还有一些控制和调整的方法,如通过BIOS设置、调整内存倍频等方式进行改善和优化。

综上所述,内存c14时序参数是内存模块性能的重要指标之一,它标识了内存的内部处理速度和数据传输速度。

内存c14时序参数越小,代表内存的处理速度越快,系统的性能也越好。

在实际应用中,可以通过BIOS设置、调整内存倍频等方式来优化内存c14时序参数,提升系统性能。

msp430io口的配置和使用

msp430io口的配置和使用

msp430io口的配置和使用msp430 io口的配置和使用一 I/O的简介1、各种复用和各种设置(可以作为简单IO功能也可以作各种第二功能;可控制为输入、输出、接上拉电阻、接下拉电阻、接受中断等各种情况);2、IO口常用寄存器有:PXDIR、PXIN、PXOUT、PXREN、PXSEL、PXDS;其中,X可以是1~8,也可以是A~D,因为P1、P2可以合称为PA。

例如(PAREN=0x0480)就等价于(P2REN=0x04、P1REN=0x80)。

IO口中断相关寄存器:PXIV、PXIFGX、PXIE、PXIES;由于IO 中断仅存在于P1口和P2口,因此X只能为1或2,而且不可以为A。

3、msp430f5529.h中定义了BIT0~BITF,方便用户进行位操作。

例如要设置P1.7和P2.2为输入,代码可如下:PADIR &= ~(BITA + BIT7)。

二 IO口常用寄存器配置1、PxDIR,Px口方向寄存器0 端口配置为输入(默认)1 端口配置为输入2、PxOUT,Px口输出寄存器(输入、输出两种模式)当IO口配置为输出模式时:0 输出低电平1 输出高电平当IO口配置为输入模式并且置高/ 置低使能时:0置低1置高3、PxIN,Px 口输入寄存器只读4、PxREN,Px口置高/ 置低使能寄存器0关闭置高/ 置低1使能置高/ 置低5、PxSEL,Px功能选择寄存器(IO中断只有在普通IO下才能使用)0普通的I/O(默认)1有连接外围电路的特殊用途6、PxDS,Px 口输出驱动能力寄存器(我都是用的默认)0减弱输出驱动能力(默认)1全力输出驱动能力三普通IO使用举例说明:本例程是流水灯加按键控制,每次S1按下,便在等待S2按下,否则,所有LED一直闪烁。

若无按键按下,则八盏灯以流水灯方式显示。

#include ;#define uint8_t unsigned char#define uint16_t unsigned int//********* 控制LED的IO口宏定义************* #define LED145678_PORT_DIRP1DIR#define LED145678_PORT_OUTP1OUT#define LED23_PORT_DIRP8DIR#define LED23_PORT_OUTP8OUT//************ LED的IO口宏定义 ************* #define LED1 0x01#define LED20x02#define LED30x04#define LED40x08#define LED50x10#define LED60x20#define LED70x40#define LED80x80#define LED_ALL0xFF//************ 按键的IO口宏定义************* #define BUTTON_S1(P1IN & BIT7)#define BUTTON_S2(P2IN & BIT2)//*********************************************** ***********//*函数: void delay(uint16_t x_ms)//*功能:延时程序//*参数: x_ms(单位:ms)//*返回:无//*备注:无//*********************************************** ***********void delay(uint16_t x_ms){uint16_t i=0,j=0;for(i=x_ms;i>;0;i--)for(j=110;j>;0;j--);}//*********************************************** ***********//*函数: void LED_Init()//*功能: LED的IO口方向初始化//*参数:无//*返回:无//*备注:无//*********************************************** ***********void LED_Init(){LED145678_PORT_OUT &= ~(BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5);LED145678_PORT_DIR |= BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5;LED23_PORT_OUT &= ~(BIT1 + BIT2);LED23_PORT_DIR |= BIT1 + BIT2;}//*********************************************** ***********//*函数: void Board_ledOn(uint8_t ledMask)//*功能:打开输入的那盏灯//*参数: ledMask//*返回:无//*备注:无//**********************************************************void Board_ledOn(uint8_t ledMask){if (ledMask & LED1) LED145678_PORT_OUT |= BIT0; if (ledMask & LED2) LED23_PORT_OUT |= BIT1;if (ledMask & LED3) LED23_PORT_OUT |= BIT2;if (ledMask & LED4) LED145678_PORT_OUT |= BIT1; if (ledMask & LED5) LED145678_PORT_OUT |= BIT2; if (ledMask & LED6) LED145678_PORT_OUT |= BIT3; if (ledMask & LED7) LED145678_PORT_OUT |= BIT4; if (ledMask & LED8) LED145678_PORT_OUT |= BIT5; }//*********************************************** ***********//*函数: void Board_ledOff(uint8_t ledMask)//*功能:关闭输入的那盏灯//*参数: ledMask//*返回:无//*备注:无//*********************************************** ***********void Board_ledOff(uint8_t ledMask){if (ledMask & LED1) LED145678_PORT_OUT &= ~BIT0; if (ledMask & LED2) LED23_PORT_OUT &= ~BIT1;if (ledMask & LED3) LED23_PORT_OUT &= ~BIT2;if (ledMask & LED4) LED145678_PORT_OUT &= ~BIT1; if (ledMask & LED5) LED145678_PORT_OUT &= ~BIT2; if (ledMask & LED6) LED145678_PORT_OUT &= ~BIT3; if (ledMask & LED7) LED145678_PORT_OUT &= ~BIT4; if (ledMask & LED8) LED145678_PORT_OUT &= ~BIT5; }//*********************************************** ***********//*函数: void Board_ledToggle(uint8_t ledMask)//*功能:输入的那盏灯的状态取反//*参数: ledMask//*返回:无//*备注:无//*********************************************** ***********void Board_ledToggle(uint8_t ledMask){if (ledMask & LED1) LED145678_PORT_OUT ^= BIT0;if (ledMask & LED2) LED23_PORT_OUT ^= BIT1;if (ledMask & LED3) LED23_PORT_OUT ^= BIT2;if (ledMask & LED4) LED145678_PORT_OUT ^= BIT1; if (ledMask & LED5) LED145678_PORT_OUT ^= BIT2; if (ledMask & LED6) LED145678_PORT_OUT ^= BIT3; if (ledMask & LED7) LED145678_PORT_OUT ^= BIT4; if (ledMask & LED8) LED145678_PORT_OUT ^= BIT5; }//*********************************************** ***********//*函数: void main(void)//*功能:主函数//*参数:无//*返回:无//*备注:无//*********************************************** ***********void main(void){uint8_t LED = LED1; //定义变量LEDWDTCTL = WDTPW | WDTHOLD;//关闭看门狗LED_Init(); //初始化LED的IO口方向PADIR &= ~(BITA + BIT7); //将按键的IO口方向设为输入PAREN |=(BITA + BIT7); //置高/ 置低使能PAOUT |=(BITA + BIT7); //置高(类似于上拉)while(1){Board_ledOn(LED);delay(1000); //延时1s左右Board_ledOff(LED);LED = LED。

iommu使用流程 -回复

iommu使用流程 -回复

iommu使用流程-回复IOMMU(Input-Output Memory Management Unit)是一种硬件技术,用于管理系统内存和外设之间的数据交换,保护系统免受恶意软件和不良外设的攻击。

本文将以IOMMU使用流程为主题,详细介绍IOMMU 在计算机系统中的应用和工作原理。

第一步:什么是IOMMU?IOMMU是一种硬件设备,类似于CPU中的MMU(Memory Management Unit)。

它起到了类似的作用,但是专注于管理外设和系统内存之间的数据传输。

IOMMU可以把外设的I/O请求映射到系统内存的虚拟地址空间中,同时确保外设不能访问和破坏系统内存的其他部分。

第二步:IOMMU的工作原理是什么?在计算机系统中,每个外设都有自己的设备驱动程序,负责控制和管理设备。

IOMMU通过在设备驱动程序中集成一个特殊的软件组件,即IOMMU 驱动,与外设进行通信。

IOMMU驱动通过配置IOMMU硬件,实现外设I/O请求和系统内存之间的映射。

当外设需要读取或写入系统内存时,它会发出一个I/O请求。

此时,IOMMU通过检查设备的身份信息和权限,决定是否允许该请求。

如果请求合法,IOMMU将把请求中的虚拟地址映射到真实的物理地址,并将数据从设备传输到系统内存,或从内存传输到设备。

IOMMU还能够提供内存保护机制,确保只有授权的设备可以访问特定的内存区域。

这使得IOMMU成为保护系统免受恶意软件和不良外设攻击的重要技术。

第三步:IOMMU的使用场景和优势有哪些?IOMMU在虚拟化、数据安全和设备隔离等领域有着广泛的应用。

下面我们将介绍一些常见的使用场景以及IOMMU带来的优势。

1. 虚拟化:IOMMU可以提供硬件级别的设备隔离,使得虚拟机之间的设备相互隔离,确保每个虚拟机都可以独立地访问设备资源。

这大大提高了虚拟化系统的安全性和性能。

2. 数据安全:IOMMU的内存保护机制可以防止恶意设备访问系统内存中的敏感数据。

uefi io操作

uefi io操作

uefi io操作UEFI(统一可扩展固件接口)是一种新一代的固件接口标准,作为传统BIOS的替代品,它在计算机硬件启动过程中扮演着重要的角色。

UEFI IO操作是指在UEFI环境下进行的输入输出操作。

UEFI IO操作在计算机启动过程中起到了至关重要的作用。

它可以实现与外部设备的数据交互,如硬盘、光驱、网卡等。

通过UEFI IO操作,计算机可以读取和写入硬件设备的数据,实现数据的传输和存储。

UEFI IO操作使用的是一系列标准的函数接口,这些函数接口提供了统一的操作方式,方便开发者进行编程。

通过这些函数接口,开发者可以实现对硬件设备的访问和控制,实现数据的读取和写入。

UEFI IO操作的实现需要遵循一定的规范。

首先,开发者需要了解硬件设备的特性和功能,确定需要进行的IO操作类型。

然后,根据设备的类型和特性,选择合适的IO操作函数进行编程。

最后,通过函数调用,实现对硬件设备的IO操作。

UEFI IO操作的实现可以有多种方式。

一种常见的方式是使用UEFI 提供的文件系统接口进行文件的读写操作。

通过打开文件、读取文件内容、写入文件内容等操作,实现对文件的IO操作。

另一种方式是使用UEFI提供的网络接口进行网络数据的传输。

通过建立网络连接、发送和接收数据包等操作,实现对网络设备的IO操作。

在进行UEFI IO操作时,需要注意一些问题。

首先,要确保对硬件设备的访问是合法的,避免对设备进行非法的操作。

其次,要保证IO操作的正确性和可靠性,避免数据的丢失或损坏。

最后,要及时释放资源,避免资源的浪费和占用。

UEFI IO操作在计算机启动过程中起到了至关重要的作用。

它通过提供统一的函数接口,实现了对硬件设备的访问和控制,实现了数据的读取和写入。

在实现UEFI IO操作时,需要遵循一定的规范,确保操作的合法性和正确性。

同时,要注意对资源的释放,避免资源的浪费和占用。

通过合理的使用UEFI IO操作,可以提高计算机系统的性能和稳定性。

DMC1380硬件使用手册V1.1

DMC1380硬件使用手册V1.1

货品编码 811-138000-10 812-A37ENC-30 144-372822-00 143-DE4037-03
货品名称 运动控制卡 DMC1380 接线板 ACC37-74ENC V3.0 电缆线 CABLE37-DP-20(37Pin 长 2m DB 连接线 带 DB 插头) 扁平线 CABLE40-IP/DP-03(IDE4037 连接线 长 0.3m(连接线组件))
orgxin1轴原点信号输入或为in110orgyin2轴原点信号输入或为in211orgzin3轴原点信号输入或为in312elxin4轴正限位信号输入或为in413elxin5轴负限位信号输入或为in514elyin6轴正限位信号输入或为in615elyin7轴负限位信号输入或为in716elzin8轴正限位信号输入或为in817elzin9轴负限位信号输入或为in918sdxin10轴正减速信号输入或为in1019sdxin11轴负减速信号输入或为in1120pulz轴脉冲正输出21pulz轴脉冲负输出22dirz轴方向正输出23dirz轴方向负输出24out1输出口1隔离输出25out2输出口2隔离输出26out3输出口3隔离输出27out4输出口4隔离输出28out5输出口5隔离输出29out6输出口6隔离输出30out7输出口7隔离输出31out8输出口8隔离输出32sdyin12轴正减速信号输入或为in12dmc1380硬件使用手册version1133sdyin13轴负减速信号输入或为in1334sdzin14轴正减速信号输入或为in1435sdzin15轴负减速信号输入或为in1536vdd外部电源正极输入12v24v37exgnd外部电源负极输入注
本产品配有完整的运动控制函数动态链接库,客户可在 Windows98/NT/2000/XP 下方便地编写自己的应用软件;同时提供 Motion1380 调 试示范软件,该软件既可演示此卡功能,也可测试运动控制卡、电机驱动电路、 运动平台的工作情况。

IO系统性能之一:衡量性能的几个指标

IO系统性能之一:衡量性能的几个指标

IO系统性能之一:衡量性能的几个指标2011年03月24日05:00 it168网站原创作者:DBABeta 马齿苋编辑:李隽我要评论(0)【IT168 应用】作为一个数据库管理员,关注系统的性能是日常最重要的工作之一,而在所关注的各方面的性能只能IO性能却是最令人头痛的一块,面对着各种生涩的参数和令人眼花缭乱的新奇的术语,再加上存储厂商的忽悠,总是让我们有种云里雾里的感觉。

本系列文章试图从基本概念开始对磁盘存储相关的各种概念进行综合归纳,让大家能够对IO性能相关的基本概念,IO性能的监控和调整有个比较全面的了解。

在这一部分里我们先舍弃各种结构复杂的存储系统,直接研究一个单独的磁盘的性能问题,藉此了解各个衡量IO系统系能的各个指标以及之间的关系。

需要注意的是,本文探讨的仅限于磁盘IO性能,网络IO性能不考虑在内。

几个基本的概念 在研究磁盘性能之前我们必须先了解磁盘的结构,以及工作原理。

不过在这里就不再重复说明了,关系硬盘结构和工作原理的信息可以参考维基百科上面的相关词条——Hard disk drive(英文)和硬盘驱动器(中文)。

读写IO(Read/Write IO)操作 磁盘是用来给我们存取数据用的,因此当说到IO操作的时候,就会存在两种相对应的操作,存数据时候对应的是写IO操作,取数据的时候对应的是是读IO操作。

单个IO操作 当控制磁盘的控制器接到操作系统的读IO操作指令的时候,控制器就会给磁盘发出一个读数据的指令,并同时将要读取的数据块的地址传递给磁盘,然后磁盘会将读取到的数据传给控制器,并由控制器返回给操作系统,完成一个写IO的操作;同样的,一个写IO的操作也类似,控制器接到写的IO操作的指令和要写入的数据,并将其传递给磁盘,磁盘在数据写入完成之后将操作结果传递回控制器,再由控制器返回给操作系统,完成一个写IO的操作。

单个IO操作指的就是完成一个写IO或者是读IO的操作。

随机访问(Random Access)与连续访问(Sequential Access) 随机访问指的是本次IO所给出的扇区地址和上次IO给出扇区地址相差比较大,这样的话磁头在两次IO操作之间需要作比较大的移动动作才能重新开始读/写数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第十四章流式I/O和文件本模块讨论文件,socket和其他数据源使用的流式I/O机制。

第一节相关问题讨论-以下为与本模块内容有关的问题:●Java编程语言中使用什么机制来读写文件?第二节目标在完成了本模块的学习后,你应当能够:●描述和使用java.io包的流式思想●构造文件和过滤器流,并恰当地使用它们●区别流与读者和作者,并进行合适的选择●考察并操作文件和目录●读、写和更新文本和数据文件●使用Serialization接口来保持对象的状态第三节流式I/O本模块考察了Java编程语言如何使用流来处理字节和字符I/O(包括stdio,stdout和stderr)。

下面几节将考察有关处理文件和操作它们所包含的数据的特定细节。

14.3.1流的基础知识一个流是字节的源或目的。

次序是有意义的。

例如,一个需要键盘输入的程序可以用流来做到这一点。

两种基本的流是:输入流和输出流。

你可以从输入流读,但你不能对它写。

要从输入流读取字节,必须有一个与这个流相关联的字符源。

在java.io包中,有一些流是结点流,即它们可以从一个特定的地方读写,例如磁盘或者一块内存。

其他流称作过滤器。

一个过滤器输入流是用一个到已存在的输入流的连接创建的。

此后,当你试图从过滤输入流对象读时,它向你提供来自另一个输入流对象的字符。

14.3.2 InputStream方法● int read()● int read(byte [])● int read(byte[], int ,int )这三个方法提供对输入管道数据的存取。

简单读方法返回一个int 值,它包含从流里读出的一个字节或者-1,其中后者表明文件结束。

其它两种方法将数据读入到字节数组中,并返回所读的字节数。

第三个方法中的两个int 参数指定了所要填入的数组的子范围。

注-考虑到效率,总是在实际最大的块中读取数据。

void close()你完成流操作之后,就关闭这个流。

如果你有一个流所组成的栈,使用过滤器流,就关闭栈顶部的流。

这个关闭操作会关闭其余的流。

int available()这个方法报告立刻可以从流中读取的字节数。

在这个调用之后的实际读操作可能返回更多的字节数。

skip(long)这个方法丢弃了流中指定数目的字符。

boolean markSupported()void mark(int)void reset()如果流支持“回放”操作,则这些方法可以用来完成这个操作。

如果mark()和reset()方法可以在特定的流上操作,则markSupported()方法将返回ture 。

mark(int)方法用来指明应当标记流的当前点和分配一个足够大的缓冲区,它最少可以容纳参数所指定数量的字符。

在随后的read()操作完成之后,调用reset()方法来返回你标记的输入点。

14.3.3 OutputStream 方法●void write(int) ●void write(byte []) ●void write(byte [], int, int)这些方法写输出流。

和输入一样,总是尝试以实际最大的块进行写操作。

void close()当你完成写操作后,就关闭输出流。

如果你有一个流所组成的栈,就关闭栈顶部的流。

这个关闭操作会关闭其余的流。

void flush()有时一个输出流在积累了若干次之后才进行真正的写操作。

flush()方法允许你强制执行写操作。

第四节基本的流类在java.io包中定义了一些流类。

下图表明了包中的类层次。

一些更公共的类将在后面介绍。

14.4.1 FileInputStream和FileOutputStream这些类是结点流,而且正如这个名字所暗示的那样,它们使用磁盘文件。

这些类的构造函数允许你指定它们所连接的文件。

要构造一个FileInputStream,所关联的文件必须存在而且是可读的。

如果你要构造一个FileOutputStream而输出文件已经存在,则它将被覆盖。

FileInputStream infile =new FileInputStream("myfile.dat");FileOutputStream outfile =new FileOutputStream("results.dat");14.4.2 BufferInputStream和BufferOutputStream这些是过滤器流,它们可以提高I/O操作的效率。

14.4.3 DataInputStream和DataOutputStream这些过滤器通过流来读写Java基本类。

例如:DataInputStream方法byte readByte()long readLong()double readDouble()DataOutputStream方法void writeByte(byte)void writeLong(long)void writeDouble(double)注意DataInputStream和DataOutputStream的方法是成对的。

这些流都有读写字符串的方法,但不应当使用这些方法。

它们已经被后面所讨论的读者和作者所取代。

14.4.4 PipedInputStream和PipedOutputStream管道流用来在线程间进行通信。

一个线程的PipedInputStream对象从另一个线程的PipedOutputStream 对象读取输入。

要使管道流有用,必须有一个输入方和一个输出方。

第五节 URL输入流除了基本的文件访问之外,Java技术提供了使用统一资源定位器(URL)来访问网络上的文件。

当你使用Applet的getDocumentBase()方法来访问声音和图象时,你已经隐含地使用了URL对象。

String imageFile = new String ("images/Duke/T1.gif");images[0] = getImage(getDocumentBase(), imageFile);然而,你必须象下面的程序那样提供一个直接的URL.URL imageSource;try {imageSource = new URL("/~info");} catch ( MalformedURLException e) {}images[0] = getImage(imageSource, "Duke/T1.gif");14.5.1 打开一个输入流你可以通过存储文档基目录下的一个数据文件来打开一个合适的URL输入流。

1.InputStream is = null;2.String datafile = new String("Data/data.1-96");3.byte buffer[] = new byte[24];4.try {5.// new URL throws a MalformedURLException6.// URL.openStream() throws an IOException7.is = (new URL(getDocumentBase(),datafile)).openStream();8.} catch (Exception e) {}现在,你可以就象使用FileInputStream对象那样来用it来读取信息:1.try {2.is.read(buffer, 0, buffer.length);3.} catch (IOException e1) {}警告-记住大多数用户进行了浏览器的安全设置,以防止Applet存取文件。

第六节读者和作者14.6.1 UnicodeJava技术使用Unicode来表示字符串和字符,而且它提供了16位版本的流,以便用类似的方法来处理字符。

这些16位版本的流称为读者和作者。

和流一样,它们都在java.io包中。

读者和作者中最重要的版本是InputStreamReader和OutputStreamWriter。

这些类用来作为字节流与读者和作者之间的接口。

当你构造一个InputStreamReader或OutputStreamWriter时,转换规则定义了16位Unicode和其它平台的特定表示之间的转换。

14.6.2字节和字符转换缺省情况下,如果你构造了一个连接到流的读者和作者,那么转换规则会在使用缺省平台所定义的字节编码和Unicode之间切换。

在英语国家中,所使用的字节编码是:ISO 8859-1。

你可以使用所支持的另一种编码形式来指定其它的字节编码。

在native2ascii工具中,你可以找到一个关于所支持的编码形式的列表。

使用转换模式,Java技术能够获得本地平台字符集的全部灵活性,同时由于内部使用Unicode,所以还能保持平台独立性。

14.6.3缓冲读者和作者因为在各种格式之间进行转换和其它I/O操作很类似,所以在处理大块数据时效率最高。

在InputStreamReader和OutputStreamWriter的结尾链接一个BufferedReader和BufferedWriter是一个好主意。

记住对BufferedWriter使用flush()方法。

14.6.4读入字符串输入下面这个例子说明了从控制台标准输入读取字符串所应当使用的一个技术。

1.import java.io.*;2.public class CharInput {3.public static void main (String args[]) throws4.java.io.IOException {5.String s;6.InputStreamReader ir;7.BufferedReader in;8.ir = new InputStreamReader(System.in);9.in = new BufferedReader(ir);10.11.while ((s = in.readLine()) != null) {12.System.out.println("Read: " + s);13.}14.}15.}14.6.5使用其它字符转换如果你需要从一个非本地(例如,从连接到一个不同类型的机器的网络连接读取)的字符编码读取输入,你可以象下面这个程序那样,使用显式的字符编码构造ir=new InputStreamReader(System.in, “8859_1”);注-如果你通过网络连接读取字符,就应该使用这种形式。

否则,你的程序会总是试图将所读取的字符当作本地表示来进行转换,而这并不总是正确的。

ISO 8859-1是映射到ASCII的Latin-1编码模式。

相关文档
最新文档