2011-12-21 99 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