嵌入式 C - volatile and/or 变量传递给带有 const 参数的函数会导致错误

embedded C - volatile and/or variable passed to a function with const parameter causes error

我在调用 __delay_cycles 的行收到此错误。 #664 expected an integer constant C/C++ Problem

函数的参数:__delay_cycles(unsigned long cycles);

这段代码不实用,但说明了我的问题。 我尝试在有或没有 volatile 的情况下启动 a - 同样的错误。 我尝试将其类型转换为函数,但没有成功。

代码:

unsigned long a = 100;

void main() {
    Pin16_SetAsOutput();
    while(1) {
        a++;
        Pin16_SetHigh();
        __delay_cycles(a);

        Pin16_SetLow();
        __delay_cycles(a);
    }
}

查看文档 - __delay_cycles 的参数必须是编译时常量,不能传入运行时计算的值;因此投诉。

这不是您可以强制工具忽略的任意迂腐限制,之所以这样做是因为 __delay_cycles 的实现方式使得其他方式无法做到。编译器生成的实际代码取决于您传入的值,因此必须在编译时知道该值。编译器会发出一定数量的指令,可能包括硬连线的固定长度循环,这些指令恰好需要您要求执行的周期数。

如果你说 const unsigned long a = 100; 并去掉 a++,就可以了。如果你想要一个可变长度的延迟,你需要一个替代的方法来做到这一点,比如把一个 __delay_cycles() 和一个常量参数放在循环中,在确定参数时考虑循环开销。