2

我正在使用 Eclipse 和 Arduino 插件用 C 语言构建一个 Arduino 应用程序。在我的旧代码中,我使用了 pinMode 和 digitalWrite。但众所周知,这会占用更多空间。所以我现在正在使用端口操作重新构建我的代码。如果您不知道那是什么,可以在这里查看:http ://www.arduino.cc/en/Reference/PortManipulation

我会解释我做了什么。

哪里有 pinMode,我把它改成这样:DDRD = 0b11111111; 在哪里有 digitalWrite,我将其更改为 PORTD = 0b10000000; 您可以在下面的代码中看到它。

Eclipse 现在给我错误(用红线突出显示 DDRD 和 PORTD 字样)符号未解决 DDRD 和 PORTD,但程序正在构建和运行正常。我该如何解决这个问题?

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

int main()
{
    UCSR0B = 0;         // disconnect pins 0 and 1 from USART (Serial)
    DDRD = 0b11111111;  // all pins of port D as output

    for(;;)
    {
        PORTD = 0b10000000; // Pin 7 on
        _delay_ms(500);     // Wait
    }
}
4

2 回答 2

0

这些是编码对 SFR 位置的直接易失性访问的多级宏。

它们被单独定义在各种芯片特定的头文件之一中,当 avr/io.h 被告知您正在使用的特定 CPU 变体时,它将包括这些头文件。

通常这是通过-mmcuavr-gcc 的标志来完成的,例如

-mmcu=atmega328p

但是,如果 Eclipse 插件确实通过项目源代码尝试为您提供咨询错误,则将其转换为定义可能不够聪明(即使 gcc 很高兴,您也可以让 Eclipse 声明错误)。要解决这个问题,您可能需要在代码中或在 Eclipse 的某些配置中显式定义包含上方的 cpu 类型。例如:

#ifndef __AVR_ATmega328P__ 
#define __AVR_ATmega328P__ 
#endif
#include <avr/io.h>

请注意,如果您稍后更改处理器类型,这可能会导致问题!即使是这样,它也有点不确定,因为每个处理器都有两个潜在的名称。

于 2013-09-12T14:44:21.067 回答
0

我遇到了同样的问题。这就是在 Eclipse 中为我解决的问题。

从项目资源管理器中右键单击活动项目 > 索引 > 重建

于 2021-11-15T19:02:33.830 回答