调度代码间歇运行

本页介绍如何安排您编写的新代码间歇运行。

使用调度程序运行代码

在给定时间间隔内运行代码的最灵活方法是使用调度程序。这可以通过将新函数添加到 调度任务 数组中 Copter.cpp.请注意,实际上有两个任务列表、 上榜 是用于高速 CPU(如 Pixhawk),而 下表 适用于速度较慢的 CPU(即 APM2)。

添加任务非常简单,只需在列表中新建一行即可(列表中越高表示优先级越高)。第一列是函数名称,第二列是以 2.5ms 为单位的数字(如果是 APM2,则以 10ms 为单位)。因此,如果您希望以 400Hz 的频率执行函数,这一列将包含 "1",如果您希望以 50Hz 的频率执行函数,这一列将包含 "8"。最后一列是函数预计需要的微秒数(即百万分之一秒)。这有助于调度程序猜测,在主循环开始下一次迭代之前,是否有足够的时间运行您的函数。

/*
  调度  - 一应俱全 正常 任务 分开   快速循环()
    上市 这里, 沿着  如何 时常 她们   人称
  ( 10毫秒 单位)   最大 时间 她们  预期  从...中获取 (
  微秒)
 */
天电  AP_Scheduler::任务 调度任务[] PROGMEM = {
    { 更新_GPS,            2,     900 },
    { 更新导航模式,       1,     400 },
    { 中环,           2,     700 },
    { 更新高度,      10,    1000 },
    { 50_hz_loop,         2,     950 },
    { 运行导航更新,      10,     800 },
    { 慢速循环,            10,     500 },
    { gcs_check_input,       2,     700 },
    { gcs_send_heartbeat,  100,     700 },
    { gcs_data_stream_send,  2,    1500 },
    { gcs_send_deferred,     2,    1200 },
    { 罗盘累积,    2,     700 },
    { 气压计累积,  2,     900 },
    { 超级慢速循环,     100,    1100 },
      { 我的新函数,      10,     200 },
    { perf_update,        1000,     500 }
};

将您的代码作为其中一个循环的一部分运行

与其在调度程序任务列表中创建一个新条目,不如将函数添加到现有的定时循环中。与上述方法相比,除了快速循环外,这种方法并无实际优势。将函数添加到快速循环中意味着它将以尽可能高的优先级运行(即几乎 100% 保证以 400Hz 的频率运行)。

例如,如果您希望新代码以 10Hz 的频率运行,可以将其添加到 ten_hz_logging_loop() 中的函数 Copter.cpp.

// ten_hz_logging_loop
//   运行  10赫兹
天电 空白 ten_hz_logging_loop()
{
    如果 (g.日志位掩码 及样品; 掩码_log_attitude_med) {
        日志写入态度();
    }
    如果 (g.日志位掩码 及样品; MASK_LOG_RCIN) {
        数据闪存.记录_写入_RCIN();
    }
    如果 (g.日志位掩码 及样品; MASK_LOG_RCOUT) {
        数据闪存.Log_Write_RCOUT();
    }
    如果 ((g.日志位掩码 及样品; MASK_LOG_NTUN) &&; 模式要求使用 GPS(控制模式)) {
        日志写入导航飞行稳定调整();
    }

        // 您的  功能 致电 这里
        我的新函数();
}