Arduino-Lite, RoboPeak使用的高效轻量级AVR库(2)

Click here to view English version

这是本系列文章的第二篇,介绍Arduino-Lite的安装、使用和进行开发。

Arduino-Lite是由RoboPeak开发并使用的轻量级且高效率的AVR固件库,他基于Arduino项目的固件库改良而来,我们保留了Arduino固件库的简单易用的风格,同时有效的缩小了固件的代码尺寸,相比Arduino,Arduino-Lite拥有诸多优点。并且,他是相当易于使用的。

关于他的介绍和由来请访问: Arduino-Lite, RoboPeak使用的高效轻量级AVR库(1)

1. Arduino-Lite的构成

发布在google code上的Arduino-Lite的包含如下部分:

  • Arduino-Lite固件库源代码代码
  • WINAVR (avr-gcc) 编译器
  • Arduino-Lite编译系统
  • 工具程序
  • 例子工程和工程模板文档

使用者仅需下载arduino-lite并配合操作系统带有的文本编辑器(notepad, vim)即可完成AVR程序编写、编译、烧录/下载甚至调试的全部过程。无需安装任何额外的第三方库。当然,Arduino-Lite并不阻止你使用已有的软件/库。

2. 下载并配置Arduino-Lite

2.1 获取Arduino-Lite

开放版本的Arduino-Lite可以在google code下载到: http://code.google.com/p/arduino-lite/。您可以通过2种手段获得Arduino-Lite:

  • 打包的压缩包

在google code的Download区域有已经打包过的Arduino-Lite,比如arduino-lite-r0.1.zip。在下载完毕后,将他解压缩至任何路径即可,无需安装过程。

  • SVN

在google code的Source区域可以以匿名方式签出(check out) Arduino-Lite的最新版本或者历史上的任意版本。在签出后可以直接使用本地工作目录,无需安装过程

在下载Arduino-Lite(并解压缩)后,应该看到如下的目录结构:

其中

  • src包含了Arduino-Lite固件库的所有代码
  • sketch用于存放用户工程文件,工程模板与例子工程也存在于此
  • scripts存放编译环境相关的脚本
  • bin存放相关工具程序以及avr-gcc

2.2 环境要求

虽然Arduino-Lite源代码对当前开发环境(操作系统,机器配置)不存在任何要求,但目前我们的编译环境仅在windows上使用,您可以稍作修改使得他在Linux/MacOS上工作,我们也将在未来提供这些支持。

我们已经测试过如下操作系统可以正常运行Arduino-Lite的编译系统:

  • Windows XP 32位版本
  • Windows Vista 32位 和 64位 版本
  • Windows 7 32位 和 64位 版本

2.3 初次使用的配置

当首次在计算机上使用该运行库时(刚从SVN上check-out或是刚从下载的软件包中解压缩),执行位于Arduino-Lite根目录下的buildenv.cmd文件。他将负责配置Arduino-Lite所依赖的工作环境:

  • 配置Bash环境(基于msys)
  • 展开WINAVR(avr-gcc)目录树
  • 配置环境变量(如果需要)

你应该会看到如下的命令行窗口:

当该脚本完成执行后,Arduino-Lite就可以使用了。

3. 使用Arduino-Lite进行开发

3.1 创建一个Arduino-Lite工程

Arduino-Lite自身的编译系统采用简单易用的设计哲学创建新的工程,无需借助第三方工具,也无需编写Makefile脚本 (必要的修改是需要的) ,即可迅速创建出可以直接进行AVR代码编译、下载/烧录的Arduino-Lite工程。 当然,传统的编写Makefile、使用AVRStudio, Eclipse等IDE构建、或者使用ArduinoIDE环境都是可以的。

在Arduino-lite目录结构下的sketch用于存放使用Arduino-Lite编译系统的工程项目文件夹。这里我们假设要创建的AVR项目名为myAVR,按照下面的步骤,无需安装任何额外工具也无需编写Makefile

a. 解压缩位于sketch目录下的template.zip压缩文件到sketch目录,得到如下所示的目录结构

(此时位于sketch/template/目录下应该存在launchsh.cmd等文件)

template.zip是Arduino-Lite工程的模板,其中包含了直接可以运作的编译脚本(Makefile)以及位于src/main.cpp的模板框架代码。

Arduino-Lite的编译系统使用Make脚本进行源代码编译,并使用bash shell环境进行操作。可以使用launchsh.cmd启动bash  shell环境(参考后文)。

b. 将解压缩的template目录重命名为您所希望的工程名称,例如这里的myAVR

至此,一个新的Arduino-Lite工程创建完毕,他会负责编译出基于Atmega168,工作在16Mhz的AVR固件。从template.zip模板创建而来的工程包含了控制11号引脚LED渐量效果的例子程序。如果要修改产生的AVR固件的运行环境(芯片型号、时钟频率等),请参考后文。

3.2 往工程中添加文件

可以直接在src文件夹下增加额外的代码文件(支持.cpp, .c, .S, .h, .hpp),也允许直接添加子目录在src文件夹下。

Arduino-Lite将自动编译src文件夹下的所有可识别源代码文件(.cpp, .c, .S, .h, .hpp),无需修改Makefile脚本。

例如,如下是RoboPeak一个Arduino-Lite的工程结构。Arduino-Lite可以自动编译整个代码树。

3.3 何时需要修改Makefile脚本?如何修改?

以下情况需要修改Makefile脚本

  • 固件的目标硬件环境与Makefile脚本默认的情况不同。

如果不修该Makefile脚本,当前的Arduino-Lite工程将会产生用于Atmega168芯片,工作于16Mhz的固件代码。

  • 需要设置目标硬件的下载/烧录方式

Arduino-Lite支持通过串口的AVR bootloader进行固件下载(Arduino兼容),也支持通过RP USB Connector进行空白AVR芯片的烧录。如果需要配置bootloader串口波特率等情况,此时需要修改Makefile

  • 需要修改目标AVR芯片的熔丝配置

在使用RP USB Connector进行目标AVR烧录时,可以在Makefile中指定需要配置的熔丝位数据

  • 需要自定义编译的文件、引用额外的代码库

如果不满于默认编译src下所有源代码的方式,或者希望引用除了Arduino-Lite固件库之外的库文件,此时需要修改Makefile脚本

Makefile脚本位于每个工程的跟目录下,可能需要改动的部分均以TODO:标识注明,如下例子是会命令Makefile产生基于Atmega48,工作在1Mhz的固件。并且将使用COM3串口利用芯片上的bootloader进行下载:

3.4 编译工程

Arduino-Lite使用标准的make命令进行项目的编译。为了执行make命令,可以执行位于工程根目录下的launchsh.cmd脚本,此时将启动bash shell。

在提示符环境输入make,即可开始工程的编译:

如果编译过程没有错误,最终将提示产生的固件的尺寸信息:

图中,

  • 红色框代表了固件将消耗的AVR程序存储空间(Flash)大小(单位 byte),可用以判断当前固件是否可以完整烧录/下载至目标芯片。
  • 而橙色框的数字综合代表了程序所消耗的全局内存的下限。可用来评估目标芯片是否有足够内存保证该固件的正常执行。

3.5 将代码下载/烧写到目标硬件设备

3.5.1 给Arduino版(以及兼容版)编程

可以使用make upload命令给具有支持STK500v1协议bootloader的AVR芯片编程。这包括:

  • Arduino硬件以及他的兼容版大多带有上述Bootloader
  • 任何预先烧录了该bootloader的AVR硬件

该固件源代码和预编译版本可以在Arduino-Lite的srcbootloaders目录下找到。

在进行下载前,需要确认如下步骤:

  1. 将目标硬件接入PC,得到用于下载的串口号,默认为COM3
  2. 确认Bootloader所使用的波特率,默认为19200
  3. 如果上述数值与默认值不同,请修改当前工程的Makefile脚本,如上文截图所示。

在设备接入PC后,输入make upload命令即可开始烧录,烧录过程如下图所示:

注意:对于非Arduino设备,您可能需要在下载开始前手工重启AVR芯片。

3.5.2 给任意AVR芯片构成的电路系统编程

Arduino-Lite编译环境集成了对AVR-Doper(http://www.obdev.at/products/vusb/avrdoper.html)及其兼容下载器的支持,可以使用make burn命令通过ISP口给任意AVR芯片烧录程序、配置熔丝等操作。

RoboPeak开发了兼容AVR-Doper协议的USB免驱动AVR编程器:RoboPeak USB Connector,我们将在后续文章中公布并开源他并介绍它的使用方式:请参考:http://www.robopeak.net/blog/?p=133

Arduino-Lite支持如下烧录指令: 他们的使用和说明见后续章节。

  • make burn
  • make fuse
  • make lock
  • make erase

3.6 可用的编译参数

编译相关:

  • make或者make all

编译当前工程

  • make clean

清除上次编译的结果

芯片下载/编程

  • make upload

将hex经过串口上传到目标AVR芯片内(通过STK500v2协议的bootloader)

  • make usbupload

将hex经过USB上传到目标AVR芯片内(通过HidBootloader)

  • make burn

将hex通过RoboPeak USB Connector编程器(或者Avr-doper兼容设备)烧写到目标AVR芯片

  • make erase

通过RoboPeak USB Connector编程器(或者Avr-doper兼容设备)擦除目标AVR芯片的数据

  • make fuse

通过RoboPeak USB Connector编程器(或者Avr-doper兼容设备)给目标芯片配置熔丝位

  • make lock

通过RoboPeak USB Connector编程器(或者Avr-doper兼容设备)给目标芯片配置Lock bit

代码分析和调试

  • make dump

将编译产生的elf(*.elf)文件反汇编至AVR汇编代码

  • make dumpobj

将编译产生的目标文件(*.o)反汇编至AVR汇编代码

在后续文章中,我们将介绍Arduino-Lite新提供的函数

19 thoughts on “Arduino-Lite, RoboPeak使用的高效轻量级AVR库(2)”

  1. 按要求安装好了,使用ATMEGA8,e:winavr-20090313
    修改了makefile,一个最简单的led闪光程序:
    void setup() {
    // initialize the digital pin as an output.
    // Pin 13 has an LED connected on most Arduino boards:
    PIN_MODE(13, OUTPUT);
    }

    void loop() {
    DIGITAL_WRITE(13, HIGH); // set the LED on
    delay(1000); // wait for a second
    DIGITAL_WRITE(13, LOW); // set the LED off
    delay(1000); // wait for a second
    }
    置于src中(原有main.cpp不动)
    make 总是不成功,竟然提示
    error:’OUTPUT’undeclared…以及
    error:’HIGH’ undeclared…
    error:’LOW’ undeclared…
    这些不都是许可的吗?还要包含什么文件?最好给一个完整的简单范例

    1. 只需要包含arduino_lit.h即可

      原先的main.cpp就是范例,是用来修改的,你可以把其中的对应代码替换成你的即可。

  2. 请问我在lite上用数字温度传感器 DS18B20 第三方库DallasTemperature 生成的hex 为7146 bytes 而arduino0022生成的为 7050bytes,为什么反比arduino大?

    1. 如果直接使用在Arduino下边的库,则因为这些库自身会调用原始Arduino的函数,所以原先的Arduino库函数仍旧会出现在最终程序中。同时又因为最终程序也包含了ArduinoLite代码,就会出现比直接用Arduino体积更大的情况。
      可以尝试修改这些库,让他们也调用ArduinoLite函数

  3. ❓ csk您好,我使用make upload 上传编译好的hex,会在第一段提示以后停留,没有错误提示,终止后也没有提示,上传的时候片子有重启动作,然后RX闪一下,TX常亮,就没反应了,makefile文件已经修改过:
    UPLOAD_PORT := COM8
    PORT_RATE := 19200
    MCU := atmega1280
    F_CPU := 16000000
    不知道是不是不被支持呢?

    1. 1280应当是支持的,虽然我们没有测试过
      但你的情况应该与是否支持无关,毕竟已经编译产生了hex文件。你的现象更像是串口下载线出现问题或者bootloader被破坏

  4. 可不可以写点打基础的学习资料呢?之前没有接触过AVR,刚听说Arduino的人也大有人在咯!!我就是这样的,下载bootloader不成功,也不知道怎么配置熔丝位才正确~~~~着急!

Leave a Reply

Your email address will not be published. Required fields are marked *