Skip to content

Template for Developing a Complete Application

一个应用程序既可以编写为以“任务”(具有自身堆栈和进程优先级的模块)的形式运行,也可以编写为以“工作队列任务”(在工作队列线程上运行的模块,与工作队列上的其他任务共享堆栈和线程优先级)的形式运行。 在大多数情况下,可以使用工作队列任务,因为这会减少资源的使用。

INFO

架构概述 > 运行时环境 提供了有关任务和工作队列任务的更多信息。

INFO

首个应用程序教程 中学到的所有内容都与编写完整应用程序相关。

工作队列任务

PX4-Autopilot 包含一个用于编写作为“工作队列任务”运行的新应用程序(模块)的模板: src/examples/work_item

工作队列任务应用程序与普通(任务)应用程序相同。除了它需要指定它是一个工作队列任务,并在初始化期间运行调度它本身。

示例显示了如何操作。 总结如下:

  1. 在 cmake 定义文件(CMakeLists.txt)中指定对工作队列库的依赖:

... DEPENDS px4_work_queue


2. 除了 `ModuleBase` 之外,该任务还应派生自 `ScheduledWorkItem`(包含在 [ScheduledWorkItem.hpp](https://github.com/PX4/PX4-Autopilot/blob/main/platforms/common/include/px4_platform_common/px4_work_queue/ScheduledWorkItem.hpp) 中)

3. 在构造函数初始化中指定要添加任务的队列。
[work_item](https://github.com/PX4/PX4-Autopilot/blob/main/src/examples/work_item/WorkItemExample.cpp#L42) 示例将自身添加到 `wq_configurations::test1` 工作队列中,如下所示:

```cpp
WorkItemExample::WorkItemExample() :
    ModuleParams(nullptr),
    ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::test1)
{
}

INFO

可用的工作队列(wq_configurations)列在 WorkQueueManager.hpp 中。

  1. 实现 ScheduledWorkItem::Run() 方法以执行“工作”。

  2. 实现 task_spawn 方法,指定该任务是一个工作队列(使用 task_id_is_work_queue 标识符)。

  3. 使用其中一种调度方法调度工作队列任务(在示例中,我们在 init 方法中使用 ScheduleOnInterval)。

任务

PX4/PX4-Autopilot 包含一个用于编写在其自身堆栈上作为任务运行的新应用程序(模块)的模板: src/templates/template_module

该模板演示了完整应用程序所需或有用的以下附加功能/方面:

  • 访问参数并对参数更新做出反应。
  • 订阅、等待主题更新。
  • 通过 start/stop/status 控制在后台运行的任务。 然后,module start [<arguments>] 命令可以直接添加到 启动脚本 中。
  • 命令行参数解析。
  • 文档:PRINT_MODULE_* 方法有两个用途(API 在 源代码 中有记录):
    • 当在控制台中输入 module help 时,它们用于打印命令行用法。
    • 它们会通过脚本自动提取,以生成 模块与命令参考 页面。