APM固件太大放不下,咋办?
最近在定制一款基于STM32H743的飞控,一般在PCB布局前我都会根据原理图先移植一下APM固件,等到编译没有问题之后再布局布线,以防原理图有问题导致前功尽弃。昨晚花了半个小时完成了硬件定义文件的编写,直接用目前最新的Copter-4.3.1版本源代码进行编译,由于APM固件的移植已经比较熟练了,因此直接就编译通过了,不过最新版本固件的大小着实让我意外(如下图所示),2M的Flash竟然都快占满了。同时我也庆幸,土豪级的配置就是省心,这种情况要是Flash小一点的单片机就放不下了。谁知道,今天下午在“怒飞垂云无人机交流群”里就有朋友在问一个固件编译报错的问题,经过讨论发现是由于Copter-4.3.1版本固件在默认配置情况下对于以STM32F405为主控的飞控来讲太大了,放不下,从而编译报错。解决方法也很简单:
关闭用不到的功能,不将其编译到固件中。
APM的多旋翼固件在这方便做的不错,只需要在“ArduCopter/APM_config.h”中将“xxx_ENABLED”宏定义改为“DISABLED”即可。如下图所示,我们关闭了“降落伞”控制功能:
重新编译后的输出如下:
对比本文的第一张图片可以发现,节省出来了248436 - 247132 = 1304字节的空间。节省出来的空间不大,可见“降落伞控制”功能的复杂度不高。
根据群里朋友的描述,他最终将“自动调参”功能禁用掉后成功将APM固件塞入了 “STM32F405”中,那么我们看看在我们的飞控中单独禁用“自动调参”功能可以节省出多少空间:
从上图可知,最终节省空间为:261996 - 247132 = 14864字节,远大于通过禁用“降落伞控制”功能带来的收益,这也从侧面说明“自动调参”功能的复杂度不低。同时我们也发现,裁剪完后固件还是大于1M字节,按理说STM32F405也应该依然放不下啊,其实这是由于APM源代码中已经有不少根据单片机容量自动裁剪功能的宏定义,如下图所示,如果Flash小于1M,则ADSB功能将自动地不会编译到固件中。
综上所述,得益于不断优化的代码结构,通过对APM固件功能的裁剪来适配小容量飞控的方法是可行的。固件太大放不下,就裁剪它的功能!
页:
[1]