2014-07-08 40 views
0

我有兩種模式需要在滑動開關產生的中斷之間切換。最初我讀取當前位置並選擇模式/功能。當開關的位置改變時,我想在兩個右邊之間切換。我有一箇中斷髮生在兩邊(每當位置改變)。但是,由於兩個函數都在while循環中連續運行,所以我不能只在中斷中調用它們。基本上,我有這樣的事情:在帶有中斷的模式之間切換

interrupt() 
{ 
//not sure how to switch between modes here 
} 

main() 
{ 
    //choose mode on startup 
    if (switch_HIGH) 
    modeA(); 
    else 
    modeB(); 
} 

modeA() 
{ 
    while(1) 
    { 
     //do something 
    } 
} 

modeB() 
{ 
    while(1) 
    { 
     //do something 
    } 
} 

我不知道這是否是一個好主意,只留下一個功能,它在哪裏,只是轉移到別的東西,但我想不出任何其他辦法可以做到它。如果有人能告訴我我該如何解決這個問題,我會非常感激。 我使用的語言是C,該平臺是Altera DE1開發板上的NIOS系統。

回答

0

對此使用中斷似乎很無意義;只需輪詢每個循環中的輸入並調用正確的功能就如同您所做的那樣更簡單。

UPDATE:我只是重新定義了你的代碼沒有循環,所以上面有點難以理解,當然。

我的意思是,你可以組織你的程序是這樣的:

int main(void) 
{ 
    initialize_hardware(); 
    while(1) 
    { 
    if(switch_HIGH) 
     modeA(); 
    else 
     modeB(); 
    } 
} 

這使得CPU進入無限循環周圍,並在每次迭代它會檢查開關,並調用取決於無論是modeA()modeB()當前模式。

除了增加更多的複雜性外,添加中斷只會增加你的收益。

也就是說,我要做的是使用函數指針來指示當前模式,並根據開關的狀態更改中斷內部的函數指針值。然後在主循環中調用指向函數。

請記得正確地初始化該功能,因爲當設備退出復位狀態時,您可能不會得到中斷。這是這個解決方案的另一個說法;複雜度比僅在每次迭代中檢查交換機大得多。

+0

感謝您的回覆。投票是我最初的工作。問題是我調用一個子函數來讀取需要幾秒鐘的文件。那麼我將不得不在該功能中進行輪詢?這被認爲是不好的編程習慣?你所說的話是完全合理的。 – Ammar

+0

@Ammar我添加了一些代碼來說明我的意思是你可以組織你的程序。如果例如'modeB()'需要幾秒鐘的運行時間,如果在交換機忙時切換到'modeA()',你仍然會進入'modeA()。如果你的意思是它應該*停止*當前模式,如果在程序繁忙時切換開關,那麼中斷開始變得更有意義......當你反問你的問題時很難知道。 :) – unwind

+0

對不起......可能我應該更清楚這一點。基本上,modeA不斷從攝像頭獲取輸入並運行算法。這比從SD卡獲取圖像輸入的模式B快得多。讀取圖像的功能是降低圖像速度,逐行讀取圖像數據。如果我在每一行中對該函數內的開關位置進行輪詢,我可以快速退出並可能取得理想的結果。如果開關位置改變了,我想停止當前模式,然後轉到另一個模式。 – Ammar

0

如何將兩個函數調用爲線程。中斷函數可以終止活動線程並啓動另一個線程。僞代碼:

thread threada,threadb; 
flag a=0; 
interrupt() 
{ 
    if(a==0) 
    { 
     thread_kill(threada); 
     threadb=thread_create(modeB); 
     a=1; 

    } 
    else 
    { 
     thread_kill(threadb); 
     threada=thread_create(modeA); 
     a=0; 

    } 

} 

main() 
{ 
    thread_create(threada); 
    a=1; 
} 

modeA() 
{ 
    while(1) 
    { 
     //do something 
    } 
} 

modeB() 
{ 
    while(1) 
    { 
     //do something 
    } 
} 

與其殺死線程,您可以使用某種同步的優雅關閉機制。

+0

這實際上是一個好主意,但我不完全確定如何在我使用的硬件平臺上實現它。我決定在某些地方使用輪詢從一種模式快速返回並轉到另一個模式。感謝您的建議,但。我沒有足夠的代表upvote或我會:( – Ammar

相關問題