用Eclipse CDT开发Arduino

一直在用Arduino的ADE进行开发。。不过表示对这个开发环境非常无语!

它不支持中文,没有代码提示,经常出现莫名其妙的错误,代码缩进混乱,TAB竟然是用两个空格拼起来的!!

以前一直做Java开发,觉得Eclipse是一个很强大的软件,而且可以通过CDT支持C/CPP的开发。

在网上查阅了一些资料,费尽周折,最后终于折腾好了……决定把这个安装过程发出来给大家参考一下:

(本教程综合了多篇文章,尤其是这篇非常详细的文章:《Eclipse helios 上编写arduino程序并进行烧录》 帮助很大,非常感谢)

第一步:环境准备:

我们需要Eclipse+CDT,AVR Eclipse插件,还有AVR库(这个Arduino安装路径下自带)

笔者所用各软件的版本是:

OS:Mac OS X 10.7.4 AVR Eclipse Plugin:2.4 Arduino ADE:1.0.1

第二步:AVR 插件设置:

当我们把所有的程序都装好之后,需要配置AVR插件:

具体填法如下:

其中黑色字体是我修改过的。Mac下Eclipse没法把目录设定到.app文件里头,所以Mac用户可能需要把手动把路径插入到设置里头。Windows版应该没这个问题。

路径配置完毕之后,我们切换回到AVRDude的那个树形菜单,进行配置。

首先选择Use custom configuration file for AVRDude,然后在下面找到Arduino内自带的设置文件,一般目录在:Arduino/hardware/tools/avr/etc/avrdude.conf

然后,在下面Programmer configurations的表格内应该是空的。所以我们点击右边的Add..

由于笔者所用平台是一款Arduino Mega 2560的定制版,所以可以按照如下的形式填写:

重点在于: 1:Programmer Hardware (Mega 2560是 Atmel STK500 Version 2.x firmware)
2:Override default port (-p): 笔者的mac下是/dev/xxxx。windows一般是comx,具体端口号可以在ADE中看到。
其他可以不用动,然后点击OK就可以了。

第三步:编译ArduinoCore

前几天分析了一下ADE大致的工作原理。在你写好代码之后,ADE会自动编译核心库core.a文件。然后编译你的程序,再把你的程序跟核心库链接起来,然后变成二进制文件下载到Arduino设备上执行。

当然,你也可以不用静态链接库,代价就是你要把core文件夹添加进include中,然后系统在每次编译的时候,都会花上十来秒钟的时间帮你把静态库中用到的东西编译一下。

但是对于这种几百年不会变的静态库来说,咱还是自己编译一下的好。

注:不同Arduino平台下的核心库所需要的源文件不太一样,我在下面会注明(笔者所用的是Arduino Mega2560):

首先我们要创建一个AVR交叉编译静态库项目:点击File-New-C++ Project。

然后在里面选择“AVR Cross Target Static Library”,我们这里就叫做ArduinoCoreMega2560吧。

下一步之后选择发布设置,把Debug去掉,只需要Release就行了……(你不是真打算用Eclipse对AVR去Debug吧?)

然后下一步,进入到选择设备的页面,MCU Type选择你的设备,笔者的是ATega2560。然后在MCU Frequency填上你的设备的主频,Mega 2560是16000000hz的。(其他设备需要查手册才能查到主频,或者可以看到主板上的晶振,上面写着频率,例如笔者的写着"16.000"单位应该是Mhz)。

这样项目就创建好了。系统会创建一个空项目。

现在我们导入源代码:这个时候我们来导入源代码: 在ArduinoCoreMega2560项目上右键->Import->File System。分两次添加: 第一个是Arduino的核心库源码:一般在Arduino安装路径下的/hardware/arduino/cores/arduino文件夹 还有一个是跟你板子型号相匹配的一个引脚描述头文件,这个要根据你的型号去选择,笔者的Mega2560是在"/hardware/arduino/variants/mega"这里。

全都添加之后的项目文件夹大致长这个样子(文件太多,显示不全了):

这个时候你可以尝试一下编译(工具栏上面的小锤子)。然后你会发现各种报错各种找不到文件。 这个就是Eclipse CDT比较OOXX的地方,他不会自动把项目自身作为引用文件夹添加进项目里头。所以需要我们自己手动去做。方法如下:

在ArduinoCoreMega2560项目上点击右键->Properties->C/C++ Build->Settings 这时候有两个地方(两个不同的编译方式,C和C++)添加引用,分别点击下图中的红框(两个完全一样):

点击右上角的加号->workspace->选择你的项目(ArduinoCoreMega2560)。这样系统才会在编译的时候去你的项目文件夹下找头文件。添加成功之后我们能在项目Include文件夹中看到这个:

其中最后面那个就是指我们的项目,上面的那些就是我们前面在配置AVR的时候让填的那些头文件的引用路径。 这个时候就能进行编译了。如果你在控制台里头看到了类似下面的信息,就说明你编译成功了。

编译成功之后会产生一个libArduinoCoreMega2560.a的文件,这个就是我们需要的静态库。

注意:这个ArduinoCoreMega2560的项目就不要再动了!千万不要删除。在后面的项目可以直接include这个项目,不用你再去费事儿地翻Arduino的安装路径了。

第四步,创建项目!

前面废了这么多事儿就是为了用起来方便一些。

首先新建一个项目:File->New->C++ Project->AVR Cross Target Application->Empty Project。 名字就姑且叫做ArduinoDemo吧。

然后还是像刚才那样,下一步把Debug去掉,下一步,选择设备和频率,完成。

然后下一步我们要添加一些引用。但是这回引用路径就不需要再去翻Arduino的安装目录了。可以直接导入我们的ArduinoCoreMega2560。具体方法如下:

还是像上面说过的那样(不记得的话去网上看那个带红框的图),分别添加路径:这回路径选择workspace,然后把ArduinoCoreMega2560的项目添加进去。这样的话编译所需要的头文件就添加完了。

然后我们要添加静态库文件,选择Properties->C/C++ Build->Settings->AVR C++ Linker->Libraries。在上面那栏选择要添加的库文件名:ArduinoCoreMega2560,然后在下面那栏添加这个库所在的地方:workspace->ArduinoCoreMega2560->Release文件夹。一定要选上Release文件夹!否则会提示找不到库地址。全都搞定了应该差不多是这个样子:

这个时候我们可以创建源码了!

在ArduinoCore项目上右键->New->File 这里就叫做main.cpp吧

然后我们打开这个空白的文件,需要往里头写上这些东西:

  
#include 

void setup(){}

void loop(){}

int main(void) {

  /* Must call init for arduino to work properly */
  init();
  setup();

  for (;;) {
      loop();
  } // end for
} // end main

main函数中的内容就不要动了,然后就能看到我们熟悉的setup和loop函数。现在你可以在这个框架之中写代码了!

贴上我的测试代码:

  
#include 

int ledPin = 13;  
void setup(){  
    pinMode(ledPin,OUTPUT);
}

void loop(){  
    digitalWrite(ledPin,HIGH);
    delay(500);
    digitalWrite(ledPin,LOW);
    delay(500);
}

int main(void) {

  /* Must call init for arduino to work properly */
  init();
  setup();

  for (;;) {
      loop();
  } // end for
} // end main

然后先点击工具栏上头的编译。编译成功之后点那个写着“AVR”的下载图标。发生错误了:

这是因为我们没有给这个项目配置下载目标。

在这个项目上点右键->Properties->AVR->AVRDude。在Prorammer选项卡中(一打开就是),有一个Programmer configuration,下拉列表中肯定能找到我们上面配置的mega2560!就像这样:

然后点击下载,我们的led开始闪烁了!

教程就是这样,用Eclipse CDT去开发可比ADE方便多了!

根据我的推测,其实外部扩展库就是一堆.cpp和.h,我们可以添加include路径,或者干脆把他们的代码复制过来,然后就能用这些库了!改天再试试其他的面向对象特性。

Friskit

继续阅读此作者的更多文章