首页 > 解决方案 > 使用中断或线程和全局变量进行优化

问题描述

我发现我在如何最好地编写超出正常代码流的函数之间的通信时遇到了一些困难。一个简单的例子是:

int a = 0;
volatile int v = 0;

void __attribute__((used)) interrupt() {
    a++;
    v++;
}

int main() {
    while(1) {
        // asm("nop");
        a--;
        v--;
        if (v > 10 && a > 10)
            break;
    }
    return 0;
}

a主 while 循环可以将变量优化为寄存器,因此从中断中看不到任何变化,这并不奇怪。如果变量是易失的,那么每次使用它时都需要从内存中重新读取或重写到内存中,这很烦人。在该技术中,跨线程的任何通信变量都需要是易失的。同步原语(甚至是注释掉的“nop”)解决了这个问题,因为它似乎具有创建编译器屏障的副作用。但是,如果我理解正确,这将意味着刷新 main 中使用的所有寄存器的整个状态,在这种情况下,将一些变量设置为 volatile 可能不那么苛刻。我目前使用这两种技术,但我希望我有一个更标准的方法来处理这个问题。

某个程序集的链接

标签: cmultithreadinginterruptvolatile

解决方案


a因此,您需要一种减少查找次数的方法。以下将其减少为一次循环:

volatile int a = 0;
volatile int v = 0;

void __attribute__((used)) interrupt() {
    a++;
    v++;
}

int main() {
    while(1) {
        int b = --a;
        --v;
        if (v > 10 && b > 10)
            break;
    }
    return 0;
}

没有什么能阻止您进行类似的检查。


推荐阅读