内嵌C语言-传递给带有const形参的函数的volatile和/或变量导致错误



我在__delay_cycles被调用的那一行得到这个错误。#664 expected an integer constant C/C++ Problem

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

这段代码不实用,但演示了我的问题。我尝试启动a有或没有volatile -相同的错误。我试着把它类型转换到函数中,没有运气。

代码:

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()放入循环中,在确定参数时考虑循环开销。

最新更新