请教高手啦 __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了呢实在不懂不懂他的执行过程 SwiFunction的标号下面完成的程序散转,你要在SoftwareInterrupt 入口处检查swi的中断号,并将SwiFunction的地址赋值给R0。你贴的这个程序一SWI中断应该会死循环了。应该是你没有找对地方 啊我打错了去掉B SoftwareInterrupt
我想问的是程序执行到IRQEnable(); 时就去找 #define IRQEnable() SwiHandle1(1) 在下一步找__swi(0x00) void SwiHandle1(int Handle); 那以后咋走啊 这函数干啥的啊我找了好多资料没能明白 我也不明白
#define IRQEnable() SwiHandle1(1)
IRQEnable();
__swi(0x00) void SwiHandle1(int Handle);
他们是怎么关联的
高手帮我们解决一下吧呵呵 __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 明白。谢谢。虽然是旧贴,还是要回复一下的。 __swi(0x00) void SwiHandle1(int Handle);
这里(0x00)功能号并没有起作用,起作用的是函数的参数,实际上把指令中的24位功能号丢掉了。所以你可以写任意值,只要合法。个人理解哈 我也搞不清楚,软中断到底有什么作用。一般是怎样用的。
#define IRQDisable() SwiHandle1(0)
#define IRQEnable() SwiHandle1(1)
#define FIQDisable() SwiHandle1(2)
#define FIQEnable() SwiHandle1(3)
一般默认里面就是这四个函数。。在主程序中感觉调用跟没调用一样的。搞不清什么作用。希望高人解答下, 上面程序修改的添加:在开始的位置NoInt EQU 0x80后边添加一行代码 NoFIQ EQU 0X40才可以编译通过,不然会提示没有声明
页:
[1]