眉山东坡论坛

 找回密码
 注册账号

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 58420|回复: 8
收起左侧

Arduino IDE编译过程

[复制链接]
发表于 2015-1-22 23:07 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转东坡论坛

您需要 登录 才可以下载或查看,没有帐号?注册账号

x
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支持多种目标板与多种芯片、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")。

发表于 2015-1-23 08:46 | 显示全部楼层
谢谢指点。
回复

使用道具 举报

发表于 2015-1-23 10:08 | 显示全部楼层
好攻略。
回复

使用道具 举报

发表于 2015-1-23 10:09 | 显示全部楼层
技术贴啊。
回复

使用道具 举报

发表于 2015-1-23 10:36 | 显示全部楼层
快来参与金币拍卖吧
虽然不懂,还是要顶一下!
发表于 2015-1-23 11:02 | 显示全部楼层
Arduino 要真的有技术才玩得起啊。
发表于 2015-1-23 14:29 | 显示全部楼层
好厉害的样子。
发表于 2015-1-23 16:27 | 显示全部楼层
赞一个!
回复

使用道具 举报

发表于 2015-1-23 17:43 | 显示全部楼层
顶一下!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|关于我们|小黑屋|爱好群|眉山东坡论坛 ( 蜀ICP备05001993号-1 )

GMT+8, 2018-1-20 10:44

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表