ATMEGA168A-F_CPU警告

ATMEGA168A-F_CPU警告,c,avr,atmega,C,Avr,Atmega,为了使ATMEGA168A闪烁一个小led,我编写了以下代码: #include <avr/io.h> #include <util/delay.h> #define F_CPU 1000000UL int main(void) { DDRB = 0b00000010; PORTB = 0b00000000; while(1) { PORTB ^= 1 << 1; _delay_ms(100

为了使ATMEGA168A闪烁一个小led,我编写了以下代码:

#include <avr/io.h>
#include <util/delay.h>

#define F_CPU 1000000UL

int main(void)
{
    DDRB = 0b00000010;
    PORTB = 0b00000000;

    while(1)
    {
        PORTB ^= 1 << 1;
        _delay_ms(1000);
    }
}
#包括
#包括
#定义F_CPU 1000000UL
内部主(空)
{
DDRB=0b00000010;
PORTB=0b00000000;
而(1)
{

PORTB^=1在包含之前,您需要定义
F_CPU
。您可以在编译时在命令行上执行此操作,或者将其放入源代码中。您定义此符号是为了让构建系统知道特定CPU的运行速度(即,您不能以这种方式更改实际速度)


有关讨论,请参见

宏定义的范围是从其
\define
指令到源文件的结尾或相应的
\undef

F_CPU
的值在
util/delay.h
头中进行测试。但是当该测试发生时,您的
#define F_CPU
尚未处理


您可以将其移动到
#include
之前,也可以使用编译器选项定义该宏。后者将是我的选择。然后您只需更改生成中的一项(生成文件、项目设置等)。

在(1)时决不使用
除了私人实验之外,任何地方的代码都会在某一点上死锁。如果你只做业余项目,但不习惯,这没关系!据我所知,AVR总是使用循环法…@Specializet不,不会。代码很好。@不,是的,它会。每个无限循环都会通过设计产生死锁-有时在中断期间x86系统上的中断,有时是在意外的IO状态和诸如此类的情况下。无限循环是蓝屏、死锁和软件崩溃的主要原因,即使是微控制器也是如此,但由于许多原因,这种情况并不普遍。@Specializet No.在许多情况下,永远循环是可以的。不是所有情况,也不是所有情况,你都可以创建死锁ks,但这不是因为一段时间(1),并且这段代码中没有死锁的可能。我在包含之前就做了,但仍然得到了警告!
Warning     #warning "F_CPU not defined for <util/delay.h>"
#ifndef F_CPU
/* prevent compiler error by supplying a default */
# warning "F_CPU not defined for <util/delay.h>"
# define F_CPU 1000000UL
#endif