最新日志

发表于:2007-8-21 18:35:54
标签:无标签

0

K9F1208U0B

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(166)
发表于:2007-8-13 0:41:21
标签:无标签

0

NAND & NOR

随着嵌入式系统越来越广泛的应用,嵌入式系统中的数据存储和数据管理已经成为一个重要的研究课题. FLASH存储器具有速度快,成本低等很多优点,因此在嵌入式系统中的应用也越来越多.为了合理地管理存储数据,进行数据共享,FLASH的设计在ARM嵌入式系统中对数据存储和数据管理尤为重要.

一.实例说明.

   在嵌入式设备中,有两种程序运行方式: 一种是将程序加载到SDRAM中运行,另一种是程序直接在其所在的ROM/FLASH存储器中运行.一种比较常用的运行程序的方法是将FLASH存储器作为一个硬盘使用,当程序需要运行时,首先将其加载到SDRAM存储器中,在SDRAM中运行.通常相对于ROM而言,SDRAM访问速度较快,数据总线较宽,程序在SDRAM中的运行速度比在FLASH中运行速度快.ARM中存储模块示意图如下

其中各功能模块的含义如下.

1.系统初始化. 进行系统的最小初始化,包括初始化系统时钟,系统的中断向量表,SDRAM及一些其它的重要 I/O端口.

2.映象文件的下载. 通过一定的方式,得到新的目标程序的映象文件,将该文件保存到系统中的SDRAM中.要完成这部分工作,ARM嵌入式设备需要与外部的主机建立某种通道,大部分系统都是使用串行口,也可以使用以太网口或者并行口进行通信.

3.FLASH写入. 根据不同的FLASH存储器,选择合适的操作指令,将新的目标程序的映象文件写入目标系统的FLASH存储器中,实现FLASH存储器操作的功能模块.在本实例里,FLASH用来存放程序代码,向量表和一些系统掉电后需要保存的用户数据等.

二. FLASH原理

   1.性能比较

   FLASH闪存是非易失性存储器,可以对存储器单元块进行擦写和再编程. 任何FLASH器件进行写入操作前都必须先执行擦除操作. NAND执行擦除操作十分简单;而NOR要求在执行擦除操作前先将目标块内所有的位都写为0. 擦除:NOR器件是以64~128的块进行的,执行一个写入/擦除操作时间为1~5S;擦除NAND是以8~32K的块进行的,执行相同的操作最多需要4mS的时间.

   执行擦除操作时,块尺寸的不同进一步拉大了NOR和NAND之间的性能差异.统计表明,对于给定的一套写入操作(尤其是更新小文件时),更多的擦除操作必须在基于NOR的单元中进行.因此选择存储方案时,必须权衡以下各项因素:NOR的读取速度比NAND稍快一些;NAND写入速度比NOR快很多;NAND擦除速度远比NOR快;NAND擦除单元更小,相对擦除电路更少.

   2.接口差异

   NOR带有SRAM接口,有足够的地址引脚来寻址,可以很容易地来存取其内容的每一字节.NAND使用复杂的I/O口来串行地存取数据.各个厂商产品的方法可能不同.8个引脚用来传送控制,地址和数据信息.NAND的读写操作采用512字节的块,这一点有点象硬盘管理,很自然地,基于NAND的存储器就可以取代硬盘或其他块设备.

   3.容量和成本

   NAND的单元尺寸基本上是NOR的一半.由于生产过程更为简单,NAND结构可以在给定的模具尺寸内提供更高的容量,也就相应地降低了价格. NOR占据了大部分容量为1~16MB的内存市场,而NAND只是用在8~128M的产品当中.

   4.可靠性和耐用性

   采用FLASH介质时一个重点要考虑的问题是可靠性.对于需要扩展MTBF的系统来说,FLASH是非常合适的存储方案.可以从寿命,位交换和坏块处理三个方面来比较NOR和NAND的可靠性.1.寿命.NAND每个块的擦写次数是100万次,而NOR的擦写次数是10万次.NAND除了具有10:1擦除周期优势外,块尺寸要比NOR小8位,每个块在给定时间内删除的次数要少一些.2.位交换.所有的FLASH器件都受位交换现象的困扰,在某些情况下,一个比特位会发生反转或被报告反转了.一位的变化可能不很明显,但是如果发生在一个关键文件上,这个小小的故障就可能导致系统停机.如果只是被报告有问题,则多读几次就有可能解决.位反转的问题更多见于NAND,NAND供应商建议使用NAND闪存时,同时使用EDC/ECC算法,当然,如果用本地存储设备来存储操作系统,配置文件或其他敏感信息时,则必须使用EDC/ECC系统以确保可靠性.3.坏块处理.NAND中的坏块是随机分布的,以前做过消除坏块的努力,但发现成品率太低,代价太高,根本不划算.NAND需要对介质进行初始化扫描以发现坏块,并将坏块标记为不可用.在已制成的器件中,如果通过可靠的方法不能进行这项处理,则将导致高故障率.

5.易用性

   可以非常直接地使用基于NOR的闪存,象其它存储器那样连接,并可以在上面直接运行代码.由于需要I/O接口,NAND要复杂得多,各种NAND器件的存取方法因厂家而不同.在使用NAND器件时,必须先写入驱动程序,才能继续执行其它操作.向NAND写入信息需要相当的技巧,因此设计人员决不能向坏块写入,这就意味着NAND自始至终都必须进行虚拟映射.

6.软件支持

   在NOR器件上运行代码不需要任何软件支持,在NAND器件上进行同样操作时,通常需要驱动程序,也就是闪存技术驱动程序,NAND和NOR在进行写入和擦除操作时都需要MTD.但NOR需要的MTD要相对少一些,许多厂商都提供基于NOR器件更高级的软件,在LINUX系统中经常采用JFFS的驱动.

FLASH驱动.

   对于FLASH器件的驱动,LINUX提供了完善的驱动程序,只需要在内核配置里面选择好相应的类型即可.在LINUX中通过MTD子系统提供的抽象设备机制,来实现对FLASH的管理控制和读写.MTD设备是一类特殊的存储设备,如常用的FLSAH芯片,CFI卡等,MTD同时提供通过字符设备方式和块设备方式来管理控制MTD设备的机制.MTD核心层分为:用户模块接口层,MTD抽象层和MTD设备驱动模块层.MTD核心层通过设备驱动模块实现对存储设备的物理访问功能,通过用户模块提供用户空间直接访问的接口.MTD设备驱动模块层负责驱动FLASH硬件,只需实现实际设备上的访问控制,与内核交互的复杂工作则由MTD抽象层完成.其中也对NAND的驱动实现了抽象,还实现了错误检测与纠错和坏快处理等用户模块层提供从用户空间直接访问的接口.上层应用只需通过MTD抽象层提供的字符设备方式或块设备方式来访问MTD抽象设备.然后通过MTD的内部机制把这些请求交给实际的驱动模块去执行.MTD抽象层定义了抽象的MTD设备机构,对于具体设备的驱动模块,需要设计好公共函数的实际内容,并在检测到实际设备后注册一个MTD设备,然后就可通过MTD提供的字符设备访问方式或块设备访问方式直接使用具体的硬件设备.

硬件电路的设计.

   NOR用于存放系统代码,NAND主要用于存放用户信息.

NOR的设计.

   系统所用的NOR是INTEL公司的E28F128J3 FLASH , 128M bit的存储空间由128个128KB的擦除块组成.擦除块是相互独立的,每一块的擦触操作都可以在1S内完成.每一块可以被独立地擦出1000000次.这些块可以分别设定为是可锁的或者是非可锁的,由一个锁定位来控制. 还有一个128bit的保护寄存器可以复用.

点击看大图

该FLASH采用25根地址线和16位数据线,可以通过nBYTE这个信号来选择是8位还是16位方式访问.该系统是采用16位方式访问的,因此该信号线接高电平,同时A0地址不起作用,一同接高.nOE/nWE是读写信号,由EP7312的读写控制线直接控制.FLASH的片选信号有三个,它们组合后的结果如下图示.

点击看大图

NAND-FLASH设计

   系统中所用的NAND芯片是SAMSUNG的K9F2808U,该器件存储容量为16M*8位,除此之外还有512K*8位的空闲存储区.该器件采用TSSOP48的封装,工作电压为2.7V~3.6V,8位I/O口采用地址,数据,命令复用的方式,这样既可减少引脚数量,又可使接口电路简捷.由于ARM系统没有NAND控制所需要的CLE,ALE等信号,因此需要利用ARM的通用I/O口.

点击看大图

点击看大图

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(266)
发表于:2007-8-12 0:56:32
标签:无标签

0

TOUCH PANEL

一.触摸屏的几个概念. 所谓触摸屏,从市场概念来说,就是一种人人都会使用的计算机输入设备,或者说是人人都会使用的与计算机沟通的设备.不用学习,人人都会使用,是触摸屏最大的魔力.这一点无论是键盘还是鼠标都无法比拟. 从技术原理角度讲,触摸屏是一套透明的绝对寻址系统,首先它必须保证是透明的,因此它必须通过材料科技来解决透明问题,象数字化仪,写字板,电梯开关,他们都不是触摸屏. 其次它是绝对坐标,手指摸哪就是哪,不需要第二个动作,不象鼠标是相对定位的一套系统,我们可以注意到,触摸屏软件都不需要游标,有游标反倒影响用户的注意力,因为游标是给相对定位的设备用的,相对定位的设备要移动到一个地方首先要知道现在在什么地方,往哪个方向去,每时每刻还需要不停的给用户反馈当前的位置才不致产生偏差,这些对采取绝对坐标定位的触摸屏来说都不需要,再其次就是能检测手指的触摸动作并且判定手指位置,各类触摸屏技术就是围绕"检测手指触摸"而八仙过海各显神通的.

1.触摸屏的一个指针:光学特性.它直接影响到触摸屏的视觉效果. 但是触摸屏是多层的复合薄膜,光学特性上包含四个方面:透明度,色彩失真度,反光性和清晰度. 彩色世界包含了可见光波段中的各种波长色,在没有完全解决透明材料之前,或者说还没有低成本的完全解决透明材料科技之前,多层复合薄膜的触摸屏在各波长下的透光性还不能达到理想的一致状态,下面是一个示意图.

由于透光性与波长曲线图的存在,通过触摸屏看到的图象不可避免的与原图象产生了色彩失真,静态的图象感觉还只是色彩的失真,动态的多媒体图象感觉就非常不舒服了,色彩失真度就是图中的最大色彩失真度,自然是越小越好. 反光性,主要是指由于镜面反射造成图象重叠身后的光影,例如人影,窗户,灯光等.反光是触摸屏带来的负面效果,越小越好,它影响用户的浏览速度,严重时甚至无法辨认图象字符,反光性强的触摸屏使用环境受到限制,现场的灯光配置也被迫需要调整.大多数存在反光问题的触摸屏都提供另外一种经过表面处理的型号:磨砂面触摸屏,也叫防眩型,价格略高一些,防眩型的反光性明显下降,适用采光非常充足的大厅或展览场所,不过防眩性的透光性和清晰度也随之有较大幅度的下降.清晰度.有些触摸屏在加装后,字迹模糊,图象细节模糊,整个屏幕显得模模糊糊,看不清楚,这就是清晰度太差. 清晰度的问题主要是多层薄膜结构的触摸屏,由于薄膜层之间光反复反射折射所造成的,此外防眩型触摸屏由于表面磨砂也会造成清晰度下降,清晰度不好,眼睛容易疲劳,对眼睛也有一定伤害.

2.触摸屏的第二个特性:稳定性. 触摸屏是绝对坐标系统,要选哪就直接点哪,与鼠标这类相对定位系统的本质区别是一次到位的直观性.绝对坐标系的特点是每一次定位坐标与上一次定位坐标没有关系.触摸屏在物理上是一套独立的坐标定位系统,每次触摸的资料通过校准资料转为屏幕上的坐标,这样就要求触摸屏的这套坐标不管在什么情况下,同一点的输出资料是稳定的,如果不稳定,那么这触摸屏就不能保证绝对坐标定位,点不准,这就是触摸屏最怕的问题:漂移. 技术原理上凡是不能保证同一点除摸每一次采样资料相同的除摸屏都免不了漂移这个问题. 目前有漂移现象的只有电容触摸屏.

3.触摸屏的第三个特性:相应性. 检测触摸并定位,各种触摸屏技术都是依靠各自的传感器来工作的,甚至有的触摸屏本身就是一套传感器,各自的定位原理及各自使用的传感器决定了触摸屏的反应速度,可靠性,稳定性和寿命.触摸屏的传感器方式还决定了触摸屏如何识别多点触摸的问题,也就是超过一点的同时触摸怎么办,有人触摸时接着又有人触摸怎么办,这是触摸屏使用过程中经常遇到的问题,我认为最理想的方式是:超过一点的同时触摸谁也不判断,直到多点触摸移走,有人触摸接着又有人触摸应该是先后都判断,当然是技术上可能的话.红外触摸屏靠多对红外发射和接收对管来工作,红外对管性能和寿命都比较可靠,任何阻挡光线的物体都可以用来作触摸物,不过红外触摸屏使用传感器数目将近100对,并且共享外围电路,这就要求传感器不仅本身性能好,还要求将近100对的红外二极管"光-电阻特性"和"结电容"都保持一致.实际应用中万一有哪对出现故障,可以在上电自检中发现并在以后加以忽略.靠临近的红外线代替,由于每一对红外线只"监管"约6mm左右的窄带,而手指通常在15mm左右宽度,用户是察觉不到的,但如果生产过程中没有对红外发射管进行老化测试,没有很好的质量管理体系,将近100对的传感器,很快就不是一对两对掉队的问题了,总体寿命也就难以保证,下图是红外触摸屏的示意图.

电容触摸屏实际上是一套精密的漏电传感器,带手套的手不能触摸,由于使用电容方式,导致漂移现象,在下节电容触摸屏有详细的介绍.超声波触摸屏有表面声波触摸屏和体波声波触摸屏,利用的都是电-声压电换能器做传感器,接受传感器和发射传感器所用的压晶体管不是一种型号,在制造时的掺杂材料略有不同.发射换能器功率大,接受换能器更加灵敏. 压电换能器的寿命长,工作稳定,正常工作可以保证十年不出问题.触摸屏安装后,换能器是隐藏起来的,但是在运输和安装过程中需要小心谨慎,裸露的换能器晶体不能碰装挤压,表面声波触摸屏有X.Y两对传感器,利用屏幕表面的声表面波来检测手指触摸,可以说工作面是一层看不见,打不坏的声能,不怕暴力使用,最适合公共信息查询.

以上谈了一些触摸屏的概念,当然只是纯技术原理的一些探讨,评判一种触摸屏,光是技术原理还只是其中的一部分,触摸屏要应用到各个领域,还要抵受千触万摸,选用材料的耐用性如何,反应速度如何,价格能否承受,这些都是理性的评判一种触摸屏.由于目前基于电阻技术的触摸屏价格低廉,亦可满足绝大多数,下面着重介绍一下电阻式触摸屏的基本原理: 电阻式触摸屏体部分是一块与显示器表面非常配合的多层复合薄膜,由一层玻璃或有机玻璃作为基层,表面涂有一层透明的导电层,上面再盖有一层外表面硬化处理,光滑防刮的塑料层,它的内表面也涂有一层透明导电层,在两层导电层之间有许多细小的透明隔离点把它们隔离绝缘.

当手指触摸屏幕时,平常相互绝缘的两层导电层就在触摸点位置有了一个接触,因其中一面导电层接触Y轴方向的5V均匀电压场,使得侦测层的电压由零变为非零,控制器侦测到这个接通后,进行A/D转换,并将得到的电压值与5V相比即可得到触摸点的Y轴坐标,同理得出X轴的坐标,这就是所有电阻触摸屏所共有的基本工作原理.电阻式触摸屏的关键在于材料科技.常用的透明导电涂层材料有: 1. ITO,氧化铟,弱导电体,特性是当厚度降低到1800个埃以下时会突然变得透明,透光率为80%,再薄下去透光率反而下降,到300埃厚度时又上升到80%,ITO是所有电阻技术触摸屏及电容技术触摸屏都要用到的技术材料.实际上电阻和电容技术触摸屏的工作面就是ITO涂层.2.镍金涂层.五线电阻触摸屏的外层使用的是延展性好的镍金涂层材料,外导电层由于频繁触摸,使用延展性好的镍金材料是为了延长使用寿命,但是工艺成本较高,镍金导电层虽然延展性好,但是只能做透明导体,不适合做电阻式触摸屏的工作面,因为它导电率高,而且金属不容易做到厚度均匀,不宜做电压分布层,只能做探层.五线电阻触摸屏:五线电阻技术触摸屏的基层是把两个方向的电压通过精密电阻网络都加在玻璃的导电工作面上,我们可以简单理解为两个方向的电压场分时工作加在同一工作面上,而外层镍金导电层只仅仅当作纯导体.有触摸后分时检测内部触摸点X轴和Y轴电压值的方法测得触摸点的位置.五线电阻触摸屏内层ITO需四条引线,外层只做导体仅仅一条,触摸屏的引出线共有五条.五线制电阻触摸屏结构如图.

四线电阻触摸屏的缺陷: 四线触摸屏的B面要经常被触动,而B面采用ITO,我们知道,ITO是极薄的氧化金属,在使用过程中很快就会产生轻微的裂纹,裂纹一旦产生,原本流经此处的电流被迫绕道而行,本该均匀分布的电压随之遭到破坏,触摸屏就有了损伤,表现为裂纹处点不准.

随着裂纹的加剧和增多,触摸屏慢慢就会失效,因此使用寿命不长是四线电阻触摸屏的主要问题.

五线电阻触摸屏的改进. 首先五线电阻触摸屏的A面是导电玻璃而不是导电涂覆层,导电玻璃的工艺使得A面的寿命得到了极大的提高,并且可以提高透光率. 其次五线电阻式触摸屏将工作面的任务都交给了使用寿命比较长的A面,而B面只用来做为导体,并且采用了延展性好,电阻率低的镍金透明导电层,因此B面的寿命也得到了极大的提高.

五线电阻式触摸屏的另一个专用技术是通过精密的电阻网络来校正A面的线性问题,由于工艺工程不可避免的有可能厚薄不均而造成电压场分布的不均匀,精密电阻网络在工作时流过觉大部分电流,因此可以补偿工作面有可能的线性失真. 五线电阻式触摸屏是目前最好的电阻式触摸屏,主要用于军事,医疗等领域.

但是四线电阻式触摸屏由于价格低廉,在通用领域的运用,下面将结合S3C2410内置的触摸屏控制器来详细讲解整个触摸屏电路的工作及测量过程.下面是四线电阻式触摸屏测量时的等效电路.

测量时,分为以下三个步骤.

1.在触摸屏没有被按下的时候,触摸屏的X轴和Y轴不会接触到一起,此时这个电路处于"Pen Down Detect"状态. S1,S2,S4断开,S3,S5闭合.X+~X-整个轴上的电压都为0V,Y-端悬空,Y+端由于由上拉电阻R1的存在而呈现高电平.当 "Pen Down"后,X轴和Y轴由于受挤压而相互接触导通后,Y轴的电压由于连接到X轴接地而变成低电平,此低电平可用来作为中断触发信号来通知CPU发生"Pen Down"事件.

2.当检测到"Pen Down"事件后,CPU立刻进入X轴坐标测量状态: S1,S3闭合,S2,S4,S5断开,由于X轴和Y轴在接触点按下而连通,因此Y+端的X_ADC可以认为是X轴的分压采样点,从而计算出X轴的坐标.

3.采样X轴的坐标后,S1,S3,S5断开,S2,S4闭合,同样可以计算出Y轴的坐标.

二.S3C2410的模数转换器ADC及触摸屏控制器.

S3C2410内置一个8信道的10bit模数转换器ADC,该ADC能以500KSPS的采样资料将外部的模拟信号转换为10bit分辨率的数字量,同时ADC部分能与CPU的触摸屏控制器协同工作,完成对触摸屏绝对地址的测量.

特性.

分辨率:10bit . 相信误差: +/- 2LSB . 最大转换速率: 500KSPS . 模拟量输入范围: 0~3.3V . 分步X/Y坐标测量模式. 自动X/Y坐标测量模式. 中断等待模式. 下图是ADC及触摸屏控制器部分的逻辑示意图.

点击看大图

随后的图是在S3C2410 ADC及触摸屏控制器的基础上外接触摸屏的示意图,以及外部电路的实际原理图.需要补充说明的是,图中Q1,Q2是P沟道MOS管,开门电压为1.8V; Q3,Q4为N沟道MOS管,开门电压为2.7V;运用学过的电子电路知识,我们知道但MOS管导通后,MOS管的源--漏之间可以认为是直通的,及可以把MOS管认为是图中真正的开关,AVDD是外部模拟参考源,一般接3.3V电源,XP,XM和YP,YM分别是触摸屏的四条引线,各自对应X轴和Y轴电阻.

点击看大图

ADC及触摸屏控制器的工作模式.

1.ADC普通转换模式(Normal Conversion Mode),用于一般的AD转换.

2.独立X/Y轴坐标转换模式.其实包含了X轴坐标和Y轴坐标两种模式. 首先运行X轴的坐标转换,X轴的坐标转换资料会写到ADCDAT0寄存器的XPDAT中,等待转换完成后,触摸屏控制器会产生相应的中断.然后运行Y轴的坐标转换(AUTO_PST=0,XY_PST=2),Y轴的转换资料会写入到ADCDAT1寄存器的XPDAT中,等待转换完成后,触摸屏控制器会产生相应的中断.

3.自动X/Y轴坐标转换模式. 将会自动的进行X轴和Y轴的转换操作,随后产生相应的中断.

4.中断等待模式.在系统等待"Pen Down",即触摸屏按下的时候,其实是处于中断等待模式.一旦被按下,实时产生"INT_TC"中断信号,每次发生此中断,X轴和Y轴的坐标转换资料都可以从相应的资料寄存器中读出.

5.闲置模式.在该模式下转换资料寄存器中的值都被保留为上次转换的资料.

ADC触摸屏控制器的寄存器详解.

ADCCON: ADC控制寄存器.

ENABLE_START: 置1启动ADC转换; 置0无操作.

RESR_START: 置1允许读操作启动ADC转换;置0禁止读操作启动ADC转换.

STDBM: 置1将ADC置为闲置模式;置0将ADC置为正常操作模式.

SEL_MUX: 选择需要转换的ADC信道.

RESCVL: ADC转换时钟预分频参数.

PRSCEN: ADC转换时钟使能.

ECFLG: ADC转换完成标志位,1时ADC转换结束,0时ADC转换进行中.

ADCTSC: 触摸屏控制寄存器.

XY_PST: 对X/Y轴手动测量模式时进行选择.

AUTO_PST: X/Y轴的自动转换模式使能位.

PULL_UP: XP端的上拉电阻使能位.

XP_SEN: 设置nXPON输出状态.

XM_SEN: 设置nXMON输出状态.

YP_SEN: 设置nYPON输出状态.

YM_SEN:设置nYMON输出状态.

ADCDLY: ADC转换周期等待定时器.

ADCDAT0: ADC资料寄存器0.

XPDATA: X轴转换资料寄存器.

XY_PST: 选择X/Y轴自动转换模式.

AUTO_PST: X/Y轴自动转换使能位.

UPDOWN: 选择中断等待模式的类型.0按下产生中断.1释放产生中断.

ADCDAT1: ADC资料寄存器1.

 

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(946)
发表于:2007-8-5 22:05:37
标签:无标签

0

CACHE

CACHE的引入.大容量主存一般采用DRAM,相对SRAM速度慢,而SRAM速度快,价格却很高. 程序和数据具有局限性,在一个较短的时间内,程序和数据往往集中在很小的存储器地址范围内. 因此在CPU和主存之间可设置一个速度很快而容量相对较小的存储器.在其中存放CPU当前正在使用以及一个较短时间内将使用的程序和数据,这样可以大大加快CPU访问存储器的速度,提高机器的运行效率.

CACHE的基本原理. cache和主存都分成块,每块由多个字节组成,大小相等. 在一个时间段内,cache的某块中存放着主存某块的全部信息,即cache的某一块是主存某块的副本(或叫映象). cache除数据部分外,还应记录放在某块中的信息是主存中的哪一块的副本. 因此还应该有第二个组成部分,即标记tag,记录主存块的块地址信息.采用cache后,进行访问存储器操作时,不是访问主存,而是先访问cache.所以存在访问cache时对主存地址(指物理地址)的理解问题.由于cache数据块和主存数据块大小相同,因此主存地址的低地址部分可作为cache数据块的块内地址. 对主存地址的高地址部分的理解与主存块和cache块之间的映象关系有关系.这里考虑一种最简单的情况-直接映象.例如将主存空间分成4096块,块编号应该是地址码的高12位,写成16进制为000H~FFFH. 按同样大小,将cache分成16块,块编号为0H~FH.这就是说块编号十六进制的第三位相同的主存块(共256块)只能和该位数码所指定的cache块建立映象关系.根据这种约定,某一主存块和cache建立起映象关系时,该cache块的标记部分只需记住主存块的高2位十六进制数. 例如第010号主存块当前和cache第0块建立其映象关系,则cache第0块的标记部分只需记住01H.由此可见,当用主存地址访问cache时,主存的块号可以分解成cache标记和cache块号部分.因此主存地址被理解成如下形式.

点击看大图

CPU进行读操作时,首先用主存地址的中间部分-cache块号找到cache中的一块(对此例为0块),找出此块的标记(对此块为01H),然后拿它与主存地址的高位部分-标记进行比较.对于第一个主存地址,比较的结果是相等的.这表明主存地址规定的块在cache中,这种情况称为命中,此时用主存地址的低位部分-块内地址从cache块号所选择的块中读取所需的数据,对于第二个主存地址,比较的结果不相等.这表明主存地址规定的块不在cache中,称为未命中,这时需要访问主存,并且将含有该地址单元的主存块的信息全部装入cache的第0块,并修改第0块的cache标记,使其值为02H.

通过上面的例子,我们可以这样来描述cache的工作原理: 在存储系统中设置了cache的情况下,CPU进行存储器访问时,首先访问cache标记,判断是否命中,如果命中就访问cache,否则访问主存.将访问的数据在cache中命中的次数与总的访问次数之比叫做命中率.影响命中率的因素主要有三个:cache的容量,cache块的划分以及cache与主存块的映象关系.一般来说,cache的容量大些,会提高命中率,但达到一定程度时,命中率的提高并不明显.目前一般为256KB或512KB,命中率可达98%左右.cache的功能全部由硬件实现,涉及cache的所有操作对程序员都是透明的.

Cache的读写操作.CPU进行存储器读操作时,根据主存地址可以分为命中和未命中两种情况.对于前者,从cache中可直接读到所需的数据,对于后者需要访问主存.并从访问单元所在的整个块从内存中全部调入cache,接着要修改cache标记.若cache已满,则需要按一定的替换算法,替换掉一个旧块. CPU进行存储器写操作时,也可分成两种情况.一是所要写入的存储单元不在cache中,这时写操作直接对主存进行操作,二是所要写入的存储单元在cache中时. 对于第二种情况需要做一些讨论.cache中的块是主存中相应块的副本,程序执行过程中如果遇到对某块单元进行写操作时,显然应保证相应的cache块与主存块的一致.这里有两种处理方式,一是暂时只写入cache,并用标志注明,至到这个块被从cache中替换出来,才一次写入主存,称之为回写式. 二是每次写入cache的同时也写入主存,称之为通写式.两种方式各有优缺点.回写式占用系统时间少,写速度快,但不能随时保证cache与主存一致.如果此期间发生DMA操作,则可能出错.通写式可使cache块与主存随时保持一致,但占用总线时间长,总线冲突较多.

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(196)
发表于:2007-8-5 18:58:14
标签:无标签

0

CISC & RISC

复杂指令计算机CISC特点.

1.指令格式不固定,指令可长可短,操作数可多可少.

2.寻址方式复杂多样,操作数可来自寄存器,也可来自存储器.

3.使用微代码,指令集可以直接在微代码记忆体(比主记忆体的速度快很多)里执行.

4.允许设计师实现CISC体系机器的向上相容.新的系统可以使用一个包含早期系统的指令超集合.

5.微程式指令的格式与高阶语言相匹配,因而编译器的设计较简单.

6.CPI>5,指令越复杂,CPI越大.

CISC的缺陷.

A.指令使用频度不均衡."80~20"的理论,80%的计算任务只需要调用20%的指令就能完成; 扩充的复杂指令往往是低频度指令.

B.大量复杂指令的控制逻辑不规整.不适于VLSI集成,微程序的使用反而制约了速度提高.

C.CISC指令的格式长短不一,需要不同的时钟周期来完成.执行较慢的指令将影响整台机器的执行效率.不利于采用先进指令级并行技术.

D.软硬功能分配.复杂指令增加硬件的复杂度,使指令执行周期大大加长,直接访存次数增多,数据重复利用率低.

 

精简指令集RISC

A.保留最基本的,去掉复杂、使用频度不高的指令,以减小CPI . CPUTime="IC"*CPI*CC ; IC是程序中指令数,CPI是每条指令执行所用的周期数,CC是时钟周期时间.

B.复杂指令可以通过对简单基本的指令组合而成.

C.每条指令的长度都是相同的,大部分指令可以在一个机器周期里完成.

D.采用多级指令流水线结构,处理器在同一时间内可执行多条指令.

E.采用加载,存储结构,统一存储器寻址方式,只允许load和store指令执行存储器操作,其余指令均对寄存器操作.

F.大大增加了通用寄存器的数量,ALU只与寄存器文件直接连接.

G.采用高速缓存结构,为保证指令不间断地传送给CPU运算器,CPU设置了一定大小的cache以扩展存储器的带宽,满足CPU频繁取指的需求,一般有两个独立的cache,分别存放 “指令+数据”

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(195)
发表于:2007-8-3 22:42:17
标签:无标签

0

ASSEMBLY

一.算术和逻辑指令

ADC.带进位的加法指令. 格式:  ADC{条件}{S} ,,    ADC是将两个操作数加起来,并把结果放入目的寄存器中.它使用一个进位标志位,这样就可以做比32位大的加法,下列例子为两个128位数相加,结果放入R0,R1,R2,R3.

ADDS R0 , R4,R8;

ADCS R1,R5,R9;

ADCS R2,R6,R10;

ADCS R3,R7,R11;

如果这样做的话,不要忘记后面的S后缀以改变CPSR中的进位标志.

 

ADD.加法.格式:  ADD{}{} ,,  ADD是将两个操作数加起来,把结果放置到目的寄存器中.操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或者一个立即值.如下例.

ADD R0,R1,R2

ADD R0,R1,#256

ADD R0,R1,R2,LSL#1

加法可以在有符号和无符号数上进行.

 

AND.逻辑与.格式: AND{条件}{S} ,,  AND将两个操作数进行逻辑与操作,结果放在目标寄存器中.操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或者是一个立即值.例如

AND R0,R0,#3

 

BIC.位清除.格式: BIC{}{},,  BIC是一个字中清除位的一种方法,与OR位设置是相反的操作.操作数2是一个32位位掩码mask. 如果在掩码中设置了某一位,则清除这一位.未设置的掩码位则保持不变. 例如BIC R0,R0,#1011;清除R0位中的0,1,3位,第2位保持不变.

 

EOR.逻辑异或.格式: EOR{条件}{S} ,, EOR将在两个操作数上做逻辑异或,把结果放置到目的寄存器中.对反转特定的位有用.操作数1是一个寄存器,操作数2可以是一个寄存器,一个移位的寄存器或者也可以是立即数. 例如: EOR R0,R0,#3 就是反转R0寄存器中的0位和1位.

 

MOV.传送.格式: MOV{条件}{S} , MOV从另一个寄存器,被移位的寄存器或者一个立即值装载一个值到目的寄存器.例如: MOV R0,R0 相当于一个NOP指令.  MOV R0,R0,LSL#3; R0=R0*8; 如果R15是目的寄存器,将修改程序计数器或标志.这用于返回到调用代码,方法是把连接寄存器的内容COPY到R15.

 

MVN.传送取反的值.格式: MVN{条件}{S}, MVN从另一个寄存器,被移位的寄存器或者一个立即值装载一个相反的值到目的寄存器. 不同之处是数在传送之前被取反了,所以把一个被取反的值传送到目的寄存器中.这是逻辑非操作而不是算术操作,这个取反的值加1才是它的取负的值.例如: MVN R0,#4 得到的R0的值为-5.

 

ORR.逻辑或.格式:ORR{条件}{S},, ORR将在两个操作数上进行逻辑或,并把结果放入目的寄存器中.对设定特定的位有用.操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器或者是一个立即数.例如: ORR R0,#3 ; 置位0和1位.

 

RSB.反向减法.格式: RSB{条件}{S},, RSB是用操作数2减去操作数1,然后将结果放入目的寄存器中.操作数1是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器或者是一个立即数. 例如: RSB R1,R2,R3执行的是R1=R3-R2 ;反向减法可以在有符号或者无符号数上进行.

 

RSC.带借位的反向减法.格式:RSC{条件}{S},, RSC指令执行用操作数2减操作数1再减进位标志位,然后将结果放置目的寄存器.

 

SBC.带借位的减法.格式: SBC{条件}{S},, SBC指令是执行的带进位的减法操作.它使用标志位来表示借位,这样就可以做大于32位的减法.SUB和SBC生成标志位的方法不同常规,如果需要借位则清除进位标志.所以指令要对进位标志进行一个非操作,指令执行期间将自动反转此位.

 

SUB.减法.格式: SUB{条件}{S},, SUB指令执行两个操作数的减法运算.操作数1是一个寄存器,操作数2是一个寄存器,被移位的寄存器或者是一个立即数.减法可以在有符号或无符号数上进行.

 

 

二.寄存器装载和存储指令.

它们可能是能获得的最有用的指令.其它指令都操纵寄存器,所以必须把数据从内存装载寄存器并把寄存器中的数据存储到内存中.

单一数据传送指令STR和LDR用来装载和存储单一字节或字的数据从/到内存,寻址是非常灵活的,首先查看一下指令格式.

LDR{条件}  Rd,<地址>

STR{条件}   Rd,<地址>

LDR{条件}B  Rd,<地址>

STR{条件}B  Rd,<地址>

这些指令装载和存储Rd的值到指定的地址,如果象后面那两个指令还指定了B,则只装载或存储一个单一的字节;对于装载,寄存器中高端的三个字节被置零.地址是一个简单的值,或一个偏移量,或者一个被移位的偏移量.还可以把合成的有效地址写回到基址寄存器(去除了对加/件操作的需要). Rbase表示基址寄存器,Rindex表示变址寄存器,index表示偏移量,偏移量为12位的无符号数. 用移位选项表示比例因子.

STR Rd,[Rbase]  存储Rd的值到Rbase所包含的有效地址.

STR Rd,[Rbase,Rindex] 存储Rd的值到Rbase和Rindex所合成的有效地址.

STR Rd,[Rbase,#index]存储Rd的值到Rbase+#index所合成的有效地址.index是一个立即值.

STR Rd,[Rbase,Rindex]! 存储Rd的值到Rbase+Rindex所合成的有效地址.并将新地址写回Rbase.

STR Rd,[Rbase,#index]!存储Rd的值到Rbase+#index所合成的有效地址.并将新地址写回Rbase.

STR Rd,[Rbase],Rindex存储Rd到Rbase所包含的有效地址,并将Rbase+Rindex的合成地址写回Rbase.

STR Rd,[Rbase,Rindex,LSL#2]存储Rd的值到Rbase+Rindex*4所合成的有效地址.

STR Rd,place 存储Rd的值到PC+place所合成的有效地址.

传送多个数据

使用多数据传送指令(LDM和STM)来装载和存储多个字的数据从/到内存. LDM/STM主要用途是把需要保存的寄存器复制到栈上. 指令格式: xxM{条件}{类型}  Rn{!}, <寄存器列表>{^}

SWP.单一数据交换.格式: SWP{条件}{B},,[] SWP从操作数2指向的内存装载一个字并把这个字放置到目的寄存器中,同时把寄存器操作数1的内容存储到同一地址中.如果目的和操作数1是同一个寄存器,则把寄存器的内容和给定内存单元的内容互换.如果提供了B后缀,则将传送一个字节,否则传送一个字.

 

三.程序状态寄存器操作指令MSR和MRS

MSR  CPSR,Rd   复制Rd的值给CPSR.

MRS  Rd,CPSR   复制CPSR的值给Rd

 

四.移位操作

LSL 逻辑左移   

ASL 算术坐移  

逻辑左移和算术左移是等同的,可以自由互换. 你可以用一个立即值指定移位数量,或用包含在0到31之间的一个值的寄存器指定移位数量.

LSR 逻辑右移

ASR 算术右移

ROR 循环右移

RRX 带扩展的循环右移

 

五.乘法指令

MLA.带累加的乘法.格式: MLA{条件}{S},,, ; =[*]+

MLA的的行为同于MUL,但它把操作数3的值加到结果上,这在求总和时有用.

MUL.乘法.格式: MUL{条件}{S},, ; dest="op1"*op2 MUL支持32位的乘法,假定操作数是有符号的,可以假定结果也是有符号的.

 

六.比较指令

七.分支指令

八.汇编伪指令

 

 

 

 

 

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(214)
发表于:2007-8-3 19:06:20
标签:无标签

0

AMBA --- Bus On Chip

AMBA: advanced microcontroller bus architecture   AMBA的目的是为了推出on-chip bus的规范,一开始AMBA1.0只有ASB和APB,为了节省面积,所以这时候的BUS协定都是tristate 的bus,而到后来的AHB2.0为了能够更方便设计者,因此BUS改用multiplexor的架构,并且增加了新的特性. 一个以AMBA架构的SOC一般包含了high-performance的AHB与low-power的peripheral-APB. system bus是负责连接例如ARM之类的embeded processor与DMA controller,on-chip memory和其它interface,或其它需要high bandwidth的元件.而peripheral bus则是用来连接系统的周边元件,其protocol相对于AHB来讲较为简单,与AHB之间则通过bridge相连,期望能减少system bus的loading. 点击看大图   

AHB简介: ARM当初订定AHB主要是为了让它作为SOC的on-chip bus,它的一些特性包括: single clock edge operation; non-tristate implementation; burst trasfers; split transaction; multiple bus master;

APB简介: APB主要用于连接low-bandwidth 的周边上面,例如UART,1284等. 它的BUS架构不象AHB为multi master .在APB里唯一的 master就是APB Bridge. 因此不需要arbiter以及一些request/grant讯号.APB协定十分简单,甚至不是pipeline operation. 以下是APB的特性: always two-cycle transfer. no wait cycle & response signal .

                                                                                       

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(231)
发表于:2007-8-1 22:01:35
标签:无标签

0

ATPCS...

为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则.ATPCS就是ARM程序和THUMB程序中子程序调用的基本规则...

一.ATPCS概述...

     ATPCS规定了一些子程序之间调用的基本规则.这些基本规则包括子程序调用过程中寄存器的使用规则,数据栈的使用规则,参数的传递规则.为适应一些特定的需要,对这些基本的调用规则进行一些修改得到几种不同的子程序调用规则,这些特定的调用规则包括:支持数据栈限制检查的ATPCS. 支持只读段位置无关的ATPCS. 支持可读写段位置无关的ATPCS. 支持ARM程序和THUMB程序混合使用的ATPCS. 处理浮点运算的ATPCS...

     有调用关系的所有子程序必须遵守同一种ATPCS. 编译器或者汇编器在ELF格式的目标文件中设置相应的属性,标识用户选定的ATPCS类型.对应不同类型的ATPCS规则,有相应的C语言库,连接器根据用户指定的ATPCS类型连接相应的C语言库...

     使用ADS的C语言编译器编译的C语言子程序满足用户指定的ATPCS类型. 而对于汇编语言程序来说,完全要依赖用户来保证各子程序满足选定的ATPCS类型. 具体来说,汇编语言子程序必须满足下面三个条件: 在子程序编写时必须遵守相应的ATPCS规则; 数据栈的使用要遵守ATPCS规则; 在汇编编译器中使用-apcs选项...

二. 基本ATPCS...

     基本ATPCS规定了在子程序调用时的一些基本规则,包括以下三个方面的内容: 各寄存器的使用规则及其相应的名字; 数据栈的使用规则; 参数传递的规则. 相对于其他类型的ATPCS,满足基本ATPCS的程序的执行速度更快,所占用的内存更少. 但是它不能提供以下的支持: ARM程序和THUMB程序相互调用; 数据以及代码的位置无关的支持; 子程序的可重入性; 数据栈检查的支持. 而派生的其他几种特定的ATPCS就是在基本ATPCS的基础上再添加其他的规则而形成的.其目的就是提供上述的功能...

     寄存器的使用规则:

     1. 子程序通过寄存器R0~R3来传递参数. 这时寄存器可以记作: A0~A3 , 被调用的子程序在返回前无需恢复寄存器R0~R3的内容.

     2. 在子程序中,使用R4~R11来保存局部变量,这时寄存器R4~R11可以记作: V1~V8 .如果在子程序中使用到V1~V8的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值,对于子程序中没有用到的寄存器则不必执行这些操作.在THUMB程序中,通常只能使用寄存器R4~R7来保存局部变量.

     3.寄存器R12用作子程序间scratch寄存器,记作ip; 在子程序的连接代码段中经常会有这种使用规则.

     4. 寄存器R13用作数据栈指针,记做SP,在子程序中寄存器R13不能用做其他用途. 寄存器SP在进入子程序时的值和退出子程序时的值必须相等.

     5. 寄存器R14用作连接寄存器,记作lr ; 它用于保存子程序的返回地址,如果在子程序中保存了返回地址,则R14可用作其它的用途.

     6. 寄存器R15是程序计数器,记作PC ; 它不能用作其他用途.

     7. ATPCS中的各寄存器在ARM编译器和汇编器中都是预定义的.

     数据栈的使用规则

     栈指针通常可以指向不同的位置.当栈指针指向栈顶元素(即最后一个入栈的数据元素)时,称为FULL栈.当栈指针指向与栈顶元素相邻的一个元素时,称为Empty栈. 数据栈的增长方向也可以不同. 当数据栈向内存减小的地址方向增长时,称为Descending栈; 当数据栈向着内存地址增加的方向增长时,称为Ascending栈. 综合这两种特点可以由以下4种数据栈: FD ED FA EA . ATPCS规定数据栈为FD类型,并对数据栈的操作是8字节对齐的,下面是一个数据栈的示例及相关的名词.

     1.数据栈栈指针.stack pointer 指向最后一个写入栈的数据的内存地址.

      2.数据栈的基地址.stack base 是指数据栈的最高地址.由于ATPCS中的数据栈是FD类型的,实际上数据栈中最早入栈数据占据的内存单元是基地址的下一个内存单元.

     3.数据栈界限.stack limit 是指数据栈中可以使用的最低的内存单元地址.

     4.已占用的数据栈.used stack 是指数据栈的基地址和数据栈栈指针之间的区域.其中包括数据栈栈指针对应的内存单元.

     5.数据栈中的数据帧(stack frames) 是指在数据栈中,为子程序分配的用来保存寄存器和局部变量的区域.

     异常中断的处理程序可以使用被中断程序的数据栈,这时用户要保证中断的程序数据栈足够大. 使用ADS编译器产生的目标代码中包含了DRFAT2格式的数据帧.在调试过程中,调试器可以使用这些数据帧来查看数据栈中的相关信息.而对于汇编语言来说,用户必须使用FRAME伪操作来描述数据栈中的数据帧.ARM汇编器根据这些伪操作在目标文件中产生相应的DRFAT2格式的数据帧.

     在ARMv5TE中,批量传送指令LDRD/STRD要求数据栈是8字节对齐的,以提高数据的传送速度.用ADS编译器产生的目标文件中,外部接口的数据栈都是8字节对齐的,并且编译器将告诉连接器: 本目标文件中的数据栈是8字节对齐的. 而对于汇编程序来说,如果目标文件中包含了外部调用,则必须满足以下条件: 外部接口的数据栈一定是8位对齐的,也就是要保证在进入该汇编代码后,直到该汇编程序调用外部代码之间,数据栈的栈指针变化为偶数个字; 在汇编程序中使用PRESERVE8伪操作告诉连接器,本汇编程序是8字节对齐的.

     参数的传递规则.

     根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.

     1.参数个数可变的子程序参数传递规则

     对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.

     2.参数个数固定的子程序参数传递规则

     对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传递: 各个浮点参数按顺序处理;为每个浮点参数分配FP寄存器;分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.

     子程序结果返回规则

     1.结果为一个32位的整数时,可以通过寄存器R0返回.

     2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.

     3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.

     4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.

     5.对于位数更多的结果,需要通过调用内存来传递.

三.几种特定的ATPCS...

     A.支持数据栈限制检查的ATPCS.

     如果在程序设计期间能够准确地计算出程序所需的内存总量,就不需要进行数据栈的检查,但是在通常情况下这是很难做到的,这时需要进行数据栈的检查. 在进行数据栈的检查时,使用寄存器R10作为数据栈限制指针,这时寄存器R10又记作sl.用户在程序中不能控制该寄存器.具体来说,支持数据栈限制的ATPCS要满足下面的规则: 在已经占有的栈的最低地址和sl之间必须有256字节的空间,也就是说,sl所指的内存地址必须比已经占用的栈的最低地址低256个字节.当中断处理程序可以使用用户的数据栈时,在已经占用的栈的最低地址和sl之间除了必须保留的256个字节的内存单元外,还必须为中断处理预留足够的内存空间; 用户在程序中不能修改sl的值;数据栈栈指针sp的值必须不小于sl的值.

     与支持数据栈限制检查的ATPCS相关的编译/汇编选项有下面几种: 选项/SWST 指示编译器生成的代码遵守支持数据栈限制检查的ATPCS,用户在程序设计期间不能够准确计算程序所需的数据栈大小时,需要指定该选项;选项/noswst指示编译器生成的代码不支持数据栈限制检查的功能,用户在程序设计期间能够准确计算出程序所需的数据栈大小,可以指定该选项,这个选项是默认的;选项/SWSTNA 如果汇编程序对于是否进行数据栈检查无所谓,而与该汇编程序连接的其他程序指定了选项swst/noswst,这时使用该选项.

     编写遵守支持数据栈限制检查的ATPCS的汇编语言程序.

     对于C程序和C++程序来说,如果在编译时指定了选项SWST,生成的目标代码将遵守支持数据栈限制检查的ATPCS. 对于汇编语言程序来说,如果要遵守支持数据栈限制检查的ATPCS,用户在编写程序时必须满足支持数据栈限制检查的ATPCS所要求的规则,然后指定选项SWST,下面介绍用户编写汇编语言程序时的一些要求.

     叶子子程序是指不调用别的程序的子程序.

     数据栈小于256字节的叶子子程序不许要进行数据栈检查,如果几个子程序组合起来构成的叶子子程序数据栈也小于256字节,这个规则同样适用; 数据栈小于256字节的非叶子子程序可以使用下面的代码段来进行数据栈检查.

     ARM程序使用: SUB sp,sp,#size ;#size 为sp和sl之间必须保留的空间大小

                                CMP sp,sl;

                                BLLO _ARM_stack_overflow

     THUMB程序使用: ADD sp,#-size ; #size为sp和sl之间必须保留的空间大小

                                    CMP sp,sl;

                                     BLLO _THUMB_stack_overflow

     数据栈大于256字节的子程序,为了保证sp的值不小于数据栈可用的内存单元最小的地址值,需要引入相应的寄存器.

     ARM程序使用下列代码: SUB ip,sp,#size;

                                               CMP ip,sl;

                                                BLLO _ARM_stack_overflow

     THUMB程序使用下列代码: LDR wr,#-size;

                                                     ADD wr,sp;

                                                     CMP wr,sl;

                                                     BLLO _THUMB_stack_overflow

     支持只读段位置无关的ATPCS...

     支持可读写段位置无关的ATPCS...

     支持ARM程序和THUMB程序混合使用的ATPCS...

     在编译或汇编时,使用/intework告诉编译器或汇编器生成的目标代码遵守支持ARM程序和THUMB程序混合使用的ATPCS,它用在以下场合: 程序中存在ARM程序调用THUMB程序的情况;程序中存在THUMB程序调用ARM程序的情况;需要连接器来进行ARM状态和THUMB状态切换的情况;.在下述情况下使用选项nointerwork:程序中不包含THUMB程序;用户自己进行ARM程序和THUMB程序切换.需要注意的是:在同一个C/C++程序中不能同时有ARM指令和THUMB指令.

     处理浮点运算的ATPCS...

 

                                                                                                                                       摘自: ARM体系结构与编程

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(333)
发表于:2007-7-8 11:54:15
标签:无标签

0

BOOTLOADER...

A......Bootloader概述

       Bootloader是系统上电后运行的第一段软件代码,回忆一下PC的体系结构我们可以知道,PC机的引导加载程序由BIOS(本质就是一段固件程序)和位于硬盘的MBR中的引导程序一起组成.BIOS在完成硬件检测和和资源分配后,将硬盘的MBR中引导程序读到系统中的RAM,然后将控制权交给引导程序.引导程序的主要运行任务就是将内核映象从硬盘上读到RAM中,然后跳转到内核的入口点去运行,也即开始启动操作系统.

        而在嵌入式系统中,通常并没有象BIOS那样的固件程序(有的嵌入式系统也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由Bootloader完成了.比如一个基于ARM7TDMI core的嵌入式系统中,系统上电或复位时都从地址0x00000000开始执行,而在这个地址处安排的通常就是系统的Bootloader程序. 简单地说Bootloader就是操作系统内核或者用户应用程序运行之前运行的一小段程序.通过这段小程序,我们可以初始化硬件设备,建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准备好正确的环境.对于一个嵌入式系统来说,可能有的包括操作系统,有的小型系统也可以只包括应用程序,但是在这之前都需要Bootloader为他准备一个正确的环境.通常Bootloader是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的Bootloader是非常困难的. 当然我们可以归纳出一些通用的概念来,以便我们了解特定Bootloader的设计与实现.

u Bootloader的移植和修改

        每种不同的CPU体系结构都有不同的Bootloader.除了依赖CPU的体系结构外,Bootloader实际上也依赖于具体的嵌入式系统的板级设备的配置,比如板卡的硬件地址分配,RAM芯片的类型,其他外设的类型等.这也就是说对于两块不同的嵌入式板而言,即使它们是基于同一CPU而构建的,如果它们的硬件资源和配置不一样的话,要想运行在一块板子上的Bootloader程序也能运行在另一块板子上,也还是需要做一些必要的修改.

u Bootloader的安装

        系统加电或复位后,所有的CPU通常都从CPU制造商预先安排的地址上取指令.比如S3C44B0在复位后都从地址0X00000000取它的第一条指令.而嵌入式系统通常都有某种类型的固态存储设备,比如ROM,RAM,FLASH等被安排在这个起始地址上,因此在系统加电后,CPU将首先执行Bootloader程序,也就是说对于S3C44B0这套系统来说,Bootloader是从0地址开始存放的,而这段起始地址需要采用可引导的固态存储设备如FLASH.

u 用来控制Bootloader的设备或机制

        串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在Bootloader中主机和目标机之间都通过串口建立连接,Bootloader程序在执行时通常会通过串口来进行I/O,比如:输出打印信息到串口,从串口读取用户控制字符等.当然如果认为出口的通讯速度不够快,也可以采用网络或者USB通讯,那么相应在Bootloader中就需要编写各自的驱动.

u Bootloader的启动过程

        多阶段的Bootloader能够实现更为复杂的功能,以及更好的可移植性.从固态存储设备上启动的Bootloader大都是2阶段的启动过程,也即启动程序可以分为state1和state2两部分.

u Bootloader的操作模式

        大多数Bootloader都包含两种不同的操作模式."启动加载"模式和"下载"模式,这种区别对于开发人员才有意义.但从终端用户的角度看,Bootloader的作用就是用来加载操作系统,而并不存在所谓的启动加载模式和下载工作模式的区别.

        启动加载(boot loading)模式,也称为自主autonomous模式,也即bootloader从目标机上的某个固态存储设备上将操作系统加载到RAM中运行,整个过程并没有用户的介入.这种模式是bootloader的正常工作模式.因此在嵌入式产品发布的时候,bootloader显然必须工作在这种模式下.

        下载(down loading)模式: 在这种模式下,目标机上的bootloader将通过串口连接或网络连接通讯手段从主机下载文件,比如下载应用程序,数据文件,内核映象等.从主机下载的文件通常首先将bootloader保存到目标机的RAM中然后再被Bootloader写到目标机的固态存储设备中.Bootloader的这种模式通常在系统更新时使用.工作于这种工作模式下的Bootloader通常都会向它的终端客户提供一个简单的命令行接口.在教学系统中提供的Bootloader中没有实现自主模式,可以通过修改代码来实现该功能.

u Bootloader与主机之间进行文件传输所用的通讯设备和协议

        最常见的情况就是,目标机上的Bootloader通过串口与主机之间进行文件传输,传输可以简单的采用直接数据接收,当然在串口上也可以采用xmode/ymode/zmode协议以及在以太网上采用的TPTP协议.此外,在论及这个话题时,主机方所用的软件也要考虑.比如,在通过以太网连接和TFTP协议来下载文件时,主机方必须有一个软件用来提供TFTP服务.

B......Bootloader的主要任务和典型结构框架

        假定内核映象和根文件系统映象都被加载到RAM中运行.之所以提出这样一个假设前提是因为,在嵌入式系统中内核映象和根文件系统映象也可以直接在ROM或FLASH这样的固态存储设备中直接运行.但这种做法无疑是以牺牲运行速度为代价的.从操作系统的角度看,Bootloader的总目标就是正确地调用内核来执行.

        另外由于Bootloader的实现依赖于CPU的体系结构,因此大多数Bootloader 都分为state1和state2两部分.依赖于CPU体系结构的代码,比如设备初始化代码等,通常都放在state1中,而且通常都用汇编语言来实现,以达到短小精悍的目的.而state2通常由C语言来实现,这样可以实现更复杂的功能.而且代码会有更好的可读性与可移植性.

        Bootloader的state1通常包含下列步骤(以执行的先后顺序)

        .硬件设备初始化

        .为加载Bootloader的state2准备RAM空间

        .COPY Bootloader 的state2到RAM空间

        .设置好堆栈

        .跳转到state2的C入口点

        Bootloader的 state2通常包含下列步骤

        .初始化本阶段要使用到的硬件设备

        .检测系统内存映射(Memory Map)

        .将kernel映象和根文件系统映象从flash读到RAM空间中

        .为内核设置启动参数

        .调用内核

Bootloader的State1

        .基本的硬件初始化:这是Bootloader一开始就执行的操作,其目的是为state2的执行以及随后的kernel的执行准备好一些基本的硬件环境.它通常包含以下步骤

        1.屏蔽所有中断.为中断提供服务往往是OS设备驱动程序的责任,因此在Bootloader的执行全过程中可以不必响应任何中断.中断屏蔽可以通过写CPU的中断屏蔽寄存器或状态寄存器(比如ARM的CPSR)来完成.

        2.设置CPU的速度和时钟频率.

        3.RAM的初始化.包括正确地设置系统的内存控制器的功能寄存器以及各内存库控制寄存器等.

        4.初始化LED.典型的通过GPIO来驱动LED,其目的是表明系统的状态是OK还是ERROR.如果板子上没有LED,那也可以通过初始化UART向串口打印bootloader的logo字符信息来完成这一点.

        5.关闭CPU内部指令/数据CACHE.

        为加载state2准备RAM空间.为了获得更快的执行速度,通常把state2加载到RAM空间来执行,因此必须为加载Bootloader的state2准备好一段可用的RAM空间范围.由于state2通常是C语言执行代码,因此在考虑空间大小时除了state2可执行的映象大小外,还必须把堆栈空间也考虑进来.此外,空间大小最好是memory page大小(通常是4KB的整数倍).一般而言,1M的RAM空间已经足够了.具体的地址范围可以任意安排,比如blob就将它的state2可执行映象安排从系统RAM起始地址0XC0200000开始的1M空间内执行.但是,将state2安排到整个RAM空间的最顶1M RAM是一种值得推荐的方法.

        为了后面的叙述方便,这里把所安排的RAM空间范围大小记为stage2_size,把起始地址和终止地址分别记为stage2_start和stage2_end,因此stage2_end=stage2_start + stage2_size ; 另外还必须确保所安排的地址范围的的确确是可读写的RAM空间,因此必须对你所安排的空间进行测试.具体的测试方法可以采取类似blob的方法,也即:以memory page为基本的测试单元,测试每个memory page开始的两个字是否可以被读写.为了后面的叙述方便,我们记这个检测方法为:test_mempage.其具体步骤如下:

        1.先保存memory page一开始两个字的内容.

        2.向这两个字中写入任意的数据.比如向第一个字写入0x55,向第二个字写入0xaa.

        3.然后立即将这两个字的内容读回.显然我们读到的内容应该分别是0x55和0xaa,如果不是,则说明这个memory page所占据的一段地址范围不是一段有效的RAM空间.

        4.再向这两个字中写入任意的数字,比如向第一个字写入0xaa,向第二个字写入0x55.

        5.然后立即将这两个字的内容读回,显然我们读到的内容应该分别为0xaa和0x55,如果不是,则说明这个memory page所占据的一段地址范围不是一段有效的RAM空间.

        6.恢复这两个字的原始内容,测试完毕.

        为了得到一段干净的RAM地址空间,我们也可以将所安排的RAM空间进行清零操作.

        拷贝stage2到RAM中,拷贝时要确定两点: 1.stage2的可执行映象在固态存储设备的存放起始地址和终止地址.2.RAM空间的起始地址.

        设置堆栈指针SP 堆栈指针的设置是为了执行C语言代码做好准备. 通常我们可以把SP的值设置为stage2_end-4,也即在1M RAM空间的最顶端,堆栈向下生长.此外在设置堆栈指针SP之前,也可以关闭LED灯,以提示用户我们准备跳转到stage2.

        跳转到stage2的C入口. 在上述一切就绪后,就可以跳转到bootloader的stage2去执行了.比如在RAM系统中,可以通过修改PC寄存器为合适的地址来实现.

Bootloader的stage2.

        正如前面所述,stage2的代码通常用C语言来实现,以便于实现更复杂的功能和取得更好的代码可读性和可移植性.但是与普通C语言应用程序不同的是,在编译和连接Bootloader这样的程序时,我们不能使用glibc库中的任何支持函数.其原因是显而易见的.这就给我们带来了一个问题,那就是从哪里跳转到main()函数呢? 直接把main函数的起始地址作为整个stage2执行映象的入口点或许是最直接的想法.但是这样做有两个缺点:1.无法通过main函数传递函数参数.2.无法处理main函数返回的情况.一种更为巧妙的方法是利用trampoline(弹簧床)的概念.也即用汇编语言写一段小程序,并将这段小程序作为stage2可执行映象的执行入口点.然后我们在trampoline汇编小程序中用CPU跳转指令跳入main函数中去执行.而当main函数返回时,CPU执行路径显然再次回到我们的trampoline程序.简而言之,这种方法的思想就是:用这段trampoline小程序作为main函数的外部包裹. 下面给出一个简单的 trampoline 小程序.

.text

.globl _trampoline

trampoline:

        bl  main

        /*if main ever returns we just call it again*/

        b  _trampolilne

可以看出,当 main() 函数返回后,我们又用一条跳转指令重新执行 trampoline 程序,当然也就重新执行main()函数了,这也就是trampoline(弹簧床)的意思所在了.

初始化本阶段的硬件设备.

这通常包括:1.初始化至少一个串口,以便和终端客户进行I/O输出信息.2.初始化计时器等. 在初始化这些设备之前也可以重新把LED灯点亮,以表明我们已经进入main函数执行.设备初始化完以后可以输出一些打印信息,程序名字字符串,版本号等.

检测系统的内存映射

所谓内存影射就是指在整个4GB物理地址空间中有哪些地址范围被分配用来寻址系统的RAM单元.

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(211)
发表于:2007-7-6 1:45:16
标签:无标签

0

JTAG ...

A. JTAG简述

JTAG - Joint Test Active Group 是一种国际标准测试协议(IEEE1149.1兼容) , 主要用于芯片内部测试. 现在多数高级器件都支持JTAG协议,如DSP,FPGA器件等.标准的JTAG接口是4线: TMS - TCK - TDI -TDO , 分别为模式选择,时钟,数据输入,数据输出线 .

JTAG最初是用来对芯片进行测试的,JTAG的基本原理是在器件内部定义了一个TAP(Test Access Port),通过专用的JTAG测试工具对内部节点进行测试. JTAG测试允许多个器件通过JTAG接口串联在一起,形成一个JTAG链, 能实现对各个器件分别测试. 现在JTAG接口还常用于实现ISP等,对FLASH等器件进行编程. JTAG编程方式是在线编程,传统生产方式中对芯片进行预编程先再装到板子上因此而改变,简化的流程为先固定器件到电路板上,再用JTAG编程,从而大大加快工程进度. JTAG接口可对PSD芯片内部的所有部件进行编程.

具有JTAG接口的芯片都有下列引脚定义. TCK :  测试时钟输入 .  TDI: 测试数据输入,数据通过TDI输入JTAG口.  TDO:测试数据输出,数据通过TDO从JTAG口输出. TMS:测试模式选择,TMS用来设置JTAG口处于某种特定的测试模式.可选引脚TRST:测试复位,输入引脚,低电平有效. 含有JTAG接口的芯片种类比较多:CPU , DSP ,CPLD等.JTAG内部有一个状态机,称为TAP控制器.TAP控制器的状态机通过TCK和TMS进行状态的改变,实现数据和指令的输入.

JTAG标准定义了一个串行的移位寄存器,寄存器的每一个单元分配给IC芯片的相应引脚,每一个独立的单元称为BSC(Boundary-Scan Cell)边界扫描单元.这个串联的BSC在IC内部构成了JTAG回路,所有的BSR(Boundary-Scan-Register)通过JTAG测试激活,平时这些引脚保持正常的IC功能.

以含有JTAG接口的StrongARM  SA1110为例,Flash为intel的28F128J32 16M的容量.SA1110的JTAG的TCK,TMS,TDI,TDO分别接PC并口的2,3,4,11线上,通过程序对JTAG口的控制指令和目标代码从PC的并口写入JTAG的BSR中.在设计PCB时必须将SA1110的数据线,地址线及控制线与FLASH的地址线,数据线,控制线相连.因SA1110的数据线,地址线及控制线引脚上都有相应的BSC,只要用JTAG指令将数据,地址及控制信号送到其BSC中,就可以通过BSC对应的引脚将信号送给FLASH,实现对FLASH的操作.

通过对TCK,TMS等的设置,可以将JTAG设置为接收指令或数据状态,JTAG常用指令如下: SAMPLE/PRELOAD: 用此指令采样BSC内容或将数据写入BSC单元.  EXTEST: 当执行此指令时,BSC的内容通过引脚送到与其连接的相应芯片的引脚,我们就通过这种指令实现在线写FLASH. BYPASS: 此指令将一个移位寄存器轩于移位回路中,即仅有一个移位寄存器处于TDI和TDO之间. 在PCB电路设计好后,即可用程序先将对JTAG的控制指令,通过TDI送入JTAG控制器的指令寄存器中.再通过TDI将要写flash的地址,数据及控制线信号入BSR中,并将数据锁存到BSC中,用EXTEST指令通过BSC将写入FLASH.

电路设计和编程中的注意事项. 1.FLASH芯片的WE,CE,OE等控制线必须与SA1110的BSR相连,只有这样才能通过BSR控制FLASH的相应引脚. 2.JTAG口和PC并口的连接线要尽量短,原则上不大于15CM. 3.FLASH在擦除和编程时所需的工作电流比较大,在选用系统的供电芯片时必须加以考虑. 4.为提高FLASH的编程速度,尽量使TCK不低于6MHZ,可编写烧写FLASH程序时实现.

 

B. JTAG引脚定义

    1.TCK 为TAP操作提供一个独立、基本的时钟信号,TAP的所有操作都是通过这个时钟信号来驱动的

    2.TMS用来控制TAP状态机的转换,通过TMS信号可以控制TAP在不同的状态间相互转换,TMS信号在TCK信号的上升沿有效

    3.TDI是数据输入的接口,所有输入到特定寄存器的数据都要通过TDI一位一位串行输入的

    4.TDO是数据输出的接口,所有从特定寄存器输出的数据都要通过TDO一位一位串行输出的

    5.TRST可以用来对TAP Controller进行复位,该信号线可选,TMS也可以对其复位

    6.VTREF接口信号电平参考电压一般直接接Vsupply,这个可以用来确定ARM的JTAG接口逻辑电平

    7.RTCK可选项,由目标端反馈给仿真器的时钟信号,用来同步TCK信号的产生,不使用时直接接地

    8.System Reset可选项,与目标板上的系统复位信号相连,可以直接对目标系统复位,同时可以检测目标系统的复位情况,为了防止误触发应在目标端加上适当的上拉电阻

    9.USER IN用户自定义输入,可以接到一个IO口上,用来接受上位机的控制

    10.USER OUT用户自定义输出,可以接到一个IO口上,用来向上位机反馈一个状态

    由于JTAG经常使用排线连接,为了增强抗干扰能力,在每条信号线间加上地线就出现了这种20针的接口。但事实上,RTCK、USER IN、USER OUT一般都不使用,于是还有一种14针的接口,对于实际开发应用来说,由于实验室电源稳定,电磁环境较好,干扰不大,使用那么多地线意义不大。

    JTAG开发工具有:USB multi-ICE , 并口multi-ICE,简易JTAG. 价格由高到低,速度由快而慢,功能由强而弱. JTAG作为一种嵌入式系统调试规范,是有一套协议的,并口multi-ICE就是将计算机对并口的读写转为JTAG协议,拆开看主要是一片FPGA,程序在EEPROM里面。而USB的只不过是多了一层USB协议,由于USB本身速度较并口快,所以USB multi-ICE速度更快些. 简易的JTAG只有一片74HC244,其实是用并口模拟JTAG协议,由于JTAG是串行协议,所以并口的n次操作才能完成一条命令(n>8),速度因此快不起来啦。

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(453)
2下一页总共 , 当前 /