ADI公司的dsp开发工具VISUALDSP++ 一段关于宏定义的问题
typedef void (*ex_handler_fn)(int, int, int);
#define EX_HANDLER(KIND,NAME) \
_Pragma(#KIND) \
void NAME ( int _r0x, int _r1x, int _r2x )
#define EX_HANDLER_PROTO(KIND, NAME) EX_HANDLER(KIND, NAME)
#define EX_INTERRUPT_HANDLER(NAME)EX_HANDLER(interrupt,NAME)
#define EX_EXCEPTION_HANDLER(NAME)EX_HANDLER(exception,NAME)
#define EX_NMI_HANDLER(NAME)EX_HANDLER(nmi,NAME)
#define EX_REENTRANT_HANDLER(NAME) \
_Pragma( "interrupt_reentrant ") \
EX_HANDLER(interrupt,NAME)
看不懂,谢谢了
[解决办法]
你哪里看不懂啊?
碰巧,我对ADI的环境比较熟悉。如果你在芯片上或VISUAL DSP++上有问题可以提问。
实际上,EX_INTERRUPT_HANDLER(myisr)就相当于:
#pragma interrupt
void myisr(int _r0x, int _r1x, int _r2x)
因为:_Pragma( "expr ")相当于:
#pragma interrupt
上面,表示将myisr作为中断服务程序。因此程序入口处,编译器会增加额外的上下文保护。
如果你用了EX_REENTRANT_HANDLER,说明你说定义的中断服务例程将是可重入的。即在入口处会将RETI压栈,使IPEND4清0,并且允许可屏蔽中断,而且同时允许与该中断服务例程所处优先级相同的中断优先级触发并打断当前的执行,即打断后从该入口重新执行新的中断服务。