寻找ardupilot的main函数

前言

这几天在写“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

如果你觉得本文,本公众号对你有所帮助,欢迎关注点赞在看收藏转发,大家的支持是我创作最大的动力。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值