(Arm硬件设计及外设驱动编程).ppt

上传人:tia****nde 文档编号:12804492 上传时间:2020-05-25 格式:PPT 页数:27 大小:399KB
返回 下载 相关 举报
(Arm硬件设计及外设驱动编程).ppt_第1页
第1页 / 共27页
(Arm硬件设计及外设驱动编程).ppt_第2页
第2页 / 共27页
(Arm硬件设计及外设驱动编程).ppt_第3页
第3页 / 共27页
点击查看更多>>
资源描述
嵌入式ARM系统设计与开发,第五讲Arm硬件设计及外设驱动编程,基于ARM的芯片多数为复杂的片上系统,这种复杂系统里的多数硬件模块都是可配置的,需要由软件来设置其需要的工作状态。因此在用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般通用的内容包括:中断向量表初始化存储器系统初始化堆栈初始化有特殊要求的断口,设备初始化用户程序执行环境改变处理器模式呼叫主应用程序,ARM启动代码分析,1.中断向量表ARM要求中断向量表必须放置在从0地址开始,连续8X4字节的空间内。每当一个中断发生以后,ARM处理器便强制把PC指针置为向量表中对应中断类型的地址值。因为每个中断只占据向量表中1个字的存储空间,只能放置一条ARM指令,使程序跳转到存储器的其他地方,再执行中断处理。中断向量表的程序实现通常如下表示:AREABoot,CODE,READONLYENTRYBResetHandlerBUndefHandlerBSWIHandlerBPreAbortHandlerBDataAbortHandlerBBIRQHandlerBFIQHandler其中关键字ENTRY是指定编译器保留这段代码,因为编译器可能会认为这是一段亢余代码而加以优化。链接的时候要确保这段代码被链接在0地址处,并且作为整个程序的入口。,2.初始化存储器系统(1)存储器类型和时序配置通常Flash和SRAM同属于静态存储器类型,可以合用同一个存储器端口;而DRAM因为有动态刷新和地址线复用等特性,通常配有专用的存储器端口。存储器端口的接口时序优化是非常重要的,这会影响到整个系统的性能。因为一般系统运行的速度瓶颈都存在于存储器访问,所以存储器访问时序应尽可能的快;而同时又要考虑到由此带来的稳定性问题。(2)存储器地址分布一种典型的情况是启动ROM的地址重映射。,3.初始化堆栈因为ARM有7种执行状态,每一种状态的堆栈指针寄存器(SP)都是独立的。因此,对程序中需要用到的每一种模式都要给SP定义一个堆栈地址。方法是改变状态寄存器内的状态位,使处理器切换到不同的状态,让后给SP赋值。注意:不要切换到User模式进行User模式的堆栈设置,因为进入User模式后就不能再操作CPSR回到别的模式了,可能会对接下去的程序执行造成影响。这是一段堆栈初始化的代码示例,其中只定义了三种模式的SP指针:MRSR0,CPSRBICR0,R0,#MODEMASK安全起见,屏蔽模式位以外的其他位ORRR1,R0,#IRQMODEMSRCPSR_cxfs,R1LDRSP,=UndefStackORRR1,R0,#FIQMODEMSRCPSR_cxsf,R1LDRSP,=FIQStackORRR1,R0,#SVCMODEMSRCPSR_cxsf,R1LDRSP,=SVCStack,4.初始化有特殊要求的端口,设备5.初始化应用程序执行环境映像一开始总是存储在ROMFlash里面的,其RO部分即可以在ROMFlash里面执行,也可以转移到速度更快的RAM中执行;而RW和ZI这两部分是必须转移到可写的RAM里去。所谓应用程序执行环境的初始化,就是完成必要的从ROM到RAM的数据传输和内容清零。下面是在ADS下,一种常用存储器模型的直接实现:LDRr0,=|Image$RO$Limit|得到RW数据源的起始地址LDRr1,=|Image$RW$Base|RW区在RAM里的执行区起始地址LDRr2,=|Image$ZI$Base|ZI区在RAM里面的起始地址CMPr0,r1比较它们是否相等BEQ%F10CMPr1,r3LDRCCr2,r0,#4STRCCr2,r1,#4BCC%B01LDRr1,=|Image$ZI$Limit|MOVr2,#02CMPr3,r1STRCCr2,r3,#4BCC%B2,程序实现了RW数据的拷贝和ZI区域的清零功能。其中引用到的4个符号是由链接器第一输出的。|Image$RO$Limit|:表示RO区末地址后面的地址,即RW数据源的起始地址|Image$RW$Base|:RW区在RAM里的执行区起始地址,也就是编译器选项RW_Base指定的地址|Image$ZI$Base|:ZI区在RAM里面的起始地址|Image$ZI$Limit|:ZI区在RAM里面的结束地址后面的一个地址程序先把ROM里|Image$RO$Limt|开始的RW初始数据拷贝到RAM里面|Image$RW$Base|开始的地址,当RAM这边的目标地址到达|Image$ZI$Base|后就表示RW区的结束和ZI区的开始,接下去就对这片ZI区进行清零操作,直到遇到结束地址|Image$ZI$Limit|,6.改变处理器模式因为在初始化过程中,许多操作需要在特权模式下才能进行(比如对CPSR的修改),所以要特别注意不能过早的进入用户模式。内核级的中断使能也可以考虑在这一步进行。如果系统中另外存在一个专门的中断控制器,这么做总是安全的。7.呼叫主应用程序当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序。最简单的一种情况是:IMPORTmainBmain直接从启动代码跳转到应用程序的主函数入口,当然主函数名字可以由用户随便定义。在ARMADS环境中,还另外提供了一套系统级的呼叫机制。IMPORT_mainB_main_main()是编译系统提供的一个函数,负责完成库函数的初始化和初始化应用程序执行环境,最后自动跳转到main()函数。,中断服务程序,1中断的基本概念所谓中断是指CPU对系统中或系统外发生的某个事件的一种响应过程,即CPU暂时停止现行程序的执行,而自动转去执行预先安排好的处理该事件的服务子程序。当处理结束后,再返回到被暂停程序的断点处,继续执行原来的程序。实现这种中断功能的硬件系统和软件系统统称为中断系统。中断系统是计算机的重要组成部分。实时控制、故障自动处理时往往用到中断系统,计算机与外部设备间传送数据及实现人机联系也常常采用中断方式。,中断系统需要解决以下基本问题:(1)中断源:中断请求信号的来源。包括中断请求信号的产生及该信号怎样被CPU有效地识别。而且要求中断请求信号产生一次,只能被CPU接收处理一次,即不能一次中断申请被CPU多次响应。这就涉及到中断请求信号的及时撤除问题。(2)中断响应与返回:CPU采集到中断请求信号后,怎样转向特定的中断服务子程序及执行完中断服务子程序怎样返回被中断的程序继续正确地执行。中断响应与返回的过程中涉及到CPU响应中断的条件、现场保护等问题。,(3)优先级控制:一个计算机应用系统,特别是计算机实时测控应用系统,往往有多个中断源,各中断源所要求的处理具有不同的轻重、缓急程度。与人处理问题的思路一样,希望重要紧急的事件先处理,而且如果当前处于正在处理某个事件的过程中,有更重要、更紧急的事件到来,就应当暂停当前事件的处理,转去处理新事件。这就是中断系统优先级控制所要解决的问题。中断优先级的控制形成了中断嵌套。,中断系统结构,执行主程序,主程序,继续执行主程序,断点,中断请求,中断响应,执行中断处理程序,中断返回,引起CPU中断的根源,称为中断源。中断源向CPU提出的中断请求。CPU暂时中断原来的事务A,转去处理事件B。对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。,随着计算机技术的应用,人们发现中断技术不仅解决了快速主机与慢速I/O设备的数据传送问题,而且还具有如下优点:,分时操作。CPU可以分时为多个I/O设备服务,提高了计算机的利用率;,实时响应。CPU能够及时处理应用系统的随机事件,系统的实时性大大增强;,可靠性高。CPU具有处理设备故障及掉电等突发性事件能力,从而使系统可靠性提高。,1嵌入式ARM的中断系统ARM处理器异常中断处理概述当异常中断发生时,系统执行完当前指令后,将跳转到相应的异常中断处理程序处执行。当异常中断处理程序执行完成后,程序返回到发生中断的指令的下一条指令处执行。在进入异常中断处理程序时,要保存被中断的程序的执行现场。从异常中断处理程序退出时,要恢复被中断的程序的执行现场。ARM体系中通常在存储地址的低端固化了一个32字节的硬件中断向量表,用来指定各异常中断及其处理程序的对应关系。当一个异常出现以后,ARM微处理器会执行以下几步操作:1)保存处理器当前状态、中断屏蔽位以及各条件标志位;2)设置当前程序状态寄存器CPSR中相应的位;3)将寄存器lr_mode设置成返回地址;4)将程序计数器(PC)值设置成该异常中断的中断向量地址,从而跳转到相应的异常中断处理程序处执行。,在接收到中断请求以后,ARM处理器内核会自动执行以上四步,程序计数器PC总是跳转到相应的固定地址。从异常中断处理程序中返回包括下面两个基本操作:1)恢复被屏蔽的程序的处理器状态;2)返回到发生异常中断的指令的下一条指令处继续执行。当异常中断发生时,程序计数器PC所指的位置对于各种不同的异常中断是不同的,同样,返回地址对于各种不同的异常中断也是不同的。例外的是,复位异常中断处理程序不需要返回,因为整个应用系统是从复位异常中断处理程序开始执行的。,解析程序的概念和作用如前所述,ARM处理器响应中断的时候,总是从固定的地址开始的,而在高级语言环境下开发中断服务程序时,无法控制固定地址开始的跳转流程。为了使得上层应用程序与硬件中断跳转联系起来,需要编写一段中间的服务程序来进行连接。这样的服务程序常被称作中断解析程序。每个异常中断对应一个4字节的空间,正好放置一条跳转指令或者向PC寄存器赋值的数据访问指令。理论上可以通过这两种指令直接使得程序跳转到对应的中断处理程序中去。但实际上由于函数地址值为未知和其它一些问题,并不这么做。这里给出一种常用的中断跳转流程:,这个流程中的关键部分是中断向量表,为了让解析程序能找到向量表,应该将向量表的地址固定化(编程者自定义)。这样,整个跳转流程的所有程序地址都是固定的,当中断触发后,就可以自动运行。其中,只有向量表的内容是可变的,编程者只要在向量表中填入正确的目标地址值就可以了。这使得上层中断处理程序和底层硬件跳转有机地联系起来。解析过程示例以一次IRQ跳转为例,假定中断向量表定义在0 x00400000开始的外部RAM空间:,图中实线表示的流程都用ARM汇编语言编写,一般作为boot代码的一部分放在系统的底层模块中。填写向量表的操作可以在上层应用程序中方便地实现,比如在C语言中:*(int*(0 x00400018)=(int)ISR_IRQ;这样就将IRQ中断的服务程序入口地址(0 x00300260)填写到中断向量表中的固定地址0 x00400018开始的4字节空间了。如此一来,就可避免在应用程序中计算中断的跳转地址,并且可以很方便的选择不同的函数作为指定中断的服务程序。当然,在程序开发时要合理开辟好向量表,避免对向量表地址空间不必要的写操作。,向量中断的处理一些处理器在设计外扩的中断控制器时提供了一种叫做“向量中断”的中断跳转机制。这与前文叙述的扩展解析跳转流程有所不同,它不需要软件来识别具体的中断源,也就是不需要添加图3中的IRQ/FIQ服务程序,而完全由硬件自动跳转到对应的中断地址。其它跳转流程的原理都是一样的。这相当于扩展了ARM内核的硬件中断向量表,减小了中断响应延时。以S3C44B0X处理器的外部中断0为例,需要在其对应的硬件固定跳转地址0 x00000020处添加指令:ldrpc,=HandlerEINT,使得程序跳转到其服务程序HandlerEINT0处执行。,S3C2440支持60种中断。其优先级如下图,1中断配置寄存器,2SOURCEPENDINGREGISTER,3中断屏蔽寄存器,4SUBSOURCEPENDINGREGISTER,5INTERRUPTSUBMASKREGISTER,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!