[英]Switching between modes with an interrupt
我想通過滑動開關產生的中斷在兩種模式之間切換。 最初,我讀取當前位置並選擇一種模式/功能。 當開關的位置改變時,我想在兩者之間切換。 我有一個發生在兩個邊緣的中斷(無論何時更改位置)。 但是,由於兩個函數都在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系統。
為此使用中斷似乎毫無意義。 僅輪詢每個循環中的輸入,然后像執行操作一樣調用適當的函數要簡單得多。
更新 :我只是認為您的代碼沒有循環,所以上面的內容當然很難理解。
我的意思是,您可以像下面這樣來構造程序:
int main(void)
{
initialize_hardware();
while(1)
{
if(switch_HIGH)
modeA();
else
modeB();
}
}
這使得CPU進入無限循環各處,並且在每次迭代它檢查開關,並調用任一modeA()
或modeB()
根據當前模式。
除了增加更多的復雜性之外,添加中斷不會給您帶來任何好處。
就是說,我要做的是使用一個函數指針來指示當前模式,並根據開關的狀態在中斷中更改函數指針的值。 然后在主循環中只需調用指向函數即可。
請記住要正確初始化函數,因為當設備退出復位狀態時,您可能不會收到中斷。 這是反對該解決方案的另一個論點。 它的復雜性遠遠大於僅檢查每次迭代中的開關。
如何將兩個函數作為線程調用。 中斷功能可以殺死活動線程並啟動另一個線程。 偽代碼:
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
}
}
除了殺死線程之外,您還可以使用某種同步來擁有正常的關閉機制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.