嵌入式 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()
和一个常量参数放在循环中,在确定参数时考虑循环开销。
我在调用 __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()
和一个常量参数放在循环中,在确定参数时考虑循环开销。