簡體   English   中英

中斷模式間切換

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM