2011-12-21 92 views
2

我可以在另一个中断向量中调用中断向量吗?在另一个中断向量中调用中断向量

例如,当我在做ep4inout中断向量的程序:

void ep4inout interrupt 0 
{ 
    . 
    . 
    . 
    Timer1 = 1; //call interrupt for timer 1 
    . 
    . 
    . 
} 

编辑

我的代码看起来大致是这样的。 Timer1 = 1表示设置了定时器1的中断请求。我在定时器1 ISR中的程序不起作用。在FX2LP手册中,定时器1的优先级高于端点缓冲区。我尝试将定时器1的优先级设置为高,并将端点4设置为低。仍然是同样的结果。 Im使用Keil uVision2作为我的IDE,而我的微控制器是赛普拉斯FX2LP(附加8051 - USB控制器)。

void ISR_Ep4inout(void) interrupt 0 
{ 
    . 
    . 
    . 
    Timer1Enable = 1; 
    Timer1 = 1; //call interrupt for timer 1 
    . 
    . 
    . 
} 

void TMR1_Vect(void) interrupt 2 //timer 1 interrupt 
{ 
. 
. 
. 
} 

void TMR1_Vect interrupt 0 //timer 1 interrupt 
{ 
    . 
    . 
    . 
} 

回答

0

如果这些函数是常规的C函数,编译器无法知道该函数是否被用作中断。是的,你可以调用这个函数。

如果像您的情况一样,您必须使用interrupt 0或任何其他方式(ISR,INTERRUPT)指示此类功能,您通常不能。
问题通常是用于终止函数的return指令(在汇编程序级别上):对于中断服务例程,编译器必须使用不同的返回指令。

您已经指出了“调用函数”的不同方法:我假设您的Timer1 = 1;将有效地设置定时器中断的中断请求位,从而导致中断服务程序的激活。这应该没有问题。但是,您需要检查处理器/编译器手册,了解首先处理哪个中断,以及ISR是否被中断。

顺便说一句,你可以提供更多的信息和细节。不是每个人都说“调用中断向量”,然后显示一个“变量”被设置为1。我假设你正在进入嵌入式开发;请指明诸如编译器和/或处理器之类的东西,因为它们比提供有用答案更重要。

+0

非常感谢您的回复。我使用Keil uVision 2和我的微控制器是赛普拉斯FX2LP。经过测试后,定时器1的ISR不会中断,我的程序根本不工作。定时器1表示定时器1的中断已被调用。顺便说一下,端点4的优先级是什么? – 2011-12-21 05:32:52

+2

@FranzMationg如果您编辑您的原始问题并在此添加此信息会更好。该网站旨在为您提供有用的信息,但对所有具有相同或类似问题的人都有用。此外,对于那些不太熟悉赛普拉斯USB控制器系列的人来说,说明该处理器是一个增强型8051实现会很有帮助。 – 2011-12-21 10:52:56