假设我在C中有两个函数,a()
和b()
。假设我有两个对应于两个函数的中断。第一个中断应开始运行function a()
,如果b()
在运行过程中被中断,则应停止其运行。类似地,第二个中断对函数b()
执行相同的操作。
如果我当前在a()
中运行,并且触发了b()
的中断。如何在中断处理程序完成后启动b()
并阻止a()
完成?
守则内容如下:
int main(void)
{
Init();
while (true)
{
if (run_A)
{
a();
run_A = false;
}
if (run_B)
{
b();
run_B = false;
}
}
void Handler(void)
{
IntClear(interruptMask);
if (INTERRUPT_FOR_A)
{
run_A = true;
}
if (INTERRUPT_FOR_B)
{
run_B = true;
}
}
发布于 2019-05-20 18:36:19
总体而言,笼统地谈论这一点并不是很有意义。这取决于您的要求以及生成中断的硬件类型。
你不能/不应该只是在执行过程中停止一个函数。要做到这一点,最好的方法是保持函数较小,让当前函数完成,或者让函数重复轮询一个标志变量。
一种更具侵入性但更简单的方法是简单地关闭不需要的中断,但这可能会导致数据丢失。根据中断的性质,这可能是正常的,也可能不是。
当然,还有一些不好的方法,用汇编程序或longjmp手动设置PC,但这是非常糟糕的做法,几乎可以肯定是任何问题的错误解决方案。
发布于 2019-05-21 21:33:45
这就是在旧的UNIX(tm)中设计的setjmp(3)
/longjmp(3)
函数所解决的那种问题。在进入想要中断的函数之前,您需要调用setjmp(3)
,以防出现中断(您必须确保中断是在要中断的函数的上下文中处理的),然后调用longjmp(3)
并在调用点恢复堆栈。
发布于 2019-05-24 03:44:56
听起来你正在寻找一个类似于协程的特性。虽然在C中不直接支持,但你也许能够实现一个足够好的版本来满足你的需求。如上所述,这可能会涉及setjmp/longjmp或令人费解的"Duff's Device“,如果你想用便携C实现这一点的话。
https://stackoverflow.com/questions/56218896
复制相似问题