每天读一点儿APM(PIX)代码之外传:apm固件尺寸问题
来源:互联网 发布:网络语哈吉是什么意思 编辑:程序博客网 时间:2024/05/02 06:44
最近遇到了一个非常玄妙的问题,困扰了我好久。本人把Apm的3.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的超级精简版代码,极大缩小了固件尺寸,如果有志同道合者,可以相互交流。
- 每天读一点儿APM(PIX)代码之外传:apm固件尺寸问题
- 每天读一点儿APM(PIX)代码
- 每天读一点儿APM(PIX)代码之三:飞行控制
- 每天读一点儿APM(PIX)代码之四:minimosd
- 每天读一点儿APM(PIX)代码之四:minimosd
- 每天读一点儿APM(PIX)代码之一:调度总线AP_Scheduler
- 每天读一点儿APM(PIX)代码之二:飞行模式FlightMode
- APM
- APM
- 移植APM代码之PID调节
- APM之原理篇
- APM之实现篇
- APM之原理篇
- APM之实现篇
- APM原生代码编译流程
- 基于pix硬件的apm开发环境搭建
- 基于pix硬件的apm开发环境搭建
- APM和PIX飞控日志分析入门贴
- Redis批量删除key
- Linux下python升级
- iOS开发的几个奇葩问题
- java web mail
- 【HDU】 1542 Atlantis
- 每天读一点儿APM(PIX)代码之外传:apm固件尺寸问题
- iOS 如何正确的绘制1像素的线
- 基于主键的一对一关联关系
- 解决含有Textview布局在viewpager等横向滑动中滑动不流畅的bug
- ios使用xib自定义view
- 浅析ios的MVC开发模式(摘自http://blog.sina.com.cn/s/blog_6ec3c9ce01013owk.html)
- 动态规划之0--1分数背包问题
- C#使用委托调用主线程上的控件
- tomcat服务器中支持php