一、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”)。
电源高频变压器磁芯参数的详细介绍
数字通信的优点有哪些 数字通信系统的组成
Intel产品路线图曝光 明年二季度更新CometLake架构家族
梁宝俊何飚唐永博2022中国联通合作伙伴大会演讲及发布文字实录
为什么电路板在航空航天行业中很重要
arduino ide编译过程
MOS管工作原理_MOS管失效原因分析
海信特研发别墅家系列中央空调 为消费者打造专属别墅的冬季舒适
温室大棚气象观测站的用途有哪些?
关于ATE Load Board的设计挑战及注意事项
烙铁头不沾锡的原因及解决方法
告别虚假新闻 谷歌脸书等联手打击虚假新闻
部分手机导航或受地球磁场超预期变化的影响
HTC将涉足移动VR 市场诸多难题待解
巧用电吹风对电器除尘
天猫超级粉丝日开启 荣耀邀你来当新品屏荐官!
信息化浪潮下,华为云灾备方案如何保护数据安全
最小化去耦电感有哪些技巧
第八届中国移动全球合作伙伴大会:5G与物联网碰撞
单片机系统软件抗干扰方法的研究