通过中断在模式之间切换

时间:2014-07-08 08:38:47

标签: c 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系统。

2 个答案:

答案 0 :(得分:0)

对此使用中断似乎毫无意义;只是轮询每个循环上的输入,并且正如你所做的那样调用正确的函数,这简单得多。

UPDATE :我只是重新使用了你的代码没有循环,所以上面的内容当然有点难以理解。

我的意思是你可以像这样构建你的程序:

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

这使得CPU在无限循环中四处走动,并且在每次迭代时它都会检查交换机并根据当前模式调用modeA()modeB()

除了增加更多复杂性之外,添加中断不会带来任何好处。

那就是说,我要做的是使用函数指针来指示当前模式,并根据开关的状态更改函数指针在中断内的值。然后在主循环中调用指向函数。

请记住正确初始化该功能,因为当设备退出复位时,您可能不会收到中断。这是反对这个解决方案的另一个论点;复杂性远远大于每次迭代时检查开关。

答案 1 :(得分: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
    }
}

您可以使用某种同步来实现优雅的关闭机制,而不是杀死该线程。