收藏 分享(赏)

嵌入式操作系统实验4.doc

上传人:cjc2202537 文档编号:1546058 上传时间:2018-08-01 格式:DOC 页数:10 大小:66.50KB
下载 相关 举报
嵌入式操作系统实验4.doc_第1页
第1页 / 共10页
嵌入式操作系统实验4.doc_第2页
第2页 / 共10页
嵌入式操作系统实验4.doc_第3页
第3页 / 共10页
嵌入式操作系统实验4.doc_第4页
第4页 / 共10页
嵌入式操作系统实验4.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、浙江大学城市学院实验报告课程名称: 嵌入式操作系统实验 4 实验名称: ARM 中断处理与调试 学生姓名: 专业: 学号: 同组学生姓名: 指导老师: 成绩: 一、实验目的)掌握的异常处理过程。)理解程序的结构。)掌握从应用程序中调用异常方法。二、实验内容)使用异常设计字符串输出程序)设计异常处理程序三、实验设备1教学实验箱,PentiumII 以上的 PC 机,硬件多功能仿真器。2PC 操作系统 WIN98 或 WIN2000 或 WINXP,ADS1.2 集成开发环境,仿真器驱动程序。四、实验步骤任务 1:使用异常设计字符串输出程序(注意:建立工程模仿下列步骤做,但要求工程名为自己的学号

2、a)1新建工程2把汇编程序添加到工程中SYS_WRITEC EQU regs0=regs0+regs1break;case 1;regs0=regs0+regs1break;case 2;regs0=(regs0+regs1)+(regs2+regs3)break;case 3;int w,x,y,z;w=regs0;x=regs1;y=regs2;z=regs3;regs0=w+x+y+z;regs1=w-x-y-z;regs2=w*x*y*z;regs=(w+x)*(y-z);break;例 11.4#include#include“swi.h“unsigned * swi_vec=(un

3、signed * )0x08;extern void SWI_Handler(void);unsigned Install_Handler(unsigned routine,unsigned*vector)unsigned vec,old_vec;vec=(routine-(unsigned)vector-8)2;if(vecvec=0xea000000-vecold_vec=*vector;*vector=vec;return(old_vec);int main(void)int result1,result2;struct four_results res_3;Insall_Handler

4、(unsigned)SWI_Handler,swi_vec);printf(“result1=multiply_two(2,4) = %dn“,result1=multiply_two(2,4);printf(“result2=multiply_two(3,6) = %dn“,result2=multiply_two(3,6);printf(“add_two(result1,result2) = %dn“,add_two(result1,result2);printf(“add_multiply_two(2,3,4,6) = %dn“,add_multiply_two(2,3,4,6);res

5、_3=many_operations(12,4,3,1);printf(“res_3.a=*%dn“,res_3.a);printf(“res_3.b=*%dn“,res_3.b);printf(“res_3.c=*%dn“,res_3.c);printf(“res_3.d=*%dn“,res_3.d);return 0;3 设置) ssembler 选项中的arget 选项卡() 4.编译5.打开调试器,ptions-Configure Target 选项,打开hoose Target 对话框,在hoose Target 中选择,点击 Configger 按扭,选择处理器 ARM7TDMI,

6、点击。6.载入映像文件*.axf7.观察处理器窗口选择rocessor Views-Disassembly,打开 ARM 反汇编窗口;8 单步运行程序,观察寄存器、存储空间和工作模式的变化情况。9 完成下列表格:指令执行后的变化情况寄存器值(进制表示) 存储空间工作模式序号 执行指令 R13_svcR14_svcR13_usrR14_usrR15 CPSR0xF0000000 - -问题:1的异常有哪些?2异常处理(硬件逻辑)的一般过程如何?3异常处理(软件逻辑)的一般过程如何?4阅读 http:/ 文章,并试图调试程序。五、实验步骤记录6、实验心得介绍个中断使用 swi 模式特权模式 sup

7、erisor svc 供 OS 使用的一个保护模式其实也是一个中断,对于硬件用户不可干扰确切的来说是用户定义中断模式1.了解正常状态 USER 状态的可用寄存器R0R7 通用 R8R12 独立寄存器 有些模式寄存器组是独立 R13-SP各自独立 R14-LR独立 PC 通用 CPSR独立r0r7 通用寄存器同 PC 下的通用寄存器一样R8R12 作为备份寄存器 ,可以使用 r0r7 均可使用他们r13 作为堆栈指针r14 作为连接寄存器存放当前子程序返回的地址PC ARM 是三级流水线所以 PC 总是为当前执行指令+8 处 ARM 下指令是字对齐所以低两位为 0CPSR 就是当前状态寄存器保存

8、当前执行的各种情况 2.了解一下特权模式在 PC 处理时发生的事情正常执行指令 PC+4(均指 ARM 状态下)发生函数调用时 STMFD SP!, REGISTER, LR STMFD SP!, REGISTER, PC 来进行寄存器入栈和 LR 连接寄存器函数返回地址入栈完成后进行寄存器出栈和将 LR 的值即返回地址赋给 PC 返回遇到中断指 SWI(FIQ, IRQ)有所不同时(a)保存 CPU 当前状态 将 CPSR-特权模式下的 SPSR(B)设置当前模式下 CPRS 的相应的位 比如进 FIQ 模式禁止 FIQ 中断.(c)特权模式下独立连接寄存器 LR 保存中断返回地址(d)PC

9、 设置为当前中断向量地址跳转执行中断代码3. 中断返回时的工作(a)恢复当前处理器状态 SPSR-正常模式的 CPSR(b)恢复 PC,LR-当前 PC4.SWI 中断是本身执行指令产生 所以当产生中断时 PC 值不会更新为当前指令+8 地址处 所以 PC-4 为恢复中断地址。这里是要注意的5._swi 修饰用于 SWI 中断调用 中断不返回形式 void _swi(swi_num) swi_name(arguments);返回一个结果 R0 中 int _swi(swi_num) swi_name(arguments);可以用结构最多返回四个结果 r0-r3 struct type int

10、a, b, c, d; ;type(返回类型 ) _value_in_regs(返回多个结果的修饰符 ) _swi(swi_num) swi_name(arguments);然后开始 EXAMPLE建立 swi.h 文件存放结构和 swi 函数声明_swi(0) int test1(int,int); /两个参数返回 r0,地址偏移为 0struct mystruct /定义返回结构体int a;int b;int c;int d;_swi(1) _value_in_regs struct mystruct test2(int,int,int,int); /声明 1 自定义中断建立中断一及处理

11、文件 handle.sIMPORT c_handle_swi /引入二及中断 处理EXPORT SWI_Handle /到出中断处理函数 AREA SWIHandle,CODE,READONLYSWI_Handle STMFD SP!, r0-r3, r12, lr;保存 SPSR_svcmov r1, spMRS r0, spsr /保存 spsrSTMFD sp!, r0 /入栈 LDR r0, lr, #-4 BIC r0, r0, #0xFF000000/得到 24 立即数放到 R0 中BL c_handle_swi /二及调用 LDMFD SP!, r0MSR spsr_cf, r0

12、LDMFD SP!, r0-r3, r12, pcEND建立 lib.c 文件提供中断函数处理代码 void c_handle_swi( int swi_num, int *regs )switch(swi_num)case 0: /_swi(0)regs0 = regs0*regs1;break;case 1: /_swi(1)int x, y, z, p;x = regs0;y = regs1;z = regs2;p = regs3; regs0 = x + y + z + p;regs1 = x + y - z - p;regs2 = x*y + z*p;regs3 = (x + y)*

13、(z + p); default:break;提供主处理函数 #include #include “swi.h“unsigned *swi_vec = (unsigned*) 0x08;extern void SWI_Handle(void);unsigned Install_Handler( unsigned routine, unsigned *vector)unsigned vec, old_vec;vec = ( routine - (unsigned)vector - 8)2;if(vecvec = 0xea000000 | vec;old_vec = *vector;*vector = vec;return old_vec; int main()int result1;struct mytype res_3;Install_Handler( (unsigned) SWI_Handle, swi_vec ); /加载信息 result1 = test1( 2, 4 ); /中断一res_3 = test2( 12, 4, 3, 1 ); /中断二 通过 watch 观察结果 return 0;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 经营企划

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报