ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:256.90KB ,
资源ID:5407383      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5407383.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验删减版.docx)为本站会员(b****3)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

实验删减版.docx

1、实验删减版实验三 中断实验一、实验目的1. 了解中断的作用;2. 掌握嵌入式系统中断的处理流程;3. 掌握ARM中断编程。二、实验内容1. 编写中断处理程序,处理外部中断;三、预备知识1. 了解ADT集成开发环境的基本功能;2. 了解中断的作用以及处理过程。四、实验设备1. JX44B0教学实验箱;2. ADT IDE集成开发环境;3. 串口线一根。五、基础知识1 . 中断的基本概念 CPU与外设之间传输数据的控制方式通常有三种:查询方式、中断方式和DMA方式。DMA方式将在后续实验中说明。查询方式的优点是硬件开销小,使用起来比较简单。但在此方式下,CPU要不断地查询外设的状态,当外设未准备好

2、时,CPU就只能循环等待,不能执行其它程序,这样就浪费了CPU的大量时间,降低了CPU的利用率。为了解决这个矛盾,通常采用中断传送方式:即当CPU进行主程序操作时,外设的数据已存入输入端口的数据寄存器;或端口的数据输出寄存器已空,由外设通过接口电路向CPU发出中断请求信号,CPU在满足一定的条件下,暂停执行当前正在执行的主程序,转入执行相应能够进行输入/输出操作的子程序,待输入/输出操作执行完毕之后CPU再返回并继续执行原来被中断的主程序。这样CPU就避免了把大量时间耗费在等待、查询状态信号的操作上,使其工作效率得以大大地提高。能够向CPU发出中断请求的设备或事件称为中断源。系统引入中断机制后

3、,CPU与外设(甚至多个外设)处于“并行”工作状态,便于实现信息的实时处理和系统的故障处理。中断方式的原理示意图如下所示。 图5-6 中断处理示意图1)中断响应 中断源向CPU发出中断请求,若优先级别最高,CPU在满足一定的条件下,可以中断当前程序的运行,保护好被中断的主程序的断点及现场信息。然后,根据中断源提供的信息,找到中断服务子程序的入口地址,转去执行新的程序段,这就是中断响应。CPU响应中断是有条件的,如内部允许中断、中断未被屏蔽、当前指令执行完等。2)中断服务子程序CPU响应中断以后,就会中止当前的程序,转去执行一个中断服务子程序,以完成为相应设备的服务。中断服务子程序的一般结构如下

4、图所示。图5-7 中断服务子程序处理流程a. 保护现场(由一系列的压栈指令完成)。目的是为了保护那些与主程序中有冲突的寄存器,(如R0,R1,R2等),如果中断服务子程序中所使用的寄存器与主程序中所使用的寄存器等没有冲突的话,这一步骤可以省略。b. 中断处理,中断处理程序在检查到相应的中断源后,调用对应的中断处理程序完成。c. 恢复现场并返回(由一系列的出栈指令完成)。是与保护现场对应的,但要注意数据恢复的次序,以免混乱。由于中断服务子程序需要打断主程序的执行,因此其处理应该及时完成,较长时间的延时将导致系统性能严重下降。2. S3C44B0中断控制器S3C44B0的中断控制器包括四类寄存器:

5、中断控制寄存器、中断模式寄存器、中断状态寄存器、中断屏蔽寄存器。2.1 中断控制寄存器该控制寄存器是处理器总的中断控制,包括中断模式是矢量模式还是非矢量模式,是否使能IRQ模式的中断,是否使能FIQ模式的中断,具体说明如下:表5-12 中断控制寄存器2.2 中断状态寄存器该寄存器由于检查中断来源,该寄存器是只读属性的。表5-13 中断状态寄存器2.3 中断模式寄存器用于设置相应中断的工作模式,是IRQ模式还是FIQ模式。表5-14 中断模式寄存器2.4 中断屏蔽寄存器表5-15 中断屏蔽寄存器2.5 中断清除寄存器中断处理之后需要清除相应的标志位,中断清除寄存器地址如下:表5-16 中断清除寄

6、存器3. 实验说明S3C44B0处理器的中断处理与其他CPU的处理模式基本上是一致的,只是由于它引入了几种不同的处理器模式,使中断处理变得更加容易。其典型的步骤如下:1)保存现场:当系统出现中断时,处理器首先要做的就是保存现场,这一过程包括:保存当前的PC值到lr中,保存当前的程序运行状态到spsr中。值得注意的就是由于ARM7采用3级流水线结构,此时的PC值实际上等于当前指令地址加上8(ARM指令时),所以返回时还需要将保存的PC值减4。 2)模式切换:当处理器完成现场保护后,就进入中断模式,并将PC值置为一个固定的值0X00000018,这也就是IRQ模式的中断入口地址。在中断模式下,有两

7、个独立的寄存器R13、R14,这样可以便于中断程序使用自己特有的堆栈。但这样随之而来产生一个问题,就是中断处理时堆栈溢出保护的问题,需要我们认真地估计堆栈的大小,同时在中断处理时也要尽量减少函数调用的层次,否则将产生一些不可预知的错误。3)获取中断源:所有的IRQ中断都从0X00000018开始执行,通常在该地址处放一条跳转指令,进一步跳到我们的中断程序中。 4)处理中断:并在中断程序中需要进一步获取中断源,即谁引发了该中断,然后通过查表获取相应中断的处理程序入口,并调用对应的函数;5)中断返回,恢复现场:在返回时需要恢复处理器模式,包括恢复中断处理用到的所有寄存器、恢复被中断时的程序运行状态

8、到CPSR,并跳转到被中断的主程序。下图为JX44B0教学系统中处理外部中断0的流程:图5-8 JX44B0中断处理示意图 中断的入口代码(汇编代码): 0X00000018: LDR pc, =0X0C000020 0X0C000020: b HandlerIRQHandlerIRQ: sub sp,sp,#4 /* 为中断分发例程入口地址预留栈空间 */ stmfd sp!,r0 /* 保存R0 */ ldr r0,=HandleIRQ /* 将中断分发例程入口地址指针保存到R0中 */ ldr r0,r0 /* 将中断分发例程入口地址保存到R0中*/ str r0,sp,#4 /* 将中

9、断分发例程入口地址保存到预留的堆栈空间 */ ldmfd sp!,r0,pc /* 将R0和中断分发例程入口地址出栈,这条指令也 */ /*实现了一个跳转 */ 上述代码实际上就是一个三级跳,即从FLASH中跳到了RAM的中断入口,然后又从中断入口跳到中断分发例程入口。在此我们有一个前提条件,即必须在HandleIRQ地址处保存正确的分发例程入口地址,如使用下面代码后IsrIRQ就是中断分发例程: ldr r0,=HandleIRQ ldr r1,=IsrIRQ str r1,r0中断分发例程可以采用汇编语言和C语言两种格式编写,下面将分别列出这两种方式。1、用汇编代码编写的中断分发例程:Is

10、rIRQ: /*using I_ISPR register.*/ sub lr,lr,#4 stmfd sp!,lr /* 保存中断返回的PC值 */ stmfd sp!,r0-r4 /* 备份寄存器R0-R4 */ sub sp,sp,#4 /* 为PC预留栈空间 */ stmfd sp!,r8-r9 /* 备份寄存器R8-R9 */ ldr r9,=I_ISPR /* 读取中断状态 */ ldr r9,r9 cmp r9, #0x0 /* 检查中断状态 */ beq i2 mov r8,#0x0 /* R8保存中断表的偏移 */i0: /* 逐位检查中断状态 */ movs r9,r9,l

11、sr #1 bcs i1 /* 如果该位等于1,则处理这一中断 */ add r8,r8,#4 /* 修改当前的中断偏移 */ b i0 /* 处理下一比特 */i1: ldr r9,=HandleADC /* HandleADC位于中断向量表起始位置,我们将该地址用作是中断向量表的基地址 */ add r9,r9,r8 /* 计算入口地址指针:中断基地址加上偏移 */ ldr r9,r9 /* 从地址向量表中获取入口地址 */ str r9,sp,#8 /* 将入口地址保存到堆栈,并移动堆栈指针 */ mov lr,pc /* 保存当前PC*/ ldmfd sp!,r8-r9,pc /* 调

12、用中断例程 */ ldmfd sp!,r0-r4, pc/* 中断返回,并恢复中断前的处理器模式*/i2: ldmfd sp!,r8-r9 /* 如果当前没有任何中断,直接返回 */ add sp,sp,#4 /* 移动堆栈指针,该空间由第4句指令预留 */ ldmfd sp!,r0-r4, pc/* 中断返回,并恢复中断前的处理器模式*/2、用C代码编写的中断分发例程: 如果采用GNU编译器,需要将该函数定义为中断类型,使用关键字:_attribute_ (interrupt(IRQ)。如下所示代码为C语言的IsrIRQ实现: typedef (*ISR_ROUTINE_ENTRY)(voi

13、d);void IsrIRQ() _attribute_ (interrupt(IRQ);void IsrIRQ() int count = 0; unsigned int isr_pending; unsigned int isr_mask = 0x00000001; unsigned int isr_mask_set = rINTMSK; /* 读取中断掩码 */ ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0; isr_pending = (rINTPND & isr_mask_set); /* 读取中断状态 */

14、 /* 查表 */ while(isr_mask) if(isr_pending&isr_mask) /* 找到中断源,获取中断例程入口地址 */isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count); break; count+=4; isr_mask = 1; /* 调用中断服务例程 */ if(isr_routine_entry) (*isr_routine_entry)();中断处理例程(该函数无需定义为中断类型)void EINT0_Isr() rI_ISPC=BIT_EINT0;/* 清除中断标志 */ 中断

15、向量表中各个中断的偏移: 表5-17 中断向量表中各个中断的偏移中断源向量表的偏移ADC(AD转换中断)0X20RTC(实时时钟中断)0X24六、实验步骤1. 参照模板工程interrupt(modulesinterruptinterrupt.apj),新建一个工程interrupt,添加相应的文件,并修改interrupt的工程设置;2. 创建interrupt.c并加入到工程interrupt中;3. 编写中断分发例程IsrIRQ;4. 注册外部中断0处理函数ext0_int_isr;5. 实现外部中断0处理函数ext0_int_isr,在其中实现LED开关功能;6. 编译interrup

16、t;7. 下载程序并运行,按下按键EXTINT0将引发一次外部中断,并在中断处理函数中开关灯。七、实验报告要求 1. 中断处理的主要步骤有哪些?试说明每一步的主要工作。 2. 说明S3C44B0非矢量中断与矢量中断的区别; 3. 简述S3C44B0非矢量中断的处理步骤。实验二 BootLoader编写实验一、实验目的1 了解BootLoader在嵌入式系统中的作用;2 掌握BootLoader的编写。二、实验内容1. 在BootLoader中实现程序的下载,程序的执行。三、预备知识1 了解BootLoader在嵌入式系统中的作用;2 了解BootLoader的功能组成;3 了解BootLoad

17、er的编写办法。四、实验设备1. JX44B0 1教学实验箱;2 ADT1000仿真器和ADT IDE集成开发环境。五、基础知识1. BootLoader的概念BootLoader是系统加电后运行的第一段软件代码。回忆一下 PC 的体系结构我们可以知道,PC 机中的引导加载程序由 BIOS(其本质就是一段固件程序)和位于硬盘MBR中的引导程序一起组成。BIOS 在完成硬件检测和资源分配后,将硬盘MBR中的引导程序读到系统的RAM 中,然后将控制权交给引导程序。引导程序的主要运行任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,也即开始启动操作系统。而在嵌入式系统中,通常

18、并没有像 BIOS 那样的固件程序(有的嵌入式系统也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由 BootLoader来完成。比如在一个基于 ARM7TDMI core 的嵌入式系统中,系统在上电或复位时都从地址0x00000000开始执行,而在这个地址处安排的通常就是系统的BootLoader程序。简单地说,BootLoader就是在操作系统内核或用户应用程序运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图(有的CPU没有内存映射功能如S3C44B0),从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核或用户应用程序准

19、备好正确的环境。对于一个嵌入式系统来说,可能有的包括操作系统,有的小型系统也可以只包括应用程序,但是在这之前都需要BootLoader为它准备一个正确的环境。通常,BootLoader 是依赖于硬件而实现的,特别是在嵌入式领域,为嵌入式系统建立一个通用的 BootLoader 是很困难的。当然,我们可以归纳出一些通用的概念来,以便我们了解特定BootLoader的设计与实现。 BootLoader 的移植和修改 每种不同的 CPU 体系结构都有不同的 BootLoader。除了依赖于 CPU 的体系结构外,BootLoader 实际上也依赖于具体的嵌入式板级设备的配置,比如板卡的硬件地址分配,

20、RAM芯片的类型,其他外设的类型等。这也就是说,对于两块不同的嵌入式板而言,即使它们是基于同一种 CPU 而构建的,如果他们的硬件资源和配置不一致的话,要想让运行在一块板子上的 BootLoader 程序也能运行在另一块板子上,也还是需要作一些必要的修改。 BootLoader 的安装 系统加电或复位后,所有的 CPU 通常都从 CPU 制造商预先安排的地址上取指令。比如,S3C44B0 在复位时都从地址 0x00000000 取它的第一条指令。而嵌入式系统通常都有某种类型的固态存储设备(比如:ROM、EEPROM 或 FLASH 等)被安排这个起始地址上,因此在系统加电后,CPU 将首先执行

21、 BootLoader 程序。 也就是说对于基于S3C44B0的这套系统,我们的BootLoader是从0地址开始存放的,而这块起始地址需要采用可引导的固态存储设备如FLASH。 用来控制 BootLoader 的设备或机制串口通讯是最简单也是最廉价的一种双机通讯设备,所以往往在BootLoader中主机和目标机之间都通过串口建立连接,BootLoader 程序在执行时通常会通过串口来进行 I/O,比如:输出打印信息到串口,从串口读取用户控制字符等。当然如果认为串口通讯速度不够,也可以采用网络或者USB通讯,那么相应的在BootLoader中就需要编写各自的驱动。 BootLoader 的启动

22、过程多阶段的 BootLoader 能提供更为复杂的功能,以及更好的可移植性。从固态存储设备上启动的 BootLoader 大多都是 2 阶段的启动过程,也即启动过程可以分为 stage 1 和 stage 2 两部分。 Boot Loader 的操作模式大多数 BootLoader 都包含两种不同的操作模式:启动加载模式和下载模式,这种区别仅对于开发人员才有意义。但从最终用户的角度看,Boot Loader 的作用就是用来加载操作系统,而并不存在所谓的启动加载模式与下载工作模式的区别。 启动加载(Boot loading)模式:这种模式也称为自主(Autonomous)模式。也即 BootL

23、oader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。这种模式是 BootLoader 的正常工作模式,因此在嵌入式产品发布的时侯,BootLoader 显然必须工作在这种模式下。 下载(Downloading)模式:在这种模式下,目标机上的 BootLoader 将通过串口连接或网络连接等通信手段从主机下载文件,比如:下载应用程序、数据文件、内核映像等。从主机下载的文件通常首先被 BootLoader 保存到目标机的RAM中,然后再被 BootLoader 写到目标机上的固态存储设备中。BootLoader 的这种模式通常在系统更新时使用。工作

24、于这种模式下的 BootLoader 通常都会向它的终端用户提供一个简单的命令行接口。 在教学系统中提供的BootLoader中没有实现自主模式,可以通过修改代码来实现该功能。 BootLoader 与主机之间进行文件传输所用的通信设备及协议 最常见的情况就是,目标机上的 Boot Loader 通过串口与主机之间进行文件传输,传输可以简单的采用直接数据收发,当然在串口上也可以采用xmodemymodemzmodem 协议以及在以太网上采用TFTP协议。此外,在论及这个话题时,主机方所用的软件也要考虑。比如,在通过以太网连接和 TFTP 协议来下载文件时,主机方必须有一个软件用来的提供 TFT

25、P 服务。2 . BootLoader的主要任务与典型结构框架从操作系统的角度看,BootLoader 的总目标就是正确地调用内核来执行。 另外,由于 BootLoader 的实现依赖于 CPU 的体系结构,因此大多数 BootLoader 都分为 stage1 和 stage2 两大部分。依赖于 CPU 体系结构的代码,比如设备初始化代码等,通常都放在 stage1 中,而且通常都用汇编语言来实现,以达到短小精悍的目的。而 stage2 则通常用C语言来实现,这样可以实现复杂的功能,而且代码会具有更好的可读性和可移植性。 Boot Loader 的 stage1 通常包括以下步骤(以执行的先

26、后顺序): 硬件设备初始化。 为加载 BootLoader 的 stage2 准备 RAM 空间。 拷贝 BootLoader 的 stage2 到 RAM 空间中。 设置好堆栈。 跳转到 stage2 的 C 入口点。 Boot Loader 的 stage2 通常包括以下步骤(以执行的先后顺序): 初始化本阶段要使用到的硬件设备。 调用应用程序或启动内核。3. 实验说明图8-1 Stage1 初始化流程图stage 1的功能: RAM初始化,设置各个部件的时钟和片选,将BootLoader拷贝到RAM中,设置堆栈,调用Stage 2。注意:在本阶段,特别是在堆栈设置之前,进行函数调用(也有

27、些汇编子程序不需要使用堆栈)或者使用堆栈保存数据将产生不可预知的结果;stage 2的功能: 初始化串口,显示菜单,通过菜单获取用户输入,并执行相应的操作。图8-2 Stage2流程BootLoader更新程序的流程图通过BootLoader更新程序的流程。注意为了使用Bootloader更新FLASH中的程序,需要首先将Bootloader搬迁到RAM中运行。图8-3 下载并更新BootLoader流程六、实验步骤1. 参照模板工程bootloader(modulesbootloaderbootloader.apj),新建一个工程bootloader,添加相应的文件,并修改bootloader的工程设置;2. 编写Stage1硬件初始化代码;3. 编写Stage2程序,实现从串口下载程序并烧写到FLASH中;4. 运行下载的程序;5. 检查运行结果。七、实验报告要求1、 Bootloader在嵌入式系统中的作用是什么,它的基本功能包括那些?2、 简述典型Bootloader的框架;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2