Skip to content

Шаблон модуля для повноцінних додатків

Програма може бути написана для запуску як задача (модуль з власним стеком і пріоритетом процесу) або як задача робочої черги (модуль, який виконується у потоці робочої черги, розділяючи стек і пріоритет потоку з іншими завданнями у робочій черзі). У більшості випадків можна використовувати завдання робочої черги, оскільки це мінімізує використання ресурсів.

Огляд архітектури > середовища виконання надає додаткову інформацію про завдання та завдання робочої черги.

Все, що ви дізнаєтесь з Перший додаток, є актуальним для написання повноцінної програми.

Завдання робочої черги

PX4-Autopilot містить шаблон для написання нової програми (модуля), яка запускається як задача робочої черги: src/examples/work_item.

Програма-задача робочої черги - це така сама програма, як і звичайна (задача), за винятком того, що їй потрібно вказати, що вона є задачею робочої черги, і запланувати свій запуск під час ініціалізації.

Приклад показує, як. У підсумку:

  1. Вкажіть залежність від бібліотеки робочих черг у файлі визначення cmake (CMakeLists.txt):

    ...
    DEPENDS
       px4_work_queue
  2. На додаток до ModuleBase, завдання також має походити від ScheduledWorkItem (включається з ScheduledWorkItem.hpp)

  3. Вкажіть чергу, до якої додати завдання у конструкторі ініціалізації. Приклад work_item додає себе до робочої черги wq_configurations::test1, як показано нижче:

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

    Доступні робочі черги (wq_configurations) перелічено у WorkQueueManager.hpp.

:::

  1. Реалізуйте метод ScheduledWorkItem::Run(), щоб виконати "work".
  2. Реалізувати метод task_spawn, який вказує, що задача є робочою чергою (використовуючи id task_id_is_work_queue.
  3. Заплануйте завдання робочої черги за допомогою одного з методів планування (у прикладі ми використовуємо ScheduleOnInterval з методу init).

Задачі

PX4/PX4-Autopilot містить шаблон для написання нового додатку (модуля), який запускається як задача на власному стеку:src/templates/template_module.

Шаблон демонструє наступні додаткові функції/аспекти, які є необхідними або корисними для повноцінної роботи програми:

  • Доступ до параметрів та реагування на оновлення параметрів.
  • підписки на uORB та очікування оновлень теми.
  • Керування завданням, яке виконується в фоновому режимі через start/stop/status. Команда module start [<arguments>] може бути безпосередньо додана до команди startup script.
  • Парсинг аргументів командного рядка.
  • Документація: методи PRINT_MODULE_* служать для двох цілей (API задокументовано у вихідному коді):
    • Вони використовуються для виведення інформації про використання командного рядка при введенні module help на консолі.
    • Вони автоматично витягуються скриптом для створення сторінки Modules & Commands Reference.