第二十六篇 SWI软件中断

上传人:pu****.1 文档编号:431548028 上传时间:2023-02-25 格式:DOCX 页数:7 大小:235.42KB
返回 下载 相关 举报
第二十六篇 SWI软件中断_第1页
第1页 / 共7页
第二十六篇 SWI软件中断_第2页
第2页 / 共7页
第二十六篇 SWI软件中断_第3页
第3页 / 共7页
第二十六篇 SWI软件中断_第4页
第4页 / 共7页
第二十六篇 SWI软件中断_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《第二十六篇 SWI软件中断》由会员分享,可在线阅读,更多相关《第二十六篇 SWI软件中断(7页珍藏版)》请在金锄头文库上搜索。

1、第二十六篇 SWI 软件中断1.SWI 修改 CPSR前面学中断的时候曾经说过,如果CPSR得I位为1,则中断被禁止,如果CPSR 得F位为1,则快速中断被禁止,还好利用KEIL的启动代码进入main函数后, CPSR的I和F都为0。但是有的启动代码不这样,或者我们就是要去修改CPSR该怎么办。进入main函数中,由于处于用户模式下,CPSR是不允许修改的,只能利用SWI 来解决这个问题。运行指令SWI后,系统进入管理模式,这时候就有修改CPSR和SPSR的特权了, 注意我们要修改的是SPSR而不是CPSR,这是因为:进入管理模式后,CPSR的值 被系统自动拷贝到管理模式的SPSR (即SPS

2、R_svc),离开管理模式后,我们会用 SPSR_svc去还原CPSR,所以对CPSR的修改时无效的(当然我们可以修改CPSR 而不去使它还原,不过这样有悖原则),如果修改SPSR,然后还原给CPSR,这 样就行了。下面做个程序,在用户模式下使I=1,F=0:主函数这样写,很简单:/*/软件中断修改CPSR#includeint main(void)_asmSWI 0/内嵌汇编,调用SWI,这里立即数任意取while(1);/*然后在启动代码中写该SWI的例程 将 SWI_Handler B SWI_Handler 该为:SWI_HandlerMRS R0,SPSR ;SPSR的值为SWI之前

3、的CPSR的值,将其取出BIC R0,#0X40 ;F 位清零,允许 fiqORR R0,#0X80 ;I 位置一,禁止 irqMSR SPSR_C,R0 ;修改过的值给SPSR的c域仿真如下图:可见CPSR的I和F位被顺利修改STMFD SP!,R0-R12,LRMRS R0,SPSRTST R0,#0X20状态LDRNEH R0,LR,#-2BICNE R0,#0XFF00LDREQ R0,LR,#-4CMP R0,#2LDRLS LR,=OUTLDRLS PC,PC,R0,LSL#22.SWI 立即数作为参数使用上例中用的是SWI0,立即数为0,这个立即数可以设定为24位任意值,这个立

4、即数就会存在于这条指令之中,提取出这个立即数即可以实现不同功能的调用。 SWI 的立即数使用可以这样做:SWI_Handler;寄存器入栈;读取SPSR; 测试软件中断之前, CPU 是 Thumb 状态还是 ARM;如果是 Thumb 状态,读取该 SWI 指令;提取出 SWI 指令中的立即数;如果是 ARM 状态,读取该 SWI 指令BICEQ R0,R0,#0XFF000000 ;提取出 SWI 指令中的立即数; 立即数是否超出范围; 如果未超出范围,保存返回地址; 从地址向量表中选择相应的地址,进行跳转;如果超出范围,直接返回;地址向量表B OUTDCD fun0DCD fun1DCD

5、 fun2OUT LDMFD SP!,R0-R12,pc厂;寄存器出栈,LR复制到PC表示返回,“八” 表示用SPSR恢复CPSR主程序测试一下:/* /软件中断测试/测试SWI中的立即数功能/“SWI 0” 使 LEDO 闪烁,“SWI 1” 使 LED1 闪烁,“SWI 2” 使 LED2 闪烁#include#define LEDO 116#define LED1 117#define LED2 118int main(void)unsigned int i;IODIR=LEDO|LED1|LED2;/三个引脚作为输出用while(1)_asmSWI 1/内嵌汇编,调用SWI,立即数对应

6、灯的号for(i=O;i1OOOOO;i+);/延时void fun0()/“SWI 0” 使 LED0 闪烁if(IOSET&LEDO) IOCLR=LEDO;else IOSET=LEDO;void fun1()/“SWI 1” 使 LED1 闪烁if(IOSET&LED1) IOCLR=LED1;else IOSET=LED1;void fun2()/“SWI 2” 使 LED2 闪烁if(IOSET&LED2) IOCLR=LED2; else IOSET=LED2;/*仿真如下图:3T Bits 24 23 Bits 16 15 Bits 8 7 Bits 0 rvvTrrrr ri

7、 n i rrrrrrrr i i i iTi i iGeneral Purpose Input/Output (GPIO) - Slv InterfacePins: ItkFFFAFFFFiI 一 i ” , i r jmu 一 inii j JJ i n ii i . i .1 n11 , - 一 , r i jla&i 匚一一 ,r . j(1 j j i j J- n 1 t0x00000284E59F0088 LDRR0ffiflOxOaeS 511 1GPIOIODIR: |kM)D7fW0I0SET: MSDDDIOCLR:底丽丽丽IOPIN: :SFFFAFFFF|7F7ppp

8、F7pp |7pp|7i7rpr f7r7|7p|7T7|7F 片肓肛应信肓疗便rrrrrrrr厂广厂广厂广厂厂厂广厂厂厂厂厂广rrrrrrrr可见不同的立即数会使相应的灯闪烁3.R0 作为参数其实不光SWI立即数可以传递参数,R0也可以,使用C语言形式的软件中断时 (函数声明加_swi(立即数),参数被自动编译为R0,如果有两个参数,则被编译为RO、R1,以此类推主程序如下: /* /SWI 软件中断测试/测试用 RO 作为参数的调用功能/x=O 使 LEDO 闪烁, x=1 使 LED1 闪烁, x=2 使 LED2 闪烁 #include #define LEDO 116#define

9、LED1 117#define LED2 118/声明是软件中断例程(立即数固定为0), X被自动编译为R0,如果有两个参 数,则被编译为R0、R1,以此类推_swi(0) ruanjian(int x);int main(void)unsigned int i;IODIR=LED0|LED1|LED2; /输出功能while(1) ruanjian(2);/调用软件中断例程,参数默认用R0传递for(i=0;i100000;i+); /延时void fun0()/R0=0 使 LED0 闪烁if(IOSET&LED0) IOCLR=LED0; else IOSET=LED0;void fun

10、1()/R0=1 使 LED1 闪烁if(IOSET&LED1) IOCLR=LED1; else IOSET=LED1;void fun2()/R0=2 使 LED2 闪烁if(IOSET&LED2) IOCLR=LED2;else IOSET=LED2;SWI 的例程可以这样写:SWI_HandlerSTMFD SP!,R0-R12,LRCMP R0,#2LDRLS LR,=OUTLDRLS PC,PC,R0,LSL#2B OUTDCD fun0/*; 寄存器入栈; 立即数是否超出范围; 如果未超出范围,保存返回地址; 从地址向量表中选择相应的地址,进行跳转; 如果超出范围,直接返回; 地

11、址向量表DCD fun1DCD fun2OUT LDMFD SP!,R0-R12,pc厂;寄存器出栈,返回,用SPSR恢复CPSR仿真如下图:170x0000027E5900004 LDR0x00000273E310O8O1 TSTwhile1fun(2);用轶件中践劇趕.参数戟认用阴痔逞for (1=3; K200Q00; 1+ / ;隹圧IOSET: :brfHJCDODDPrrrrn-r rr-pppnrr 厂厂厂厂厂厂厂厂 rFFnrGeneral Purpose Input /Out piit (GPIO) - Slov InterfaceR0f R0r#0x0004R0r#0x00

12、010000GPIOIODIR: 1甌丽丽丽31 Bits 24 23 Bits 16 15 Bits 0rTTTTrrr 111 iTkkk rrTTrnrri i i i i i i i 11111 pi i i i i i i i i i厂厂厂厂厂厂厂厂厂厂厂厂厂厂厂厂n厂厂rrrr甘押* 1*甘押1#押唇疥# I 1*押*1*甘押*1* p押唇疥#押唇护 aosigned 1 nt i;IODIR=LZD0ILZD13LED2;- Bits 0iii ii i i rrrrrrrrr nrrrrrrr忧LR:阪丽丽丽 IOPIN: |fkFFFCFFFF Pins: |SfFFCFFFF注:x就是RO,编译器自动这样处理SWI立即数可以和R0等寄存器一起使用,比如:SWI立即数作为中断号,R0作 为子功能号

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号