ardupilot在Linux上的启动过程

代码起步是从ArduCopter.cpp里的展开

AP_HAL_MAIN_CALLBACKS(&copter);
传入的参数是Copter.h 

extern Copter copter;

用extern 指向Copter.cpp里

Copter copter;
注意Copter继承自Callbacks

  
  
class Copter : public AP_HAL::HAL::Callbacks {


ArduCopter 文件夹下 ArduCopter.cpp


#ifndef AP_MAIN
#define AP_MAIN main
#endif


#define AP_HAL_MAIN_CALLBACKS(CALLBACKS) extern "C" { \
    int AP_MAIN(void); \
    int AP_MAIN(void) { \
        hal.run(0, NULL, CALLBACKS); \
        return 0; \
    } \

    }
AP_HAL_MAIN_CALLBACKS(&copter);

这里的hal是Copter.h用external声明,但是在Copter.cpp里获得,

const AP_HAL::HAL& hal = AP_HAL::get_HAL();

AP_HAL_LINUX  文件夹下 HAL_Linux_Class.cpp

void HAL_Linux::run(int argc, char* const argv[], Callbacks* callbacks) const
{
...
}

const AP_HAL::HAL& AP_HAL::get_HAL() {
    static const HAL_Linux hal;
    return hal;
}

所以函数最终是在HAL_Linux::run下执行各种初始化,最后进入callbacks->loop

实际上是进入了传入的Copter::loop(),从而进一步进入scheduler调度各种在ArduCopter里设置的TASK


// Execute the fast loop
    // ---------------------
    fast_loop();

    // tell the scheduler one tick has passed
    scheduler.tick();

    // run all the tasks that are due to run. Note that we only
    // have to call this once per loop, as the tasks are scheduled
    // in multiples of the main loop tick. So if they don't run on
    // the first call to the scheduler they won't run on a later
    // call until scheduler.tick() is called again
    uint32_t time_available = (timer + MAIN_LOOP_MICROS) - micros();
    scheduler.run(time_available);

即以下任务

/*
  scheduler table for fast CPUs - all regular tasks apart from the fast_loop()
  should be listed here, along with how often they should be called
  (in 2.5ms units) and the maximum time they are expected to take (in
  microseconds)
  1    = 400hz
  2    = 200hz
  4    = 100hz
  8    = 50hz
  20   = 20hz
  40   = 10hz
  133  = 3hz
  400  = 1hz
  4000 = 0.1hz
  
 */
const AP_Scheduler::Task Copter::scheduler_tasks[] = {
    SCHED_TASK(rc_loop,                4,    130),
    SCHED_TASK(throttle_loop,          8,     75),
    SCHED_TASK(update_GPS,             8,    200),
#if OPTFLOW == ENABLED
    SCHED_TASK(update_optical_flow,    2,    160),
#endif
    SCHED_TASK(update_batt_compass,   40,    120),
    SCHED_TASK(read_aux_switches,     40,     50),
    SCHED_TASK(arm_motors_check,      40,     50),
    SCHED_TASK(auto_disarm_check,     40,     50),
    SCHED_TASK(auto_trim,             40,     75),
    SCHED_TASK(update_altitude,       40,    140),
    SCHED_TASK(run_nav_updates,        8,    100),
    SCHED_TASK(update_thr_average,     4,     90),
    SCHED_TASK(three_hz_loop,        133,     75),
    SCHED_TASK(compass_accumulate,     4,    100),
    SCHED_TASK(barometer_accumulate,   8,     90),
#if PRECISION_LANDING == ENABLED
    SCHED_TASK(update_precland,        8,     50),
#endif
#if FRAME_CONFIG == HELI_FRAME
    SCHED_TASK(check_dynamic_flight,   8,     75),
#endif
    SCHED_TASK(update_notify,          8,     90),
    SCHED_TASK(one_hz_loop,          400,    100),
    SCHED_TASK(ekf_check,             40,     75),
    SCHED_TASK(landinggear_update,    40,     75),
    SCHED_TASK(lost_vehicle_check,    40,     50),
    SCHED_TASK(gcs_check_input,        1,    180),
    SCHED_TASK(gcs_send_heartbeat,   400,    110),
    SCHED_TASK(gcs_send_deferred,      8,    550),
    SCHED_TASK(gcs_data_stream_send,   8,    550),
    SCHED_TASK(update_mount,           8,     75),
    SCHED_TASK(ten_hz_logging_loop,   40,    350),
    SCHED_TASK(fifty_hz_logging_loop,  8,    110),
    SCHED_TASK(full_rate_logging_loop, 1,    100),
    SCHED_TASK(dataflash_periodic,     1,    300),
    SCHED_TASK(perf_update,         4000,     75),
    SCHED_TASK(read_receiver_rssi,    40,     75),
    SCHED_TASK(rpm_update,            40,    200),
    SCHED_TASK(compass_cal_update,    4,    100),
#if FRSKY_TELEM_ENABLED == ENABLED
    SCHED_TASK(frsky_telemetry_send,  80,     75),
#endif
#if EPM_ENABLED == ENABLED
    SCHED_TASK(epm_update,            40,     75),
#endif
#ifdef USERHOOK_FASTLOOP
    SCHED_TASK(userhook_FastLoop,      4,     75),
#endif
#ifdef USERHOOK_50HZLOOP
    SCHED_TASK(userhook_50Hz,          8,     75),
#endif
#ifdef USERHOOK_MEDIUMLOOP
    SCHED_TASK(userhook_MediumLoop,   40,     75),
#endif
#ifdef USERHOOK_SLOWLOOP
    SCHED_TASK(userhook_SlowLoop,     120,    75),
#endif
#ifdef USERHOOK_SUPERSLOWLOOP
    SCHED_TASK(userhook_SuperSlowLoop, 400,   75),
#endif
};

scheduler->run() 是AP_Scheduler.cpp里的

void AP_Scheduler::run(uint16_t time_available)
{
最后它读取任务表(tasks),并调度执行:

 _task_time_started = now;
                task_fn_t func;
                pgm_read_block(&_tasks[i].function, &func, sizeof(func));
                current_task = i;
                func();
                current_task = -1;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值