首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从中断处理程序停止当前正在运行的函数

从中断处理程序停止当前正在运行的函数
EN

Stack Overflow用户
提问于 2019-05-20 18:21:38
回答 3查看 852关注 0票数 3

假设我在C中有两个函数,a()b()。假设我有两个对应于两个函数的中断。第一个中断应开始运行function a(),如果b()在运行过程中被中断,则应停止其运行。类似地,第二个中断对函数b()执行相同的操作。

如果我当前在a()中运行,并且触发了b()的中断。如何在中断处理程序完成后启动b()并阻止a()完成?

守则内容如下:

代码语言:javascript
复制
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;
    }
}
EN

回答 3

Stack Overflow用户

发布于 2019-05-20 18:36:19

总体而言,笼统地谈论这一点并不是很有意义。这取决于您的要求以及生成中断的硬件类型。

你不能/不应该只是在执行过程中停止一个函数。要做到这一点,最好的方法是保持函数较小,让当前函数完成,或者让函数重复轮询一个标志变量。

一种更具侵入性但更简单的方法是简单地关闭不需要的中断,但这可能会导致数据丢失。根据中断的性质,这可能是正常的,也可能不是。

当然,还有一些不好的方法,用汇编程序或longjmp手动设置PC,但这是非常糟糕的做法,几乎可以肯定是任何问题的错误解决方案。

票数 2
EN

Stack Overflow用户

发布于 2019-05-21 21:33:45

这就是在旧的UNIX(tm)中设计的setjmp(3)/longjmp(3)函数所解决的那种问题。在进入想要中断的函数之前,您需要调用setjmp(3),以防出现中断(您必须确保中断是在要中断的函数的上下文中处理的),然后调用longjmp(3)并在调用点恢复堆栈。

票数 0
EN

Stack Overflow用户

发布于 2019-05-24 03:44:56

听起来你正在寻找一个类似于协程的特性。虽然在C中不直接支持,但你也许能够实现一个足够好的版本来满足你的需求。如上所述,这可能会涉及setjmp/longjmp或令人费解的"Duff's Device“,如果你想用便携C实现这一点的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56218896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档