基于ARM9的中断驱动程序设计.doc_第1页
基于ARM9的中断驱动程序设计.doc_第2页
基于ARM9的中断驱动程序设计.doc_第3页
基于ARM9的中断驱动程序设计.doc_第4页
基于ARM9的中断驱动程序设计.doc_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成 绩 评 定 表学生姓名班级学号专 业计算机科学与技术课程设计题目基于arm9的中断驱动程序设计评语组长签字:成绩日期 2013 年11 月24 日课程设计任务书学 院信息科学与工程专 业计算机科学与技术学生姓名范航伟班级学号1203055125课程设计题目基于arm9的中断驱动程序设计实践教学要求与任务:设计arm9核cpusc3c2410的中断接口驱动程序。程序主要功能:响应外部中断请求的配置方法,并通过响应定时器中断,执行中断服务子程序使cpu板上的led指示灯led1、led2闪烁。要求用c语言实现。使用ads1.2开发环境。利用嵌入式实验系统实现硬件仿真。工作计划与进度安排:13周周一:编写应用程序代码13周周二、周四:调试程序、撰写课程设计报告、答辩指导教师: 2013年11月18日专业负责人:2013年11月18日学院教学副院长:2013年11月18日摘 要随着移动设备的流行和发展,嵌入式系统已经成为一个热点。它并不是最近出现的新技术,只是随着微电子技术和计算机技术的发展,微控制芯片功能越来越大,而嵌入微控制芯片的设备和系统越来越多,从而使得这种技术越来越引人注目。它对软硬件的体积大小、成本、功耗和可靠性都提出了严格的要求。嵌入式系统的功能越来越强大,实现也越来越复杂,随之出现的就是可靠性大大降低。最近的一种趋势是一个功能强大的嵌入式系统通常需要一个操作系统来给予支持,这种操作系统是已经成熟并且稳定的,可以使嵌入式的linux,wince等等。本文所要研究的就是基于arm嵌入式系统的中断处理程序设计与实现。关键字:嵌入式,arm,中断目 录一、设计目的1二、设计思路22.1 arm实验箱硬件资源概述22.2 arm的中断原理3三、关键技术43.1 arm9处理器43.2嵌入式c语言开发技术53.3 ads开发环境63.4 中断流程73.5 数据结构83.5.1 中断优先级产生模块83.5.2 中断优先级83.6 寄存器工作原理93.6.1 程序状态存储器psr93.6.2 中断模式93.6.3 中断请求寄存器103.6.4 中断屏蔽寄存器103.7 实验详解103.7.1 源请求寄存器srcpnd103.7.2 中断模式寄存器intmod123.7.3 中断屏蔽寄存器intmsk123.7.4 中断请求寄存器intpnd133.7.5 中断偏移寄存器intoffset143.7.6 子中断源请求寄存器subsrcpnd143.7.7 子中断屏蔽寄存器intsubmsk15四、程序流程16五、主要源代码175.1 主函数设计175.2 定时器中断初始化程序175.3 定时器初始化程序175.4 定时器中断服务子程序18六、运行结果及结论196.1 运行结果196.2 结论19七、参考文献20一、设计目的通过课程设计,熟悉基于arm微处理器的嵌入式系统开发的过程,掌握嵌入式系统开发的知识。针对某一嵌入式微处理器进行实际开发,锻炼实践动手能力。并能够熟练掌握arm9的中断原理,能够对s3c2410的中断资源及其相关中断寄存器进行合理配置。掌握对s3c2410的中断编程方法。二、设计思路2.1 arm实验箱硬件资源概述el-arm-830型教学实验系统属于一种综合的教学实验系统,该系统采用了目前在国内普遍认同的arm920t核,32位微处理器,实现了多模块的应用实验。它是集学习、应用编程、开发研究于一体arm实验教学系统。用户可根据自己的需求选用不同类型的cpu适配板,兼容arm7与arm9,而不需要改变任何配置,同时,实验系统上的tech_v总线能够拓展较为丰富的实验接口板。用户在了解tech_v标准后,更能研发出不同用途的实验接口板。除此之外,在实验板上有丰富的外围扩展资源(数字、模拟信号发生器,数字量io输入输出,语音编解码、人机接口等单元),可以完成arm的基础实验、算法实验和数据通信实验、以太网实验。9图2.1 el-arm-830实验教学系统的功能框图2.2 arm的中断原理在arm中,有两类中断,一类是irq,一类是fiq,irq是普通中断,fiq是快速中断,在进行大批量的复制、数据转移等工作时,常使用此类中断。fiq的优先级高于irq。同时,它们都属于arm的异常模式,当一旦有中断发生,不管是外部中断,还是内部中断,正在执行的程序都会停下,pc指针进而跳入异常向量的地址处,若是irq中断,则pc指针跳到0x18处,若是fiq中断,则跳到0x1c处。异常向量地址处,一般存有中断服务子程序的地址,所以,接下来pc指针跳入中断服务子程序中。当完成中断服务子程序后,pc指针会返回到被打断的程序的下一条地址处,继续执行程序。这就是arm中断操作的基本原理。8但是,通常由于生产arm处理器的各厂家都集成了很多中断请求源,比如,串口中断、ad中断、外部中断、定时器中断、dma中断等等,所以,很多中断可能同时请求中断,因此,为区分它们,更准确的完成任务,这些中断都有相应的优先级别,以及当发生中断时,它们都有相应的中断标志位,通过在发生中断是判断中断优先级,和访问中断标志位的状态来识别到底哪一个中断发生了。三、关键技术3.1 arm9处理器新一代的arm9处理器,通过全新的设计,采用了更多的晶体管,能够达到两倍以上于arm7处理器的处理能力。这种处理能力的提高是通过增加时钟频率和减少指令执行周期实现的。arm9系列包括三种处理器:arm926ej-s、arm946e-s和arm968e-s。11、 时钟频率的提高arm7处理器采用3级流水线,而arm9采用5级流水线。增加的流水线设计提高了时钟频率和并行处理能力。5级流水线能够将每一个指令处理分配到5个时钟周期内,在每一个时钟周期内同时有5个指令在执行。2、 指令周期的改进指令周期的改进对于处理器性能的提高有很大的帮助。性能提高的幅度依赖于代码执行时指令的重叠,这实际上是程序本身的问题。对于采用最高级的语言,一般来说,性能的提高在30%左右。a) loads指令和stores指令指令周期数的改进最明显的是loads指令和stores指令。从arm7到arm9这两条指令的执行时间减少了30%。指令周期的减少是由于arm7和arm9两种处理器内的两个基本的微处理结构不同所造成的。arm9有独立的指令和数据存储器接口,允许处理器同时进行取指令和读写数据。这叫做改进型哈佛结构。而arm7只有数据存储接口,它同时用来取指令和数据访问。5级流水线引入了独立的存储器和写回流水线,分别用来访问存储器和将结果写回寄存器。b) 互锁技术当指令需要的数据因为以前的指令没有执行完而没有准备好就会产生管道互锁。当管道互锁发生时,硬件会停止这个指令的执行,直到数据准备好为止。虽然这种技术会增加代码执行时间,但是为初期的设计者提供了巨大的方便。编译器以及汇编程序员可以通过重新设计代码的顺序或者其它方法来减少管道互锁的数量。c) 分支指令arm9和arm7的分支指令周期是相同。而且arm9tdmi和arm8e-s并没有对分支指令进行预测处理。3、 arm9特点7以arm9e-s为例介绍arm9处理器的特点。其主要特点如下:a) 32bit定点risc处理器,改进型arm/thumb代码交织,增强性乘法设计。支持实时(real-time)调试;b) 片内指令和数据sram,而且指令和数据的存储器容量可调;c) 片内指令和数据告诉缓冲器(cache)容量从4k字节到1m字节;d) 设置保护单元(protcction unit),非常适合嵌入式应用中队存储器进行分段和保护;e) 采用amba ahb总线接口,为外设提供统一的地址和数据总线;f) 支持外部协处理器,指令和数据总线有简单的握手信令支持;g) 支持标准基本逻辑单元扫描测试方法学,而且支持bist;h) 支持嵌入式跟踪宏单元,支持实时跟踪指令和数据。3.2嵌入式c语言开发技术不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接操作能力。无疑,汇编语言具备这样的特质。但是,由于汇编语言开发的复杂性,它并不是嵌入式系统开发的一般选择。而与之相比,c语言一种“高级的低级”语言,则成为嵌入式系统开发的最佳选择。3在c语言中,宏是产生内嵌代码的唯一方法,对于嵌入式系统而言,为了能达到性能要求,宏是一种很好的代替函数的方法。嵌入式开发的核心就是利用最少的资源最高的效的实现所需功能。c语言在嵌入式中控制系统开发中的优势汇编语言有其执行效率高的优点,但其可移植性和可读性差,以及它本身就是一种编程 效率低下的低级语言,这些都使他的编程和维护极不方便,从而导致整个系统的可靠性也较差,而使用c语言进行嵌入式控制系统的开发,有着汇编语言不可比拟的优势。1、 编程调试灵活方便c语言具有灵的编程方式,当前几乎看了所有的嵌入式控制系统都有相应的c语言级别的仿真调试系统,使得调试十分方便。2、 生成的代码编译效率高。3、 编写的程序完全模块化。4、 可移植性好一种语言所编写的c语言程序,只需将部分与相关的地方进行适度的修改,就可方便的移植到另外一种系列上。5、 便与项目维护管理用c语言发的代码便与开发小组计划项目,灵活管理,分工工作,以及后期维护,基本上可以杜绝因开发人员变化而给项目进度或后期维护或升级带来影响。3.3 ads开发环境ads(arm developer suite),是在1993年由metrowerks公司开发,是arm处理器下最重要的开发工具。ads是全套的实时开发软件工具,包编译器生成的代码密度和执行速度优异。可快速低价地创建arm结构应用。ads对汇编、c/c+、java支持的均很好,是目前最成熟的arm开发工具。很多arm开发软件也是借用的ads的编译器。21、 ads包括三种调试器:axd(arm extended debugger):arm扩展调试器;armsd(arm symbolic debugger):arm符号调试器;与老版本兼容的windows或unix下的arm调试工具,adw/adu(application debugger windows/unix)。其中axd不仅拥有低版本arm调试器的所有功能,还新添了图形用户界面,更方便的视窗管理数据显示,格式化和编辑以及全套的命令行界面。该产品还包括realmonitortm(可以再前台调试的同时断点续存并且在不中断应用的情况下读写内存跟踪调试工具)。2、 组成介绍a) 编译器:ads提供多种编译器,以支持arm和thumb指令的变异。armcc是arm c编译器tcc是thumb c编译器armcpp是arm c+编译器tcpp是thumb c+编译器armasm是arm和thumb的编译器b) 链接器:armlink是arm链接器。该命令既可以将编译得到的一个或多个目标文件和相关的一个或多个库文件进行链接,生成一个可执行文件,也可以将多个目标文件部分链接成一个目标文件,以供进一步的链接。c) 符号调试器:armsd是arm和thumb的符号调试器。它能够进行源码级的程序调试。用户可以再用c或汇编语言写的代码中进行单步调试、设置断点、查看变量值和内存单元的内容。d) fromelf:将elf格式的文件转换为各种格式的输出文件,包括bin格式的映像文件、motorola 32位s格式影像文件、intel 32位格式映像文件和verilog十六进制文件。e) armar:armar是arm库函数生成器,它将一系列elf格式的目标文件以库函数的形式集合在一起。用户可以把一个库传递给一个链接器以代替几个elf文件。f) codewarrior:codewarrior集成开发环境(ide)为管理和开发项目提供了简单多样化的图形用户界面,用户可以使用ads的codewarrior ide为arm和thumb处理器开发用c、c+或者arm汇编语言编写的程序代码。g) c和c+库:ads提供ansi c库函数和c+库函数,支持被编译的c和c+大面。用户可以把c库中的与目标相关的函数作为自己应用程序中的一部分,重新进行代码的实现。3.4 中断流程图3.1中断流程图3.5 数据结构3.5.1 中断优先级产生模块其中32个中断请求的优先级逻辑有一个rotation based仲裁位组成:6个一级仲裁位和一个二级位4,如图3.2所示图3.23.5.2 中断优先级每个仲裁器可以处理6个中断请求,基于一位仲裁器模式(arb_mode)和两位选择信号(arb_sel):如果arb_sel位为00b,优先级顺序是:req0,req1,req2,req3,req4,and req5。如果arb_sel位为01b,优先级顺序是:req0,req2,req3,req4,req1,and req5。如果arb_sel位为10b,优先级顺序是:req0,req3,req4,req1,req2,and req5。如果arb_sel位为11b,优先级顺序是:is req0,req4,req1,req2,req3,and req5。注意:req0总是具有最高优先级,req5总是具有最低优先级,改变arb_sel位只能改变req1-req4的优先级。如果arb_mode位被置1,arb_sel不会自动改变,这会使仲裁器处于固定优先级模式(注意即使处于这种模式,还是可以通过手动改变arb_sel位来配置优先级)。如果arb_mode位被置1,arb_sel改变以变换优先级,例如,如果req1被服务,arb_sel自动变成01把req1变为最低优先级,arb_sel的详细规则如下:如果req0或req5被服务,arb_sel位不会变如果req1被服务,arb_sel位置01b如果req2被服务,arb_sel位置10b如果req3被服务,arb_sel位置11b如果req4被服务,arb_sel位置00b3.6 寄存器工作原理3.6.1 程序状态存储器psr如果psr中的f位被置1,cpu不接收fiq快速中断,同样如果i位psr被置1,cpu不接收irq中断,因此中断控制器能够通过将psr的f和i位和相应的intmsk中的位清零来接收中断。63.6.2 中断模式arm920t有两种中断模式:fiq和irq。在中断请求时所有的中断源决定使用哪个模式。3.6.3 中断请求寄存器s3c2410有两种中断请求寄存器:源请求寄存器(srcpnd)和中断请求寄存器(intpnd)。这些请求寄存器揭示了一个中断是否正在请求。当中断源请求中断服务时srcpnd寄存器中的相应位肯定被置1,然而,中断仲裁之后则只有intpnd寄存器的某1位被自动置1。即使该中断被屏蔽,srcpnd寄存器中的相应位也会被置1,但是intpnd寄存器将不会改变。当intpnd寄存器的某位被置1,且i位或者f位清零时中断服务即开始。srcpnd和intpnd寄存器能够被读和写,因此服务函数必须通过向srcpnd和intpnd中相应位写入“1”来清除中断请求条件。3.6.4 中断屏蔽寄存器通过中断屏蔽寄存器的哪个屏蔽位被置1可以知道哪个中断被禁止。如果intmsk的某个屏蔽位为0,此中断将会被正常服务。如果中断源产生了一个请求,srcpnd中的源请求位被置位,即使相应屏蔽位为1。3.7 实验详解中断控制器有5个控制寄存器:源请求寄存器、中断模式寄存器、屏蔽寄存器、优先级寄存器和中断请求寄存器。所有中断请求首先寄存入srcpnd,它们基于中断模式寄存器分为两组:fiq请求和irq请求。多irq的仲裁过程基于优先级寄存器。3.7.1 源请求寄存器srcpndsrcpnd由32位组成,每一位与一个中断源相关。如果某个中断源产生中断请求并等待中断服务,某位将会被置1。相应地,寄存器也指出了哪个中断源在请求服务。注意srcpnd中的每个位是由中断源自动置位的,与intmask寄存器无关。此外,srcpnd寄存器不会被优先级逻辑影响。在中断服务函数中必须清零srcpnd的相应位,否则,中断控制器会认为同一个源的另一个中断,换句话说,如果srcpnd的某个位仍然为1,中断控制器会认为又有一个有效的新的中断在请求服务。清零相应位的时机由用户需求决定。如果想要从同一个中断源接收另外一个有效的中断,应该在刚进入isr的时候清零,然后使能中断。可以通过向srcpnd写入数据来清零某位,但是注意只有srcpnd中为1的位会被写成写入数据中的位,而srcpnd中为0的位不会改变(如图3.3)。图3.33.7.2 中断模式寄存器intmod此寄存器由32个对应每个中断源的位组成。如果某位被置1,相应的中断被设置为fiq模式,否则,设置为irq模式。注意:只有1个中断源能够被设置为fiq模式,因此intmod中只有1位能被置1。3.7.3 中断屏蔽寄存器intmsk每个中断源对应一个位,如果某位被置1,cpu不会响应相应的中断请求(意即使这种情况下,srcpnd的位还是会置1),位置0,相应中断请求可以被响应。相关图见图3.4、图3.5和图3.6。图3.4图3.5图3.63.7.4 中断请求寄存器intpnd每个位显示了相应的中断请求(没有被屏蔽并等待中断服务)是否具有最高的优先级。由于intpnd寄存器处于优先级逻辑之后,只有1位能被置1,只有这个中断请求向cpu产生irq中断。在中断服务程序中,可以通过读此寄存器来知道哪个中断源正在被服务。同srcpn d寄存器一样,寄存器必须在中断服务程序中清零(srcpnd清零之后)。每个中断源对应一个位,如果某位被置1,cpu不会响应相应的中断请求,如果被置0,相应中断请求可以被响应。(见图3.7)图3.7注意:1、如果fiq模式中断发生,intpnd的相应位不会turn on,因为intpnd寄存器仅在irq模式下有效。2、清除intpnd寄存器时的注意事项:intpnd寄存器通过写1来清零某位。如果某位从1写成0,intpnd寄存器和intoffset寄存器可能有非期望值出现。因此,请不要向intpnd寄存器中为1的位写入0,最方便的清除intpnd寄存器的方法就是向intpnd寄存器中写入当前intpnd寄存器的值如:intpnd=intpnd。3.7.5 中断偏移寄存器intoffsetintoffset寄存器中的值表示哪个中断请求在intpnd寄存器之中。此位将会在清零srcpnd和intpnd之后自动清零。注意:fiq中断不影响此寄存器,因为它只在irq模式下有效。3.7.6 子中断源请求寄存器subsrcpnd可以通过向subsrcpnd写入数据来清零某位,但是注意只有subsrcpnd中为1的位会被写成写入数据中的位,而subsrcpnd中为0的位不会改变。图3.8显示了寄存器的相关位。图3.83.7.7 子中断屏蔽寄存器intsubmsk此寄存器有11位,每一位对应一个中断源,如果某位被置1,说明此位对应的中断请求不被cpu响应(注意即使在这种情况下,subsrcpnd寄存器还是被置1的),如果屏蔽位为0,则相应中断请求能被响应。图3.9四、程序流程该程序的流程是,按下程序启动后,初始化定时器1,设定定时器的中断时间,然后,等待定时器中断,当定时器中断到来时,就会进入定时器中断服务子程序,而中断服务子程序会把led1和led2灯熄灭或点亮,从现象中看到led1和led2 灯忽闪一次,则说明定时器发生了一次中断。最后,关闭中断请求,等待下一次的中断的到来。为使cpu响应中断,在中断服务子程序执行之前,必须打开arm920t的cpsr中的i位,以及相应的中断屏蔽寄存器中的位。5程序流程图如下:开始初始化while循环等待定时器中断产生led中断服务子程序关闭定时器中断图4.1程序流程图五、主要源代码5.1 主函数设计主函数就是通过一个while(1)死循环来等待中断的发生#include #include .incconfig.hvoid main(void)target_init(); /完成目标板的初始化while(1); /while函数死循环等待外部中断的发生5.2 定时器中断初始化程序void timer1int_init(void)/定时器接口使能 if (rintpnd & bit_timer1) rsrcpnd |= bit_timer1; pisr_timer1 = (int)timer1_isr; rintmsk &= (bit_timer1); /开中断 5.3 定时器初始化程序void timer1_init(void) rgpgcon = rgpgcon & 0xfff0ffff | 0x00050000; /配置gpg口为信号输出 rgpgdat = rgpgdat | 0x300; rtcfg0 = 255; / prescaler0=255 rtcfg1 = 0 4; rtcntb1 = 48828; / 在pclk=50mhz下,1秒钟的记数值rtcntb1 = 50000000 / 4 / 256 = 48828; rtcmpb1 = 0x00; rtcon = (1 11) | (1 9) | (0 8); /禁用定时器1,手动加载 rtcon = (1 11) | (0 9) | (1 8); /启动定时器1,自动装载5.4 定时器中断服务子程序int flag;void _irq

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论