y296144646q 发表于 2009-10-24 17:25:28

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

请教高手啦
我下拉周立功的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,
      MOVS PC,LR
SwiFunction
      DCDIRQDisable
      DCDIRQEnable
      DCDFIQDisable
      DCDFIQEnable
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了呢实在不懂不懂他的执行过程

yangsen 发表于 2009-10-24 17:37:27

SwiFunction的标号下面完成的程序散转,你要在SoftwareInterrupt 入口处检查swi的中断号,并将SwiFunction的地址赋值给R0。你贴的这个程序一SWI中断应该会死循环了。应该是你没有找对地方

y296144646q 发表于 2009-10-24 18:12:40

啊我打错了去掉B       SoftwareInterrupt
我想问的是程序执行到IRQEnable(); 时就去找 #define IRQEnable() SwiHandle1(1) 在下一步找__swi(0x00) void SwiHandle1(int Handle); 那以后咋走啊 这函数干啥的啊我找了好多资料没能明白

32464295 发表于 2010-1-25 09:49:29

我也不明白
#define IRQEnable() SwiHandle1(1)
IRQEnable();
__swi(0x00) void SwiHandle1(int Handle);

他们是怎么关联的

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

blueflag 发表于 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

yilichen 发表于 2010-6-22 17:35:06

明白。谢谢。虽然是旧贴,还是要回复一下的。

yuanchunjian 发表于 2010-12-14 01:29:58

__swi(0x00) void SwiHandle1(int Handle);
这里(0x00)功能号并没有起作用,起作用的是函数的参数,实际上把指令中的24位功能号丢掉了。所以你可以写任意值,只要合法。个人理解哈

winet 发表于 2011-8-17 14:23:16

我也搞不清楚,软中断到底有什么作用。一般是怎样用的。
#define IRQDisable() SwiHandle1(0)
#define IRQEnable() SwiHandle1(1)
#define FIQDisable() SwiHandle1(2)
#define FIQEnable() SwiHandle1(3)
一般默认里面就是这四个函数。。在主程序中感觉调用跟没调用一样的。搞不清什么作用。希望高人解答下,

jjj2012 发表于 2012-5-31 15:53:08

上面程序修改的添加:在开始的位置NoInt EQU 0x80后边添加一行代码 NoFIQ EQU 0X40才可以编译通过,不然会提示没有声明
页: [1]
查看完整版本: 请教高手啦 __swi(0x00) void SwiHandle1(int Handle);