打印
[开发工具]

Atmel Studio 7.0延时参数问题

[复制链接]
1090|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
stormwind123|  楼主 | 2025-3-8 13:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

Atmel Studio 7.0延时参数问题 [复制链接]
#include
#define F_CPU 8000000UL
#include
double a=500;
int main(void)
{
_delay_ms(a);
while (1)
    {
     }
}

用Atmel Studio 7.0编译这段程序编译通不过,报错
__builtin_avr_delay_cycles expects a compile time integer constant

但是把double a=500;移到main函数内就可以编译通过

这个是什么原因,希望哪位高手解析一下。

使用特权

评论回复
沙发
捉虫天师| | 2025-3-21 16:20 | 只看该作者
_delay_ms()的要求:

_delay_ms()是AVR Libc提供的宏,用于生成精确的延时。

它需要编译时已知的常量参数,以便在编译时计算出准确的时钟周期数。

double a=500;的问题:

当a定义为全局变量时,编译器无法确定a的值是否为常量,因此报错。

将a移到main函数内,编译器可以推断a是一个常量(因为它在函数内被直接赋值),从而通过编译。

使用特权

评论回复
板凳
捉虫天师| | 2025-3-21 16:21 | 只看该作者
也就是这个延时函数的参数只能是常量,不可以是变量。

使用特权

评论回复
地板
捉虫天师| | 2025-3-21 16:21 | 只看该作者
如果需要动态延时,可以使用循环或其他方法实现,但精度会降低:
for (volatile int i = 0; i < a; i++) {
    _delay_ms(1);
}

使用特权

评论回复
5
g36xcv| | 2025-3-27 15:31 | 只看该作者
你的问题出在 _delay_ms(a); 这个函数的参数 必须是编译时常量,而 double a=500; 在 全局作用域 下定义时,不是编译时常量,导致编译失败。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

492

主题

2887

帖子

3

粉丝