搜索
bottom↓
回复: 8

请教高手啦 __swi(0x00) void SwiHandle1(int Handle);

[复制链接]

出0入0汤圆

发表于 2009-10-24 17:25:28 | 显示全部楼层 |阅读模式
请教高手啦  
我下拉周立功的ARM2100模版 然后在target.h中加了
  __swi(0x00) void SwiHandle1(int Handle);
#define IRQDisable() SwiHandle1(0)
#define IRQEnable() SwiHandle1(1)
#define FIQDisable() SwiHandle1(2)
#define FIQEnable() SwiHandle1(3)
在startup.s中
;软中断
SoftwareInterrupt
        B       SoftwareInterrupt (从这里开始改)
        CMP R0,#4
        LDRLO PC,[PC,R0,LSL#2]
        MOVS PC,LR
SwiFunction
        DCD  IRQDisable
        DCD  IRQEnable
        DCD  FIQDisable
        DCD  FIQEnable
IRQDisable
        MRS R0,SPSR
        ORR R0,R0,#NoInt
        MSR SPSR_c,R0
        MOVS PC,LR
IRQEnable
        MRS R0,SPSR
        BIC R0,R0,#NoInt
        MSR SPSR_c,R0
        MOVS PC,LR
FIQDisable
        MRS R0,SPSR
        ORR R0,R0,#NoFIQ
        MSR SPSR_c,R0
        MOVS PC,LR
FIQEnable
        MRS R0,SPSR
        BIC R0,R0,#NoFIQ
        MSR SPSR_c,R0
        MOVS PC,LR    (改写到这里结束)
;取指令中止
PrefetchAbort
        B       PrefetchAbort
其余没变
然后在main.c中用了IRQEnable();
我想请问下程序到了IRQEnable();这一步然后调用函数 怎么就使能IRQ了呢  实在不懂  不懂他的执行过程

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-10-24 17:37:27 | 显示全部楼层
SwiFunction的标号下面完成的程序散转,你要在SoftwareInterrupt 入口处检查swi的中断号,并将SwiFunction的地址赋值给R0。你贴的这个程序一SWI中断应该会死循环了。应该是你没有找对地方

出0入0汤圆

 楼主| 发表于 2009-10-24 18:12:40 | 显示全部楼层
啊  我打错了  去掉B       SoftwareInterrupt
我想问的是程序执行到IRQEnable(); 时就去找 #define IRQEnable() SwiHandle1(1) 在下一步找__swi(0x00) void SwiHandle1(int Handle); 那以后咋走啊 这函数干啥的啊  我找了好多资料  没能明白

出0入0汤圆

发表于 2010-1-25 09:49:29 | 显示全部楼层
我也不明白  
#define IRQEnable() SwiHandle1(1)
IRQEnable();
__swi(0x00) void SwiHandle1(int Handle);

他们是怎么关联的

高手帮我们解决一下吧  呵呵

出0入0汤圆

发表于 2010-1-25 10:56:12 | 显示全部楼层
__swi是ADS编译器的关键字,用它做前缀可以声明一个软中断调用,格式为:
__swi(功能号)   返回值  名称 (参数列表)
功能号:即软中断指令中的24位立即数,软中断号
名  称:即调用软中断时用于描述软中断的函数名称
参  数:软中断函数的参数,根据ATPCS规则,如果软中断函数有不超过4个参数时,通过R0~R3传递,超过4个参数时用堆栈来传递。
—swi(0x00) void SwiHandle1(int Handle)。其中0x00为软中断功能号(软中断号);软中断函数名称为SwiHandle1;只有一个参数,则使用R0来传递;函数没有返回值。
紧接着这句代码的是定义了4个宏,分别表示禁能IRQ函数、使能IRQ函数、禁能FIQ函数、使能IFQ函数,其实调用的软中断函数是一样的,只是参数不同而已。例如在用户程序中调用“IRQEnable( );”时,处理器会产生软中断。
位于启动代码中的那些是软中断处理函数,当发生软中断时,PC被强制指向0x00000008,这个地址中存放的是软中断异常的处理函数的地址,所以程序会跳转至标号“SoftwareInterrupt ”处执行。SoftwareInterrupt 函数的功能是判断R0的值(R0的值为软中断函数传递过来的参数)是否小于4,如果小于4则跳转至标号“SwiFunction”执行,如果不是则函数返回。SwiFunction函数是一个散转函数,它的功能是根据R0的值跳转至对应的函数处执行,即如果参数为1,则函数会跳转至IRQEnable处执行,将IRQ中断使能。
你的代码好像有问题,B SoftwareInterrupt 会死循环了
还有不明白的请QQ184930560

出0入0汤圆

发表于 2010-6-22 17:35:06 | 显示全部楼层
明白。谢谢。虽然是旧贴,还是要回复一下的。

出0入0汤圆

发表于 2010-12-14 01:29:58 | 显示全部楼层
__swi(0x00) void SwiHandle1(int Handle);
这里(0x00)功能号并没有起作用,起作用的是函数的参数,实际上把指令中的24位功能号丢掉了。所以你可以写任意值,只要合法。个人理解哈

出0入0汤圆

发表于 2011-8-17 14:23:16 | 显示全部楼层
我也搞不清楚,软中断到底有什么作用。一般是怎样用的。
#define IRQDisable() SwiHandle1(0)
#define IRQEnable() SwiHandle1(1)
#define FIQDisable() SwiHandle1(2)
#define FIQEnable() SwiHandle1(3)
一般默认里面就是这四个函数。。在主程序中感觉调用跟没调用一样的。搞不清什么作用。希望高人解答下,

出0入0汤圆

发表于 2012-5-31 15:53:08 | 显示全部楼层
上面程序修改的添加:在开始的位置NoInt EQU 0x80  后边添加一行代码 NoFIQ EQU 0X40才可以编译通过,不然会提示没有声明
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表