调度代码间歇运行¶
本页介绍如何安排您编写的新代码间歇运行。
使用调度程序运行代码¶
在给定时间间隔内运行代码的最灵活方法是使用调度程序。这可以通过将新函数添加到 调度任务 数组中 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 的频率运行)。
快速循环 运行频率:APM2 为 100Hz,Pixhawk 为 400Hz
50_hz_loop 频率:50 赫兹
ten_hz_logging_loop:运行频率为 10 赫兹
3_hz_loop频率:3.3 赫兹
1_hz_loop :运行频率为 1 赫兹
例如,如果您希望新代码以 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(控制模式)) {
日志写入导航飞行稳定调整();
}
// 您的 新 功能 致电 这里
我的新函数();
}