欢迎来到课桌文档! | 帮助中心 课桌文档-建筑工程资料库
课桌文档
全部分类
  • 党建之窗>
  • 感悟体会>
  • 百家争鸣>
  • 教育整顿>
  • 文笔提升>
  • 热门分类>
  • 计划总结>
  • 致辞演讲>
  • 在线阅读>
  • ImageVerifierCode 换一换
    首页 课桌文档 > 资源分类 > DOCX文档下载  

    嵌入式-中断实验.docx

    • 资源ID:946902       资源大小:42.10KB        全文页数:8页
    • 资源格式: DOCX        下载积分:5金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要5金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    嵌入式-中断实验.docx

    5.3中断实验实验目的1 .了解中断的作用;2 .掌握嵌入式系统中断的处理流程;3 .掌握ARM中断编程。实验内容1 .编写中断处理程序,处理外部中断;预备知识1. 了解ADTlDE集成开发环境的根本功能;2. 了解中断的作用以及根本处理过程。实验设备1 .硬件:JX44B0教学实验箱、PC机;2 .软件:PC机操作系统Windows98(2000、XP)+ADTIDE集成开发环境。根底知识1.中断的根本概念CPU与外设之间传输数据的控制方式通常有三种:查询方式、中断方式和DMA方式。DMA方式将在后续实验中说明。查询方式的优点是硬件开销小,使用起来比拟简单。但在此方式下,CPU要不断地查询外设的状态,当外设未准备好时,CPU就只能循环等待,不能执行其它程序,这样就浪费了CPlJ的大量时间,降低了CPU的利用率。为了解决这个矛盾,通常采用中断传送方式:即当CPU进行主程序操作时,外设的数据已存入输入端口的数据存放器;或端口的数据输出存放器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。这样CPU就防止了把大量时间消耗在等待、查询状态信号的操作上,使其工作效率得以大大地提高。能够向CPU发出中断请求的设备或事件称为中断源。系统引入中断机制后,CPU与外设(甚至多个外设)处于“并行”工作状态,便于实现信息的实时处理和系统的故障处理。中断方式的原理示意图如下所示。图5-7中断处理示意图1)中断响应中断源向CPU发出中断请求,假设优先级别最高,CPlJ在满足一定的条件下,可以中断当前程序的运行,保护好被中断的主程序的断点及现场信息。然后,根据中断源提供的信息,找到中断效劳子程序的入口地址,转去执行新的程序段,这就是中断响应。CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。2)中断效劳子程序CPU响应中断以后,就会中止当前的程序,转去执行一个中断效劳子程序,以完成为相应设备的效劳。中断效劳子程序的一般结构如下列图所示。图5-8中断效劳子程序处理流程 保护现场(由一系列的压栈指令完成)。目的是为了保护那些与主程序中有冲突的存放器,(如RO,RbR2等),如果中断效劳子程序中所使用的存放器与主程序中所使用的存放器等没有冲突的话,这一步骤可以省略。 中断处理,中断处理程序在检查到相应的中断源后,调用对应的中断处理程序完成。 恢复现场并返回(由一系列的出栈指令完成)。是与保护现场对应的,但要注意数据恢复的次序,以免混乱。由于中断效劳子程序需要打断主程序的执行,因此其处理应该及时完成,较长时间的延时将导致系统性能严重下降。2.S3C44B0X中断控制器S3C44B0X的中断控制器包括5类存放器:中断控制存放器、中断状态存放器、中断模式存放器、中断屏蔽存放器和中断去除存放器。1)中断控制存放器该控制存放器是处理器总的中断控制,包括中断模式是矢量模式还是非矢量模式,是否使能IRQ模式的中断,是否使能FIQ模式的中断,具体说明如下:表5-3中断控制存放器寄存器名称地址读写状态描述复位值INTCON0x01E00000R/W中断控制存放器0x7INTCON位描述初始状态保存300V2IRQ禁止/使能向量模式0:向量中断模式1:非向量中断模式1I1使能CPU的IRQ中断,在使用IRQ中断之前,必须去除该位0:RQ中断使能1:IRQ中断禁止1F0使能CPU的FIQ中断,在使用FIQ中断之前,必须去除该位0:FIQ中断使能1:FIQ中断禁止12)中断状态存放器该存放器用于检查中断来源,该存放器是只读属性的。表5-4中断状态存放器寄存器名称地址读写状态描述复位值INTPND0x01E00004R指示中断请求状态0:中断已被响应1:有中断请求0x03)中断模式存放器用于设置相应中断的工作模式,是IRQ模式还是FIQ模式。表5-5中断模式存放器寄存器名称地址读写状态描述复位值INTMOD0x01E00008R/W中断模式存放器0:IRQ模式0x01:FIQ模式4)中断屏蔽存放器表5-6中断屏蔽存放器寄存器名称地址读写状态描述复位值INTMSK0x01E0000CR/W确定哪一个中断源被屏蔽,屏蔽的中断源将不引发中断0:中断效劳有效1:中断效劳屏蔽0x7FFFFFF5)中断去除存放器中断处理之后需要去除相应的标志位,中断去除存放器说明如下:表5-7中断去除存放器寄存器名称地址读写状态描述复位值I_ISPC0x01E00024WIRQ中断请求清0存放器未定义F_ISPC0x01E0003CWFlQ中断请求清0存放器未定义4.JX44B0中断处理S3C44B0X处理器的中断处理与其他CPU的处理模式根本上是一致的,只是由于它引入了儿种不同的处理器模式,使中断处理变得更加容易。其典型的步喉如下:1)保存现场:当系统出现中断时,处理器首先要做的就是保存现场,这一过程包括:保存当前的PC值到Ir中,保存当前的程序运行状态到SPSr中。值得注意的就是由于ARM7采用3级流水线结构,此时的PC值实际上等于当前指令地址加上81ARM指令时),所以返回时还需要将保存的PC值减4;2)模式切换:当处理器完成现场保护后,就进入中断模式,并将PC值置为一个固定的值0X00000018,这也就是IRQ模式的中断入口地址。在中断模式下,有两个独立的存放器RI3、R14,这样可以便于中断程序使用自己特有的堆栈。但这样随之而来产生一个问题,就是中断处理时堆栈溢出保护的问题,需要我们认真地估计堆栈的大小,同时在中断处理时也要尽量减少函数调用的层次,否那么将产生一些不可预知的错误;3)获取中断源:所有的IRQ中断都从OXOOOO0018开始执行,通常在该地址处放一条跳转指令,进一步跳到我们的中断程序中;4)处理中断:在中断程序中需要进一步获取中断源,即谁引发了该中断,然后通过查表获取相应中断的处理程序入口,并调用对应的函数;5)中断返回,恢夏现场:在返回时需要恢复处理器模式,包括恢复中断处理用到的所有存放器、恢复被中断的程序运行状态到CPSR,并跳转到被中断的主程序。下列图为JX44B0教学实验系统中处理外部中断0的流程:图5-8JX44B0中断处理示意图中断的入口代码(汇编代码):0X00000018:LDRpc,=0X0C0000200X0C000020:bHandlerIRQHandlerIRQ:subsp,sp,#4/*为中断分发例程入口地址预留栈空间*/stmfdsp!,r/*保存RO*/Idrr,=HandleIRQ/*将中断分发例程入口地址指针保存到RO中*/Idrr,r/将中断分发例程入口地址保存到RO中*/strr,sp,#4/*将中断分发例程入口地址保存到预留的堆栈空间*/Idmfdsp!,r,pc)/*将Ro和中断分发例程入口地址出栈,这条指令也*/*实现了一个跳转*/上述代码实际上就是一个三级跳,即从FLASH中跳到了RAM的中断入口,然后又从中断入口跳到中断分发例程入口。在此我们有一个前提条件,即必须在HandlelRQ地址处保存正确的分发例程入口地址,如使用下面代码后ISrIRQ就是中断分发例程:Idrr,=HandleIRQIdrrl,=IsrIRQstrrl,r中断分发例程可以采用汇编语言和C语言两种格式编写,下面将分别列出这两种方式。1)用汇编代码编写的中断分发例程:IsrIRQ:*usingIISPRregister.*/subIr,Ir,#4stmfdsp!,lr/*保存中断返回的PC值*/stmfdsp!,r-r4/*备份存放器Ro-R4/subsp,sp,#4/*为PC预留栈空间*/stmfdsp!,r8-r9)/*备份存放器R8-R9/Idrr9,=I_ISPR/*读取中断状态*/Idrr9,r9cmpr9,#0x0/*检查中断状态*/beqi2movr8,«0x0*R8保存中断表的偏移*/i:/*逐位检查中断状态*/movsr9,r9,Isr#1bcsil/*如果该位等于1,那么处理这一中断*/addr8,r8,#4/*修改当前的中断偏移*/bi/*处理下一比特*/il:Idrr9,=HandleADC*HandleADC位于中断向量表起始位置,我们将该地址用作是中断向量表的基地址*/addr9,r9,r8/*计算入口地址指针:中断基地址加上偏移*/Idrr9,r9/*从地址向量表中获取入口地址*/strr9,sp,#8/*将入口地址保存到堆栈,并移动堆栈指针*/movIr,pc/*保存当前PC*/Idmfdsp!,r8-r9,pc/调用中断例程/Idmfdsp!,r-r4,pc)7*中断返回,并恢复中断前的处理器模式*/i2:Idmfdsp!,r8-r9/*如果当前没有任何中断,直接返回*/addsp,sp,#4/*移动堆栈指针,该空间由第4句指令预留*/Idmfdsp!,r-r4,pc)7*中断返回,并恢复中断前的处理器模式*/2)用C代码编写的中断分发例程:如果采用GMJ编译器,需要将该函数定义为中断类型,使用关键字:.attribute.(interrupt(z,IRQ,z)。如下所示代码为C语言的IsrIRQ实现:typedef(*ISR_ROUTINE_ENTRY)(void);voidIsrIRQ()_attribute_(interrupt(*IRQ*);voidIsrIRQO(intcount=0;unsignedintisrpending;unsignedintisrmask=0x00000001;unsignedintisrmaskset=rINTMSK;*读取中断掩码*/ISRROUTlNEENTRYisrroutine_entry=(ISR_ROUTINE_ENTRY)0x0;isrpending=(rINTPND&visrmaskset):*读取中断状态*/*查表*/while(isrmask)if(isrpending&isrmask)(*找到中断源,获取中断例程入口地址*/isrroutineentry=(ISRROUTINEENTRY)(*(int*)(HandleDC+count);break;)count+=4;isrmask«=1;)*调用中断效劳例程*/if(isrroutineentry)(*isrroutineentry)O;)中断处理例程(该函数无需定义为中断类型)voidEINTOJsrOrLISPc=BILEINTO;/*去除中断标志*/)中断向量表中各个中断的偏移:表5-8中断向量表中各个中断的偏移中断源向量表的偏移ADC(AD转换中断0X20RTC(实时时钟中断)0X244.实验弁考代码及说明/*包含文件*/"include"44b.h”typedef(*ISR_ROUTINE_ENTRY)(void);voiddelayO:voidextO_int_isr(void);voidIsrIRQO_attribute(interrupt(*IRQ*):*声明为中断效劳里例程*/intext0_count=0:intdithercount=0:/*/Functionname/Description:IsrIRQ:非矢量方式下中断的查表处理/中断地址表位于0x0c7fff00开始的256字节/Returntype:void/Argument:void*/voidIsrIRQOintcount=0;unsignedintisrpending;unsignedintisrmask=0x00000001;unsignedintisrmaskset=rINTMSK:ISRROUTINEENTRYisr_routine_entry=(ISR_ROUTINE_ENTRY)0x0:_asm_("STMFDSP!,rl,r4-r8)SAVErl,r4-rln”*11opn");isrpending=(rINTPND&isrmaskset);while(isrmask)if(isr_pending&isrmask)isrroutineentry=(ISRROUTINEENTRY)(*(int*)(HandleDC+count);b,eak;)count+=4;isrmask«=1;)if(isrroutineentry)(*isrroutineentry)O;_asm_(wLDMFDSP!,rl,r4-r8)©RESTORErl,r4-rln*“nopn*);)/*/Functionname/Description/Returntype/Argument/:initintei'rupthandler:非矢量方式下中断向量表初始化处理:void:irq_handler中断处理函数入口*/voidinitinterrupthandler(unsignedintirqhandler)(inti;rINTPND=0x00000000:/去除所有未决的中断*/rI_ISPC=0x03FFFFFF;for(i=0;i<256;i+=4)/去除中断表*/(unsignedint*)(ISR_STARTADDRESS+i)=0;(unsignedint*)(HandleIRQ)=irqhandler;*设置IRQ模式处理函数*/)/*/Functionname/Description/Returntype/Argument/:installisrhandler:非矢量方式下中断向量的安装:void:irq_no,中断号irqroutine,中断处理函数地址*/voidinstal1isrhandler(intirqno,void*irqroutine)(unsignedint*)(irqno)=(unsignedint)irqroutine;)/*/Functionname/Description/Returntype/Argument:Main:中断测试程序主函数实现外部中断。的测试,引发中断后在中断处理函数中显示跑马灯:int:void*/intMain()intoldindex;rINTCON=Ox7;*Non-vect,IRQdisable,FIQdisable*/initinterrupthand1er(unsignedint)IsrIRQ):instai1isrhandler(HandleEINTO,(void*)extintisr);rINTMOD=OxO;*设置所有中断为IRQ模式*/rINTMSK=(0x07ffffff&"(BIT_GLOBALBITEINTO):*使能外部中断0*/rINTCON=Ox5;*Non-vect,IRQenable,FIQdisable*/ext0count=0;dithercount=0;while(l)(delay();dithercount+;)/*/Functionname/Description/Returntype/Argument:extint_isr:外部中断。处理函数:int:void*/voidextintisr(void)IriSPC=BIT_EINT0;*去除外部中断0*/if(dithercount>5)(dithercount=0:if(extcount&l)*交替显示发光二极管*/*(unsignedchar*)0x2000000=Oxff;else*(unsignedchar*)0x2000000=OxOf;ext0count+;)voiddelay()(intindex=0;for(index=0;index<100000;index+);)实验步骤1 .参照模板工程interrupt(modulesinterruptinteupl.apj),新建一个工程interrupt,添加相应的文件,并修改interrupt的工程设置;2 .创立interrupt,c并参加到工程interrupt中;3 .编写中断分发例程ISrIRQ;4 .注册外部中断0处理函数extO_int_isr;5 .实现外部中断0处理函数extint_isr,在其中实现LED开关功能;6 .编译interrupt;7 .下载程序并运行,按下按键EXTlNTO将引发一次外部中断,并在中断处理函数中闪灯。实验报告要求1 .中断处理的主要步骤有哪些?试说明每一步的主要工作。2 .编写程序处理定时中断;3 .简述S3C44B0X非矢量中断的处理步骤。

    注意事项

    本文(嵌入式-中断实验.docx)为本站会员(夺命阿水)主动上传,课桌文档仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知课桌文档(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-1

    经营许可证:宁B2-20210002

    宁公网安备 64010402000986号

    课桌文档
    收起
    展开