Learning Examples | Foundations | Hacking | Links
为了生成可在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")。