参考链接:https://blog.csdn.net/lixiaoweimashixiao/article/details/80540295

首先我们假定从void AP_Vehicle::setup() 开始,这里是飞控所有初始化所在,程序位于 AP_vehicle.cpp中。
在这里插入图片描述

找到其中的 init_ardupilot();函数,执行跳转
在这里插入图片描述
执行跳转过程中,需要选择是机型(无人机,无人车,UUV等)。我们这里选择多旋翼,则走到了 system.cpp中。
在这里插入图片描述

继续寻找到其中的 startup_INS_ground(); 如上图所示。然后再次跳转,如下图所得。
在这里插入图片描述
这里跟踪定位到 ins.init(scheduler.get_loop_rate_hz());,该函数已经表示初始化了。当然,我们继续
在这里插入图片描述

此时定位在 AP_InertialSensor.cpp 中,我们找到其中的 _start_backends();,由于采用的是前后端的形式,所以这个地方开始进入到后端了(注意到下面还有一个start()函数,在文末会展开说一下

在这里插入图片描述
由于ArduPilot有多个板子,对应不同的传感器,所以这里先要检测后端,找到使用哪个板子,必要的一步。
在这里插入图片描述

这里以Pixhawk为例,如上图所示,ADD_BACKEND是要条件后端了。在继续寻找 probe 函数,进入跳转得:
在这里插入图片描述
继续刨根问底!!我们看到了sensor->init()
在这里插入图片描述

还没完,这都挖的这么深了…
在这里插入图片描述
终于,我们看到了硬件信号对传感器的初始化,包括传感器的一些初始配置,再往下就是总线协议了…

总结:完善的框架,造成藏得真深啊,不过其他传感器的初始化也都类似,如出一辙,通过前后端的形式完成。

补充:后端线程开启
在这里插入图片描述
start函数会在后端函数中进行重载,具体实现如下。
在这里插入图片描述

在start函数中,最后开启了线程回调函数
在这里插入图片描述

/*
 * Timer process to poll for new data from the Invensense. Called from bus thread with semaphore held
 */
void AP_InertialSensor_Invensense::_poll_data()
{
    _read_fifo();
}

然后就讲传感器数据送入信号量了。