SCHED_TASK(stats_update, 1, 100)
位置:X:\ardupilot\ArduCopter\ArduCopter.cpp
/*
update AP_Stats
*/
void Copter::stats_update(void)
{
g2.stats.update();
}
位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp
void AP_Stats::update()
{
const uint32_t now_ms = AP_HAL::millis();
if (now_ms - last_flush_ms > flush_interval_ms) {//30000,等半分钟以上,执行一次
update_flighttime();//统计飞行时间
update_runtime();//统计上电时间
flush();//保存时间
last_flush_ms = now_ms;
}
const uint32_t params_reset = params.reset;
if (params_reset != reset || params_reset == 0) {//重置参数
params.bootcount.set_and_save(params_reset == 0 ? 1 : 0);
params.flttime.set_and_save(0);//时间清零
params.runtime.set_and_save(0);
uint32_t system_clock = hal.util->get_system_clock_ms() / 1000;
// can't store Unix seconds in a 32-bit float. Change the
// time base to Jan 1st 2016:
system_clock -= 1451606400;
params.reset.set_and_save(system_clock);
copy_variables_from_parameters();//清零本地变量
}
}
位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp
void AP_Stats::update_flighttime()//飞行时间积分
{
if (_flying_ms) {
const uint32_t now = AP_HAL::millis();
const uint32_t delta = (now - _flying_ms)/1000;//s
flttime += delta;//seconds in flight (or driving)
_flying_ms += delta*1000;//ms
}
}
位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp
void AP_Stats::update_runtime()
{
const uint32_t now = AP_HAL::millis();
const uint32_t delta = (now - _last_runtime_ms)/1000;
runtime += delta;
_last_runtime_ms += delta*1000;
}
位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp
void AP_Stats::flush()
{
params.flttime.set_and_save(flttime);
params.runtime.set_and_save(runtime);
}
位置:X:\ardupilot\libraries\AP_HAL\Util.cpp
uint64_t AP_HAL::Util::get_system_clock_ms() const
{
#if defined(__APPLE__) && defined(__MACH__)
struct timeval ts;
gettimeofday(&ts, nullptr);
return ((long long)((ts.tv_sec * 1000) + (ts.tv_usec / 1000)));
#elif CONFIG_HAL_BOARD == HAL_BOARD_CHIBIOS
return ST2MS(chVTGetSystemTime());
#else
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);//0
const uint64_t seconds = ts.tv_sec;
const uint64_t nanoseconds = ts.tv_nsec;
return (seconds * 1000ULL + nanoseconds/1000000ULL);
#endif
}
位置:X:\ardupilot\libraries\AP_Stats\AP_Stats.cpp
void AP_Stats::copy_variables_from_parameters()
{
flttime = params.flttime;
runtime = params.runtime;
reset = params.reset;
}
这个比较简单,不需要分析,看看就懂了。
下一个。。。。。