我写了一个C6424时间C语言的中断服务子程序,一切正常。但是将其改成汇编,感觉有问题!
C语言如下面:这个是运行正常代码.
interrupt void TIM10us_int4(void) //interrupt4(void)
{ OSTimeTick++;
EDMA3CC_ESR = BitChnL; //设置手动事件//
}
接下来我屏蔽C语言中该函数,新建了一个.asm后缀的汇编文件:
.ref _OSTimeTick.ref _BitChnL
global _TIM10us_int4
;===========================================
;中断汇编,;=========================================== .sect ".text" ;.text
_TIM10us_int4:
LDW .D2 *+B14(_OSTimeTick),B1
NOP 4
ADD .L2 B1,1,B1
STW .D2 B1,*+B14(_OSTimeTick)
MVKL .S1 0x01C01010, A0 ;写EDMA3CC_ESR寄存器
MVKH .S1 0x01C01010, A0
LDW .D2 *+B14(_BitChnL),B2
NOP 4
ZERO .D2 B1
MVK .S2 1,B1
STW .D1T2 B2,*A0[0]
B .S2 IRP
NOP 5
请教:我这个中断子程序汇编,感觉有点像调用函数,是不是有问题呀?开头应该怎么写呢?请教????
Tony Tang:
在原C函数的时候加-K 选项,编译保存中间产生的汇编文件,看一下原来C ISR对应产生的汇编就知道了。
上面没有任何寄存器保护的过程,自然不对了。
dong wei1:
回复 Tony Tang:
我是想咨询的是:C语言 interrupt void TIM10us_int4(void) 函数名称,
是不是interrupt在汇编中也有对应的啥子指令??
你说用-K,我用的是反汇编看汇编代码,也没看见啥子异常代码。
ISR前动作堆栈处理是做了的。要不C语言的中断就不对了。
我在另一个文件有处理,C语言写的中断ISR就正确的:
.global _TIM10us_int4
VEC_ENTRY .macro addr
STW B0,*–B15 MVKL addr,B0 MVKH addr,B0 B B0 LDW *B15++,B0 NOP 2 NOP NOP .endm
_vec_dummy: B B3 NOP 5
.sect ".vecs" .align 1024
_vector4: VEC_ENTRY _TIM10us_int4 ;Interrupt4 ISR
dong wei1:
回复 Tony Tang:
代码没有问题。自己写了一个IO口电平变化的汇编加到,汇编ISR代码中,发现中断方波正常的。。
不过还是需要,谢谢你的耐心回答!!