每天读一点儿APM(PIX)代码之外传:apm固件尺寸问题

来源:互联网 发布:网络语哈吉是什么意思 编辑:程序博客网 时间:2024/05/02 06:44

最近遇到了一个非常玄妙的问题,困扰了我好久。本人把Apm3.2.1固件下载后进行编译,结果生成的固件尺寸过大,超过248000,不能使用,提示是这样的:

 

参照官方文档,需要通过显示禁用的方式关闭某些不常用的功能,可以使固件尺寸不断缩小,大概结果如下:

 

原始3.2.1 ArduPlane:二进制程序大小:275,740字节(最大258,048字节)

mount disabled :二进制程序大小:267,182字节(最大258,048字节)

camera/mount disabled:265,408字节(最大258,048字节)

camera/mount/GEOFENCE_ENABLED disabled:260,132字节(最大258,048字节)

还是太大啊,咬咬牙,把log也给禁用掉,恩,大小终于满足了。

 

可是后面一些日子,当我满心欢喜的改代码是,忽然有一天,发现编译尺寸竟然如此之小:

 

很兴奋有没有,把之前禁用的模块全恢复,也是毫无压力!

 

再编译copter试试,也没问题!

 

当时没有关心,反正大小都够,就随意吧。可是后面的几个月中,时发现编译出来的固件时大时小,却又难以发现规律。虽然都可以正常使用,但难免让我心里发毛,这到底是怎么回事呢?为了解决这一丝疑惑,我真是折腾了好几天。

我们知道,arduino编译时,所有中间文件都会放置在C:\Users\username\AppData\Local\Temp下面。我认为从这里一定可以查到些许问题。

首先,当我发现编译出来的固件很小时,我把这次编译的临时文件夹拷贝备份了一遍。

几天后,又一次我在编译时,发现编译出来的是尺寸比较大的固件,马上又去将最新的临时文件夹做了备份。

这就算是抓住了两个作案现场。之后,使用到了一个文件夹比较工具BeyondCompare,对比这两个文件夹

 

可以发现编译过程中的中间类库.o 文件尺寸不同,这也一定会导致最终rom大小不同。进一步仔细分析,发现其中一项叫做HardwareSerial.o两边文件大小相差了进40kb,于是我对比了他们的.d文件

 

原来这么大的区别是来自里面所引用的模块。那么问题就来了,源代码一样,arduino配置一样,为什么会带来如此大的不同呢,正在我百思不得其解之际,猛然间发现了些许问题:

上图中,左侧引用的模块都在G:\Wook|Ardupilot下,而右侧引用的模块确实在G:\Work\APM\Ardupilot下!怪不得不一样,原来我启动的编译程序ardupilot不同。仔细看看我的桌面,原来是因为有两个arduino的快捷方式,分别指向了不同的位置,我每次无意中启动不同的环境,就编译出来不一样大小的固件。这真是一个low到爆的马虎和错误,真的不好意思把这个小意外写出来,不过下面还是要善始善终,我对比了一下两个路径的arduino,发现了他们的区别所在:

 

两个版本是不一样的,其内部的hardware文件夹区别非常大,这个文件夹提供了对片上系统的仿真,正式他们的却别,导致固件编译过程中,多带入很多模块,所以生成的固件非常之大。

进一步追根溯源,我发现两个ArduPilot-Arduino-1.0.3-gcc-4.8.2-windows.zip文件有区别,时间比较靠前的94729kb,编译出来的固件都很大。时间比较靠后的,也就是现在从ardupilot下载的版本,181585kb,编译出来的固件尺寸小了很多。想必是ardupilot项目在某次更新后,例如3.2.1面临严峻的体积膨胀压力,所以不得不更新了编译工具ArduPilot-Arduino,新版本可以有助于缩小其尺寸。Ardupilot官方文档也太坑了,其中中并没有提到需要更新ArduPilot-Arduino,这会带来多大的乱子啊!当然,后续几个版本,ardupilot功能越来越多,体积膨胀压力越来越大,ArduPilot-Arduino也无力回天,最终小组放弃了APM,转投pix怀抱,这是后话。

这是一篇外传,算是发发牢骚吧。最后提取一些稍微有用的内容,列下;

1.APM代码编译,可以通过ArduCopter.h或者ArduPlane.h中禁用某些模块,来缩小体积。

2.APM3.2.1之后的版本,需要下载最新的ArduPilot-Arduino,这样可以保证固件的体积相对比较小。下载地址是:http://firmware.diydrones.com/Tools/Arduino/ArduPilot-Arduino-1.0.3-gcc-4.8.2-windows.zip

3.Arduino编译固件时,所有临时文件在到C:\Users\username\AppData\Local\Temp下面。

4.遇到问题不要惊慌,冷静应对,Beyond Compare是码农神器。

5.本人耗尽心血搞了一个ardupilot3.2.1的超级精简版代码,极大缩小了固件尺寸,如果有志同道合者,可以相互交流。


0 0
原创粉丝点击