Template for Developing a Complete Application
一个应用程序既可以编写为以“任务”(具有自身堆栈和进程优先级的模块)的形式运行,也可以编写为以“工作队列任务”(在工作队列线程上运行的模块,与工作队列上的其他任务共享堆栈和线程优先级)的形式运行。 在大多数情况下,可以使用工作队列任务,因为这会减少资源的使用。
INFO
架构概述 > 运行时环境 提供了有关任务和工作队列任务的更多信息。
INFO
在 首个应用程序教程 中学到的所有内容都与编写完整应用程序相关。
工作队列任务
PX4-Autopilot 包含一个用于编写作为“工作队列任务”运行的新应用程序(模块)的模板: src/examples/work_item。
工作队列任务应用程序与普通(任务)应用程序相同。除了它需要指定它是一个工作队列任务,并在初始化期间运行调度它本身。
示例显示了如何操作。 总结如下:
- 在 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 中。
实现
ScheduledWorkItem::Run()
方法以执行“工作”。实现
task_spawn
方法,指定该任务是一个工作队列(使用task_id_is_work_queue
标识符)。使用其中一种调度方法调度工作队列任务(在示例中,我们在
init
方法中使用ScheduleOnInterval
)。
任务
PX4/PX4-Autopilot 包含一个用于编写在其自身堆栈上作为任务运行的新应用程序(模块)的模板: src/templates/template_module。
该模板演示了完整应用程序所需或有用的以下附加功能/方面: