65.9K
CodeProject 正在变化。 阅读更多。
Home

Arduino 释放

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (19投票s)

2010 年 9 月 18 日

CPOL

8分钟阅读

viewsIcon

187874

downloadIcon

697

本文旨在为您提供更强大的工具,让您尽情释放创造力,而不受限于默认 IDE。

什么是 Arduino Thing?

直接来自 官方网站……

Arduino 是一个开源电子原型设计平台,基于灵活易用的硬件和软件。它面向艺术家、设计师、爱好者以及任何对创建交互式对象或环境感兴趣的人。

实际上 Arduino 是很多东西。在特定上下文中,它可能意味着以下任何一种……

  1. Arduino – 硬件平台(“开发板”)
  2. Arduino – WinAVR 之上的抽象库。WinAVR 是用于 Arduino 板上 AVR 微控制器的 GNU 工具链(编译器 + C 运行时库等)(“软件”)
  3. Arduino – “IDE”(我们正在使用 Arduino 19)

这是我使用的特定 Arduino 型号的图片(它被称为 Freeduino 串口开发板)。

http://www.freeduino.org/bf-analyze/images/freeduino_maxserial_500.jpg

图 1 Freeduino-serial 开发板(带 ATMega328)

给我看点有意思的

给你,但记得回来!

  1. Makezine Arduino 存档
  2. Electronics lab Arduino 存档

我手痒了,从哪里开始?

首先,您需要熟悉 Arduino 平台并玩转 Arduino IDE,您可以从 Arduino 网站免费下载。

作为一名专家级程序员,您很快就会意识到您的手更痒了,但 Arduino IDE 阻碍了您缓解这种痒意。您需要一套更强大的工具。我推荐使用 WinAVR + Arduino 库 + Eclipse 的组合,这正是我们在本文剩余部分将要探讨的内容。

所以,这篇文章又是关于什么的?

本文旨在为您,这位专家级程序员(几乎任何对专家的定义 ;)),提供更强大的工具,让您尽情释放创造力,而不受限于默认 IDE。

使用 Eclipse,您将拥有代码补全、更好的代码导航、语法高亮以及其他所有功能!

因此,从现在开始,我假设您已经熟悉了常规的 Arduino 开发。如果还没有,请继续并完成它(应该用不了多久),然后回来获取更好的体验,或者如果您不介意一点悬念,就继续前进。

指引我

好的,这是通往 Arduino 极乐世界的步骤……

  1. 下载 Eclipse(约 90 MB)。解压到 C:\Misc\Eclipse
  2. 下载 Arduino IDE。解压到 C:\Misc\arduino-0019
  3. 下载最新版本的 WinAVR。解压到 C:\Misc\WinAVR
  4. 下载 AVR Eclipse 插件并安装它(按照其网站上的说明操作)。

启动 Eclipse 并尝试一个示例程序进行初步测试……

  1. 启动 Eclipse

  2. 单击标签页上的“X”关闭欢迎页面,以显示实际的工作环境……

  3. 单击“文件->新建->C++ 项目”来创建一个新项目。选择“AVR Cross Target Static Library”项目类型,并将项目名称设置为 Arduino。我们现在将把 Arduino 源代码文件编译成一个静态库以供以后使用。最后单击完成。

  4. 使用 Windows Explorer 前往 C:\Misc\arduino-0019\hardware\arduino\cores\arduino,选择所有**代码**文件,并将它们拖到 Eclipse 中已打开的 Arduino 项目上。请注意,仅包含扩展名为 .c.cpp.h 的文件……

    sshot1.jpg

  5. 接下来在以下对话框中单击“确定”(接受默认的复制选项)……

  6. 现在通过右键单击项目并从上下文菜单中选择“构建”来构建项目。天哪,我们有 10 个构建错误……

  7. 但是别担心,我们很快就会修复它们。右键单击项目并选择“属性”,然后转到“C/C++ 构建 -> 设置 -> AVR 编译器”选项。单击“+”图标(在选择“目录”选项后)。

  8. 单击“工作区…”按钮,然后为“AVR 编译器”和“AVR C++ 编译器”各添加一次项目目录“${workspace_loc:/${ProjName}}”作为包含目录。

  9. 右键单击项目并选择“属性”,然后转到“AVR->目标硬件”,然后将 MCU 类型选项设置为您 Arduino 板上使用的微处理器及其附带的晶振频率。对我来说,分别是 ATmega328P 和 16,000,000。然后单击“确定”。

  10. 现在再次构建您的项目,这次构建应该会成功。虽然您可能会得到一堆警告(我这里有 21 个),但暂时忽略它们。

Das blinkenlights

  1. 现在是嵌入式系统世界的“Hello world”时刻了。像以前一样转到“文件->新建->C++ 项目”,但现在选择“AVR Cross Target Application”作为项目类型,并将项目名称设置为“BlinkenLights”。

  2. 右键单击 BlinkenLights 项目并选择“新建->文件”,将文件名设置为 Main.cpp,然后单击完成。

  3. 现在将以下 C++ 代码添加到 Main.cpp 中:
  4. #include "WProgram.h" //Include arduino headers
    
    ///CONSTANTS///
    //The onboard test LED is connected to pin number 13
    const int ledPin = 13;
    const int interval = 1000; //Milliseconds
    
    ///MAIN///
    int main()
    {
        //Initialize the Arduino library.
        //Not doing so will prevent the delay function
        //from working. Calling this functions is a must
        //for all arduino projects.
        init();
    
        //Initialize the serial port. This will be used
        //to send diagnostic information in this project.
        Serial.begin(9600);
    
        //Configure ledPin as an output
        pinMode(ledPin, OUTPUT);
    
        //Announce the start of program. Usually a
        //hyper-terminal is connected to the serial
        //port on the PC so this message can be seen
        //there
        Serial.println("Ready.");
    
        //Enter the infinite loop responsible for making
        //the microcontroller do the same thing over and
        //over again. (Almost every microcontroller has
        //such a loop)
        while(true)
        {
            //Turn on the LED
            digitalWrite(ledPin, HIGH);
            //Wait for half of "interval".
            //The LED remains ON during this time.
            delay(interval/2);
            //Turn off the LED
            digitalWrite(ledPin, LOW);
            //Wait for half of "interval".
            //The LED remains OFF during this time.
            delay(interval/2);
        }
    
        //Unreachable code but it's required by
        //the compiler
        return 0;
    }   
  5. 现在编译项目。哇,一堆错误!

  6. 好的,我们来修复它们。右键单击“BlinkenLights”项目并选择“属性”,然后转到“C/C++ 构建->设置->Avr 编译器->目录”选项,然后单击“+”图标。

  7. 然后在接下来的对话框中单击“工作区…”按钮,然后在更下一级的对话框中选择 Arduino->Debug。

  8. 最后您应该看到以下内容。在验证路径后单击“确定”。

  9. 对“C/C++ 构建->设置->Avr **C++** 编译器->目录”执行相同操作。
  10. 然后转到“C/C++ 构建->设置->Avr C++ 链接器->库”并设置以下选项。

  11. 再次编译 BlinkenLights 项目。

    好了,现在好多了,但我们还有一个错误要解决。这是一个链接器错误。链接器在这里抱怨它找不到名为 __cxa_pure_virtual 的函数的实现,尽管它在代码的其他部分被引用/使用了。嗯,我听到您说“这是谎言,函数名甚至不合我的口味,我为什么会使用它?!”好吧,我听到了,但事实是您才刚刚开始,您还没有看到幕后使用的所有代码。

    可以说,该函数由 C++ 运行时使用,用于决定当有人直接调用纯虚函数时需要做什么。正如您在处理 C++ 时会记住的,纯虚函数不能在不提供派生类实现的情况下直接调用。嗯,就此而言,具有纯虚函数的类根本无法实例化,但 C++ 运行时喜欢为任何和所有可能性做好准备。

    高级编译器会从该函数抛出异常来指示非法操作,但由于我们在 WinAVR 平台上没有这些,我们所能做的就是通过进入一个永无止境的循环来防止进一步的损害(假设程序失控了,因为它通过直接调用纯虚函数做到了不可能的事情!)。
    注意:这只需要为调试构建完成。该函数显然不用于 Arduino 的发布构建。调试构建被设置为快速失败,以便故障点尽可能接近实际问题所在的位置。

    所以,以下是消除上述错误的方法……

  12. 向 Arduino 项目添加一个新的 .c 文件(请注意,应该是 .c 而不是 .cpp)。称它为 missing.c,并将以下代码粘贴进去,然后重新构建两个项目。错误应该会消失。请注意,您需要先构建 Arduino,然后才能构建 BlinkenLights。
    void __cxa_pure_virtual()
    {
        while(1);
    }
  13. 切换到“控制台”窗格,您可以看到对生成的 .elf 文件运行 avr-size 命令的结果……

    但它并不好看。一个简单的 LED 闪烁程序占用了整个可用程序内存的约 62%。但不要惊慌,我们处于调试构建中,这种膨胀是正常的。切换到发布构建时,您会得到更好的结果。

切换到发布构建

  1. 右键单击项目并选择“构建配置->设置活动->2 Release”。对所有项目执行此操作。另外,如果您找到一次性为所有项目执行此操作的方法,请告诉我。
    注意:为了让发布构建能够编译,您需要为发布构建重新指定所有设置,就像为调试构建所做的那样。

    嗯,好多了,但仍然不够好,18% 的 BlinkenLights 仍然太多。

过早优化并非万恶之源?

  1. 以下是我们将“更好”提升到“令人印象深刻”的方法。以下内容将确保您只为实际使用的函数和数据部分付费。将以下附加标志添加到所有项目中的 C 和 C++ 编译器。
    -ffunction-sections -fdata-sections 

    将以下标志添加到所有项目的链接器选项中。

    -Wl,-gc-sections  

  2. 重新构建它们(按正确的顺序,先 Arduino,后 BlinkenLights)。

    多么令人欣慰!

将程序上传到 Arduino

现在是时候将您在 Eclipse 中构建的第一个 Arduino 程序上传到开发板了。

  1. 右键单击 BlinkenLights 项目并选择“属性”。转到 AVRDude 页面并单击“新建”。

  2. 按如下方式填写表单:
    • 配置名称: Arduino
    • 编程器硬件: Arduino
    • 覆盖默认端口: \\.\COM3。将 COM3 替换为 Arduino 硬件连接到的任何端口。
    • 覆盖默认波特率: 19200。将 19200 替换为您的开发板制造商/为您的开发板上传 Arduino 引导加载程序的人指定的任何波特率。

  3. 在 AVRDude 设置中选择 Arduino 作为编程器,然后单击“确定”。

  4. 单击 AVR 工具栏按钮将您的程序上传到开发板。

    您应该会在控制台窗口中看到类似以下内容……

    Launching C:\misc\WinAVR\bin\avrdude -pm328p 
        carduino "-P\\.\COM3" -b19200 -Uflash:w:BlinkenLights.hex:a 
    Output:
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.02s
    
    avrdude: Device signature = 0x1e950f
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: reading input file "BlinkenLights.hex"
    avrdude: input file BlinkenLights.hex auto detected as Intel Hex
    avrdude: writing flash (2828 bytes):
    
    Writing | ################################################## | 100% 2.16s
    
    avrdude: 2828 bytes of flash written
    avrdude: verifying flash memory against BlinkenLights.hex:
    avrdude: load data flash data from input file BlinkenLights.hex:
    avrdude: input file BlinkenLights.hex auto detected as Intel Hex
    avrdude: input file BlinkenLights.hex contains 2828 bytes
    avrdude: reading on-chip flash data:
    
    Reading | ################################################## | 100% 2.14s
    
    avrdude: verifying ...
    avrdude: 2828 bytes of flash verified
    
    avrdude done.  Thank you.
  5. 如果一切顺利,板载测试 LED(通常为红色)应该会开始以大约每秒 1 次的速度闪烁。恭喜!

结论

我们终于看到了如何使用 Eclipse 进行 AVR 开发。但这仅仅是开始。我已经教会了您如何钓鱼,今天还给了您一条小鱼,但明天您必须自己钓鱼!好吧,我实际的意思是……还有很多东西需要探索,但我已经向您展示了基础知识,您现在应该可以独自完成了。Arduino 随附的示例和**库**是进一步探索的好起点。

历史

  • 2010 年 9 月 16 日:初始版本
© . All rights reserved.