PX4/Pixhawk 教程 - 任务线程 - workqueue 和 task

2023-05-16

介绍

一个完整的px4的应用程序(或者叫任务)分为前台部分和后台部分,前台部分是跑在shell任务中的,比如helloworld那个程序就只有前台部分,敲入指令即可在ssh中运行,前台部分一般是用来测试或者启动后台任务。

px4的后台任务主要油两种,一种叫任务(Tasks),一种叫工作队列(Work queue tasks)。两者的主要区别是任务拥有独立的栈空间和进程优先级,而工作队列是跑在一个统一的进程里的多个线程,共享优先级、栈空间。

优缺点对比

任务:优点是可以保证优先级的切换;可以进行阻塞操作;

工作队列:优点是消耗更少的RAM和cpu(因为避免了任务切换);时基实时性好,支持定时任务,适合周期性的传感器数据读取;

时基实时性,比如一个任务需要在t1,t2,t3,t4时刻进行操作,有的任务希望保证t2-t1,t3-t2,t4-t3这种相对时间间隔的准确性,这种场景任务更适合;而有的任务希望保证t2-t1,t3-t1,t4-t1这种相对于初始时刻的绝对时间的准确性,这种场景下工作队列更适合。

任务(Tasks)

任务的特点:

  • 拥有独立的栈空间;
  • 低优先级的任务会被高优先级的任务打断;
  • 允许使用sleep函数和进行阻塞操作;

相关函数、命令介绍

  1. 新建一个任务:
independent_task = px4_task_spawn_cmd(
    "commander",                    // Process name
    SCHED_DEFAULT,                  // Scheduling type (RR or FIFO)
    SCHED_PRIORITY_DEFAULT + 40,    // Scheduling priority
    3600,                           // Stack size of the new task or thread
    commander_thread_main,          // Task (or thread) main function
    (char * const *)&argv[0]        // Void pointer to pass to the new task
                                    // (here the commandline arguments).
    );
  1. 运行的任务查看,可以查看当前运行的所有工作队列:
top

工作队列(Work queue tasks)

工作队列有以下特点:

  • 一个工作队列中所有的线程必须是协调的,因为他们共享优先级,无法打断对方;
  • px4支持多个工作队列,每个工作队列包含多个线程;
  • 每个线程应该是按一定周期调度更新,或者按uorb的话题更新来更新
  • 在线程中不允许实用sleep、poll、阻塞IO等会导致延时的操作。
  • 避免在线程中进行大量运算,一般每个线程的一次cpu消耗时间应该只有几十个微秒。

相关函数、命令介绍

  1. 依赖:
    使用时需要在cMakefile.txt里面添加依赖
DEPENDS
   px4_work_queue
  1. 必须继承ScheduledWorkItem类。
    在构造函数中,需要通过配置,将线程绑定到指定的工作队列中。
WorkItemExample::WorkItemExample() :
    ModuleParams(nullptr),
    ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::test1)
{
}
  1. 需要提供指定一种调度方式,如延时运行、定时运行、触发运行等:
ScheduleOnInterval(1000);//单位是微秒
  1. 运行的工作队列查看,可以查看当前运行的所有工作队列:
work_queue status
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4/Pixhawk 教程 - 任务线程 - workqueue 和 task 的相关文章

  • Rails rake 任务是否提供对 ActiveRecord 模型的访问?

    我正在尝试创建自定义 rake 任务 但似乎我无权访问我的模型 我认为这是 Rails 任务中隐含的内容 我在 lib tasks test rake 中有以下代码 namespace test do task new task do pu
  • 为什么我的 Spark 工作中有这么多任务?默认获取 200 个任务

    我有一个 Spark 作业 它从 hdfs 获取一个包含 8 条记录的文件 进行简单的聚合并将其保存回 hdfs 我注意到当我这样做时有数百个任务 我也不确定为什么有多个工作 我认为工作更像是一个动作发生的时候 我可以推测原因 但我的理解是
  • 在 C++/CLI 中使用 .NET (3.5) 任务并行库

    好吧 我下载了 Reactive Extensions for NET 3 5 以便在 Visual Studio 2008 中通过 c cli 使用它 但所有任务并行库示例都是用 C 编写的 我什至无法弄清楚将简单的 C 语句转换为 C
  • 并行下载大量文件的有效方法

    我正在尝试从互联网下载大量文件 图片 我正在努力处理异步 并行 因为 a 我不能说是否有文件 我刚刚收到一百万个链接 其中要么是一张图片 300kb 到 3MB 要么是 404 页面不存在 因此 为了避免下载 0 字节文件 我询问同一页面两
  • 在JavaFX中后台执行任务

    我想在 TilePane 中加载最多九个面板 对于每个窗格 我必须首先运行内容计算 大约 300 毫秒 然后必须构建面板 大约 500 毫秒 我想要的是 有九个 ProgressIndicators 在计算后与每个面板进行交换 我尝试过Pl
  • 并发任务更新复杂对象 JavaFX - swingworker 等效项?

    我想在后台运行一个任务 更新视图中的中间结果 我正在尝试实现 MVC JavaFX 应用程序 任务在模型中定义 我想将部分结果发送给主要威胁 以便在视图中显示它们 我使用 updateValue 来执行此操作 另外 我在控制器中定义了对象属
  • 将同步代码包装为异步任务的最佳方法是什么?

    我正在实现一个异步接口方法 返回任务 然而 我的实现必然是同步的 最好的方法是什么 有一些内置的方法可以做到这一点吗 以下是我正在考虑的几个选项 选项 1 Task FromResult return Task FromResult Com
  • JavaFX 任务线程未终止

    我正在编写一个 JavaFX 应用程序 我的对象扩展了 Task 以提供远离 JavaFX GUI 线程的并发性 我的主要课程如下所示 public class MainApp extends Application Override pu
  • 为什么 C# Parallel.Invoke 很慢?

    我正在这样做 private static void Main string args var dict1 new Dictionary
  • 如何处理Task.Run异常

    我在捕获异常时遇到问题Task Run这是通过更改代码解决的 如下所示 我想知道这两种方式处理异常之间的区别 In the Outside方法我无法捕获异常 但是在Inside方法我可以 void Outside try Task Run
  • 在 MVC 中从同步调用异步而没有等待时,TPL 任务死锁

    我知道在同步 MVC 方法中调用异步方法 同时使用 Wait 或 Result 等待任务完成时 存在 TPL 死锁陷阱 但我们刚刚在 MVC 应用程序中发现了一个奇怪的行为 同步操作调用异步方法 但由于它是触发器 因此我们从未等待它完成 尽
  • 异步运行 PHP 任务

    我正在开发一个较大的 Web 应用程序 后端主要是 PHP 代码中有几个地方我需要完成某些任务 但我不想让用户等待结果 例如 当创建一个新帐户时 我需要向他们发送一封欢迎电子邮件 但是 当他们点击 完成注册 按钮时 我不想让他们等到电子邮件
  • 在 UI 线程上创建并启动任务

    当在工作线程上调用的方法需要在 UI 线程上运行代码并等待其完成后再执行其他操作时 可以这样做 public int RunOnUi Func
  • 在特定时间启动应用程序

    我想知道是否有可能 以及如何 在特定时间启动我的应用程序 就像在特定时间响起的闹钟一样 假设我希望我的应用程序在早上 8 点启动 这可行吗 您可以使用 AlarmManager 来完成此操作 这是一个简短的示例 首先你需要设置闹钟 Alar
  • 在 VSCode 的集成终端中运行任务?

    当我过去运行任务 tasks json 时 它们在 VSCode 的集成终端内运行 但是 在重置我的开发计算机并重新安装所有内容后 我的任务现在在新的 cmd 窗口中运行 当任务因错误而失败时 就会出现问题 在这种情况下 cmd 窗口刚刚关
  • 异步调用的任务限制?

    我有一个同步工作的 NET 4 5 WCF 客户端 我正在更新它以使用新的异步 等待功能来进行多个同时服务器调用以同时获取数据块 在结束之前 我担心同时运行的所有线程将使服务器饱和 更不用说明年升级到该角色时会终止我的 Azure 辅助角色
  • 如何按顺序而不是并行等待 C# 任务?

    我有一组异步测试 它们在外部硬件上运行 我可以按顺序运行它们 但因为所有这些测试都有副作用 所以我希望能够重新排列它们并一遍又一遍地运行它们 当我将它们放入列表中并尝试等待每个之后 它们全部并行运行 而不是 1 个 1 个运行 我希望能够打
  • 如何为新任务类型扩展 Gradle 任务的行为?

    我想为一些测试任务设置一些东西 更具体地说 我想添加一些环境变量和一些系统属性 也许还有一些其他内容 例如 依赖项 或 workingDir 与常规的Test任务我可以做到这一点 task test1 type Test dependsOn
  • 将多个 rake 任务合并为一个 rake 任务

    而不是像这样单独运行每个 rake 任务 rake db drop rake db create rake db migrate rake db load 我想运行一个可以完成所有任务的 rake 任务 这就是我的 rakefile des
  • 如何启动异步任务对象

    我想开始收集Task同时处理对象并等待所有对象完成 下面的代码显示了我想要的行为 public class Program class TaskTest private Task createPauseTask int ms works w

随机推荐

  • (音视频开发)WebRTC进阶流媒体服务器开发-多人互动架构

    一 xff1a 多人互动架构方案 xff08 一 xff09 WebRTC回顾 xff0c 两层含义 xff1a 1 WebRTC是google开源的流媒体客户端 xff0c 可以进行实时通讯 xff0c 主要应用于浏览器之间进行实时通讯
  • Linux C/C++后台开发高级架构师进阶指南-剑指腾讯T9

    C 43 43 后台开发是一个庞杂的技术栈 xff0c 因为没有统一的开发框架并且应用行业非常广泛 所有涉猎广泛 xff0c 这里就把C C 43 43 43 43 后台开发的技术点进行整理总结 xff0c 看完以后 xff0c 不会让你失
  • 如何让shell脚本变成可执行文件

    导读在本教程中介绍创建bash脚本并使用chmod命令使脚本可执行 xff0c 无需脚本前面加上sh或bash命令就可以运行它 创建脚本文件 第一步是使用以下命令创建一个扩展名为 sh的新文件 xff1a root 64 localhost
  • Fast-RTPS

    Fast RTPS是eprosima对于RTPS的C 43 43 实现 xff0c 是一个免费开源软件 xff0c 遵循Apache License 2 0 Fast RTPS现在被称为Fast DDS xff0c 作为ROS2的默认中间件
  • 如何使你的直流电机闭环?(PID讲解)

    前言 xff1a 看了看很多大佬写的PID讲解很全面也很复杂 xff0c 实在是不适合很多萌新入坑 xff0c 所以想按自己的理解写一篇通俗易懂的PID算法讲解 一 xff1a PID的基本定义 PID xff0c 就是 比例 xff08
  • Linux内核深度解析之中断、异常和系统调用——系统调用

    系统调用 系统调用是内核给用户程序提供的编程接口 用户程序调用系统调用 xff0c 通常使用glibc库针对单个系统调用封装的函数 如果glibc库没有针对某个系统调用封装的函数 xff0c 用户程序可以使用通用的封装函数syscall x
  • 面试题(嵌入式经典)

    1 用预处理指令 define声明一个常数 xff0c 用以表明1年中有多少秒 xff08 忽略闰年问题 xff09 define SECONDS PER YEAR 60 60 24 365 UL 2 写一个 标准 宏MIN xff0c 这
  • 择业面对选择,嵌入式 or 互联网,该进哪个?

    这个话题可能是不少电子相关专业的毕业生面临的困惑 xff0c 怎么选择 xff0c 可以听听别人的意见来作为参考 xff0c 但最终还是要由自己的兴趣和爱好决定 知乎上有这样一个提问 xff1a 本人大一开始玩各种单片机 FPGA DSP
  • 大疆无人机-图传技术

    大疆无人机 xff08 航拍器 xff09 遥控连接电脑驱动解决方案 http mini eastday com mobile 160722051432373 html 无人机系列之图传技术https blog csdn net ad360
  • 【2】uC/OS-III应用开发————>启动流程(STM32F767)

    简述 xff1a 上电启动 xff0c 分为三个阶段 CPU内核的初始化 xff0c ARM公司编写 xff0c 所用CPU的 s文件外设模块的初始化OS相关操作的初始化 启动 调度等等系统的启动 上电执行启动文件里面的复位函数Reset
  • Windows11原版镜像

    Windows 11 xff08 企业版 xff09 版本 22H2 xff08 2023年02月发布 xff09 64 位简体中文 文件 xff1a zh cn windows 11 business editions version 2
  • 树莓派操作系统

    树莓派操作系统 树莓派操作系统 介绍更新和升级树莓派操作系统 使用 APT使用 rpi 更新播放音频和视频 OMXPlayer 应用程序如何播放音频如何播放视频播放期间的选项在后台播放使用 USB 网络摄像头 基本用法自动化图像捕获延时拍摄
  • ARM平台FS6818/s5p6818开发板实验7 —— 通过I2C读取MMA8451三轴加速度传感器芯片实现计步器功能的实验

    实验目的 掌握I2C协议的内容 xff0c 了解I2C接口的特点 了解陀螺仪MMA8451的用途及数据采集过程 熟悉s5p6818处理器的I2C配置 xff0c 完成通过I2C读取MMA8451三轴加速度传感器芯片和加速度的改变实现计步功能
  • uC/OS-II 一些细节问题

    最高和最低优先级的任务最好不要使用 xff0c 而用户使用的任务多达56个 xff0c 0表示最高优先级 建立任务的函数有两个 OSTaskCreate OSTaskCreateExt xff08 可设置更多任务细节 xff09 OSSta
  • CubeMX配置FreeRTOS

    01 说在前面 RTOS为了提高任务调度效率一般都包含汇编程序 xff0c 因此移植起来需要一些汇编知识 xff0c 就算网上肯定有移植教程 xff0c 初次搞起来还是挺费劲的 初学时对RTOS代码不熟悉 xff0c 一开始就打击了积极性可
  • 云台控制协议VISCA、PELCO-D、PELCO-P

    1 VISCA部分协议命令 控制 命令 格式 备注 预置点 清除预置点 8X 01 04 3F 00 ZZ FF X 61 1 7 8是广播码 xff0c 下同 xff1b ZZ 61 00 3F xff0c 共64个预置点 设预置点 8X
  • lpms-ig1 IMU使用

    1 xff09 打开网址 https bitbucket org lpresearch lpmsig1opensourcelib 实现1 2 3块编译 2 xff09 给串口 ttyUSB0 赋予权限sudo chmod 777 dev t
  • Vitis AI1.1 系列教程1 - 软件安装

    这里写自定义目录标题 我的安装环境 安装过程在VMware中安装ubuntu 16 04安装Vitis AI几个常见的docker指令 我的安装环境 windows 10VMware 15 5Vitis AI 1 1ubuntu 16 04
  • PX4/Pixhawk - 编译环境搭建

    最近在学习px4的二次开发 xff0c 发现网上的环境搭建教程五花八门 xff0c 大多复杂 xff0c 重重踩坑之后 xff0c 发现还是官方的教程好使 xff0c 总结如下 xff1a 环境准备 采用vmware虚拟机搭建环境系统是ub
  • PX4/Pixhawk 教程 - 任务线程 - workqueue 和 task

    介绍 一个完整的px4的应用程序 xff08 或者叫任务 xff09 分为前台部分和后台部分 xff0c 前台部分是跑在shell任务中的 xff0c 比如helloworld那个程序就只有前台部分 xff0c 敲入指令即可在ssh中运行