前言
这几天在写“Ardupilot移植经验分享(2)”。其中有一小节名为“main函数在哪儿”,在叙述时想借此机会演示eclipse的实战效果,同时为了控制篇幅,因此拎出来作为一篇独立的文章。
本文只讲寻找main函数的方法,至于ardupilot为什么要用这种方式定义函数入口,将在“Ardupilot移植经验分享(2)”中说明。
ardupilot系列文章的安排
有必要说明下ardupilot系列文章的安排,笔者会出3篇长文:
- Ardupilot移植经验分享(1),介绍移植思路,讲述了下载编译源码的要点和搭建源码阅读环境的方法。已发表。
- Ardupilot移植经验分享(2),围绕移植这个中心目标,分析ardupilot源码。编写中。
- Ardupilot移植经验分享(3),讲解移植流程。敬请期待。
本着授人以鱼不如授人以渔的思想,笔者重点是分享经验、技巧和方法。有时想把一个方法讲透,需要很多的文字。何况ardupilot移植本就是一个艰巨繁重的工作,区区3篇长文是不可能讲到位的。所以笔者在这3篇之外,会出很多小文章,每篇针对一个细节展开来讲。比如,加速下载ardupilot工程。再比如,本文。
进入正题
ardupilot源码,指的是下图中的蓝色部分。
阅读ardupilot源码的第一步是了解程序的整体框架,把握其脉络。而第一步中最重要的,莫过于找到程序的入口。通常,一个C工程的入口是main函数,那么ardupilot程序的main函数在哪儿呢?
我们先用eclipse的查找符号功能,Ctrl+Shift+T,输入main,看看候选列表中能否找到main函数。
不过点进去后发现并不是。
很奇怪不是?居然找不到main函数。不急,还有其他方法。 main函数作为程序入口,由其调用其他的函数。换言之,除了中断函数及其子函数,其他的函数都是被main函数调用或者间接调用的。main函数处于函数调用栈的最顶端。
还记得eclipse强大的查看函数调用栈的功能吗?让我们随便打开一个文件,比如ArduCopter/AP_Arming.cpp,随便选择一个函数AP_Arming_Copter::update。
选中它,使用Ctrl+Alt+H打开函数调用窗口,一路点开小三角:
双击ArduPilot_main,跳转到了其定义处,使用了一个宏AP_HAL_MAIN_CALLBACKS。
这是一个宏,选中它,按F3查看具体定义:
AP_HAL_MAIN_CALLBACKS宏会定义出一个函数。这函数并不叫AP_MAIN,因为AP_MAIN也是一个宏。请看红色箭头所指的内容,这时是不是感受到eclipse另一个强大功能的好处:AP_MAIN有好几处定义,而eclipse将未被预编译选中的代码都灰化了:
我们可以直接查看真正生效的代码,最终定义出的是名为Ardupilot_main的函数。
其实eclipse还有一个分析宏定义的强大功能,回到AP_HAL_MAIN_CALLBACKS宏,将光标悬停于其上,或者按F2,可弹出一个窗口如下:
eclipse直接将宏替换成了最终的代码,确实是一个ArduPilot_main函数,其返回值与参数列表,与main函数是一样的,只是多了一个属于定义__attribute__ 。
int main(int argc, char * const argv);
int __attribute__ ((visibility ("default"))) ArduPilot_main(int argc, char* const argv[]);
为什么不是main而是ArduPilot_main呢?我们再来看一遍AP_MAIN,它可能是ArduPilot_main,也可能是main,其选择取决于硬件平台的类型。
ardupilot是个应用程序,其底层驱动由PX4Firmware和Nuttx提供。反言之,ardupilot是由底层平台程序启动的。所以ardupilot入口函数叫什么,由PX4Firmware决定。
最终,让我们在PX4Firmware中寻找答案。简单直接的方法,在ardupilot根目录下搜索ArduPilot_main:
答案就在builtin_commands.c之中,这看起来像一个命令列表,Ardupilot命令就在其中,对应的入口函数就是Ardupilot_main。
最后总结下,本文讲述了寻找ardupilot源码入口函数的方法,并结合Eclipse强大的代码浏览功能进行演示。
后记
这个公众号是刚创建的,无法开启评论功能。大家如果对文章有啥疑问或者是建议(比如文章太啰嗦,或者讲得不够细),都可以在后台给我留言,我将一一回复。对于有代表性的问题和建议,我将精选出来公示,算是一种互动方式吧。
本公众号以ardupilot系列文章为开端,不过后续并不止于ardupilot,会分享丰富多彩的内容,包括但不限于:
- rtthread系统移植,驱动分析,功能挖掘
- 单片机基础
- C语言小知识
- 编译基础
- 阅读开源代码
- 设计模式,编程技巧
- 推荐好用的IDE
如果你觉得本文,本公众号对你有所帮助,欢迎关注点赞在看收藏转发,大家的支持是我创作最大的动力。