我有两种模式可以在滑动开关产生的中断之间切换。最初我读取当前位置并选择模式/功能。我想在开关位置改变时在两者之间切换。我有一个中断发生在两个边缘(每当位置改变)。但是由于两个函数在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 :(得分: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
}
}
您可以使用某种同步来实现优雅的关闭机制,而不是杀死该线程。