Loading...

Learning   Examples | Foundations | Hacking | Links

Arduino构建过程

总述

为了生成可在Arduino板子上运行的程序,需要经过以下几个步骤:

  • 1. Arduino IDE对代码进行转换,确保生成正确的C/C++代码(两种常用的编程语言)。
  • 2. 通过编译器(avr-gcc)将上一步生成的可读代码,编译成机器能识别的指令(或称之为目标文件)。
  • 3. 通过链接器,将上一步产生的目标文件与标准Arduino库文件(提供基础函数,如digitalWrite()或Serial.print())共同链接,生成一个Intel Hex文件,该文件中的指定内容将写入到Arduino板上的可编程内存中。
  • 4. 将上一步产生的HEX文件上传至Arduino板:可以使用USB或串口,通过板上已有的bootloader传输到Arduino板,也可以通过其它编程器直接烧写。

多文件程序

一个Arduino程序可以包含多个文件(IDE中的多个标签页,一个标签页代表一个文件)。单击IDE顶部滚动条的右向箭头即可管理各文件。文件标签页的扩展名有4种类型:无扩展名、.c、.cpp或.h(若是其它扩展名,将被转换为下划线)。程序编译完后,所有无扩展名的文件标签页将被合并在一起,生成“主程序文件”。.c或.cpp扩展名的文件将被单独编译。为了打开.h标签页,必须#include该文件(使用双引号""而非尖括号< >)。

主程序文件的处理

在传给avr-gcc编译器之前,Arduino IDE将对主程序文件(IDE中所有无扩展名的标签页合并结果)进行转换操作:

1. 在主程序文件的头部,加入#include "WProgram.h"(0023版本)或#include "Arduino.h"(1.0版本)。该头文件(位于<ARDUINO>/hardware/cores/<CORE>/)包含Arduino标准核心库所需的所有声明。

2. IDE将搜索主程序文件中出现的所有函数定义,为它们创建声明(原型)。这些声明将被插在最前面的的注释、预处理语句(#include或#define)之后,其它语句之前(包括类型定义)。若在函数中使用了自定义类型,则需要将该类型的定义单独放入一个头文件中。当然,这个处理并不完善:含有默认参数值的函数,定义在名字空间或类里的函数,均不会产生正确的声明原型。

3. 当前目标板的main.cxx文件中的所有内容,附加在主程序文件之后。

目标板

Arduino IDE支持多种目标板与多种芯片(目前仅AVR系列)、CPU频率、bootloader。这些都在板配置文件中定义,相关参数包括:

<BOARD>.name: 显示在Boards菜单里的名称

<BOARD>.build.mcu: 板上的单片机(常用"atmega8"或"atmega168")

<BOARD>.f_cpu: 单片机的时钟频率(常用"16000000L"或ATmega168使用内部时钟时的"8000000L")

<BOARD>.core: hardware/cores/目录里的子目录名称,用于链接时选择对应的核心库(常用"arduino")

另外,在preferences.txt中的一项设定也是很有用的:

构建程序时,是否打印调试信息(如"false")。若为true,则打印构建过程中调用的所有命令的完整信息。

注:Arduino 0004及之后的版本,build.extension不再使用 -- 主程序文件将永远作为.cpp文件处理。

构建过程

使用avr-gcc来编译程序文件。

include路径包括程序文件所在目录、目标板目录(<ARDUINO>/hardware/cores/<CORE>)和avr的include目录(<ARDUINO>/hardware/tools/avr/avr/include/),以及主程序文件引用的头文件所在的函数库目录(位于<ARDUINO>/hardware/libraries)。

当verify一个程序文件时,将在系统临时目录(如Mac里的/tmp)中进行构建。当上传时,将在程序文件所在目录(可通过Sketch > Show Sketch Folder菜单进行访问)的applet/子目录中构建。

目标板核心的.c与.cpp文件将在同级目录下被编译生成.o文件,主程序文件、程序其它.c和.cpp文件及#include包含的函数库中的.c或.cpp文件同样处理。

这些.o文件将最终生成一个静态库,主程序文件与之链接。只有主程序中使用到的库代码才会被写入到最终的.hex文件中,这样就减少了绝大多数程序的大小。

.hex文件是编译的最终文件,然后被上传到Arduino板。点击"Verify"按钮,.hex文件会在/tmp(Mac和Linux系统)或\Documents and Settings\<USER>\Local Settings\Temp(Windows系统)目录中生成;点击"upload"按钮,该文件在程序目录(通过Sketch > Show Sketch Folder菜单访问)的applet子目录中生成。

上传过程

生成的程序通过avrdude上传。

上传过程也受板配置和主配置文件中的参数影响,板配置包括:

<BOARD>.upload.protocol: avrdude与Arduino板的通信协议(通常是"stk500")

<BOARD>.upload.speed: avrdude上传程序时使用的速度(波特率)(通常是"19200")

<BOARD>.upload.maximum_size: Arduino板的最大程序大小(与芯片大小及bootloader大小有关)

主配置中影响的参数:

upload.verbose: 上传程序到板上时,是否显示调试信息(默认"false")。