PX4-4-任务调度

2023-05-16

PX4所有的功能都封装在独立的模块中,uORB是任务间数据交互和同步的工具,而管理和调度每个任务,PX4也提供了一套很好的机制,这一篇我们分享PX4的任务调度机制。

我们以PX4 1.11.3版本为例

PX4的任务调度方式有两种:

  • 任务 (Tasks): 模块在它自己的任务中运行, 具有自己的堆栈和进程优先级(这是更常见的方法)。

  • 工作队列 (Work queues):模块在共享任务上运行, 这意味着它没有自己的堆栈。多个任务在同一堆栈上运行, 每个工作队列只有一个优先级。

工作队列的优点是 RAM 占用更少,减少任务切换,缺点是队列任务不能休眠,也不能轮询消息。对于运行时间比较长的任务应该使用Tasks或者在一个独立的工作队列中

工作队列(work Queue)用于执行周期性任务, 如传感器驱动程序。

Task

使用工作队列功能需要使用任务队列的任务需要继承ModuleBase,这个类提供了队列需要的方法,其继承关系如图所示:

 

由上图我们可以知道:

  • 任务模块通过xxx_main()函数启动,这个函数是系统执行该任务的入口函数

  • ModuleBase类封装了任务管理所需要的基础功能,如:start、stop、status、help、info等

  • ModuleBase通过px4_task_spawn_cmd函数启动任务,这个函数封装了pthread的接口

  • Task模块通过Run函数运行任务,这里需要一个while循环,用于周期性执行

工作队列

使用工作队列功能需要继承ScheduledWorkItem,这个类提供了队列需要的方法,其继承关系如图所示:

 队列执行时序图:

 

X4的任务队列调用稍微复杂一些,由上述时序图,工作队列的调度设计一个高精度定时中断hrt和一个队列管理线程WorkQueueManager,它的设计目的是提供一个高精度的周期性任务调度方法。

在hrt定时器中对插入周期任务的队列检测是否到达执行时间,如果需要运行则将需要执行的周期任务添加进WorkQueue中,在高优先级线程WorkQueueRunner检测是否有插入需要运行的任务,在该线程中执行该任务。

这样设计的优点:

  • 使用hrt的高精度定时中断可以确保周期调度的精度,这个中断运行周期为1MHz,理论最小调度分辨率为1us,远高于使用rtos的调度分辨率,它取决于rtos的时间片轮长度,一般情况是1ms

  • 多个工作队列共享一个WorkQueueRunner线程,因此队列任务是共享堆栈的,可以减小RAM的使用

  • 多个工作队列在一个线程中是顺序执行的,可以减少任务切换的次数

  • 工作队列任务时间过长可能会造成线程中其他队列任务延时,因此队列任务不能运行执行时间过长的任务

以上的图表是使用 工欲善其事-4-绘制程序流程图icon-default.png?t=L892https://mp.csdn.net/mp_blog/creation/editor/120378942方法绘制,由于微信不能插入该绘图插件,因此采用图片方式上传,显示的分辨率可能有限。

需要图表源代码的同学可以在我的公众号中回复 任务调度 关键字获取,直接将源码复制到typora编辑器的源代码编辑模式中即可显示出图表,也可以自行编辑补充图表。

  往期分享:

PX4-2-系统架构浅析_AcmeUav的博客-CSDN博客

工欲善其事-3-整理技术笔记(gitbook)_AcmeUav的博客-CSDN博客

使用3D地面站(AcmeGCS)的编队飞行_AcmeUav的博客-CSDN博客

这个博客转载自我个人的微信公众号,这里会不定期更新一些我整理的无人机相关知识和个人设计,欢迎添加关注。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PX4-4-任务调度 的相关文章

  • PX4使用I2C方式添加自定义传感器(1)

    PX4使用I2C方式添加自定义传感器 xff08 1 xff09 前言 毕业设计就是要在PX4上添加一个传感器 xff08 角度传感器 xff09 xff0c 由于板子上的接口数量很少 xff0c 很是宝贵 最后只能选择通过I2C通信方式
  • 关于PX4中的高度若干问题

    飞行的高度是如何测量的 xff1f 地面的高度和海平面的高度差别很大 xff0c 飞控又是如何有效判别进行降落的 xff1f 这是我脑子里的疑问 搜索的一圈发现很少有人讨论这方面的问题 xff0c 于是本次我就直接看一下源代码 xff0c
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • PX4源代码下载编译

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • PX4飞控之PWM输出控制

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor xff0c DJI通用电调等都支持PWM信号来传输控制信号 常用的400Hz电调信号对应周期2500us xff0c 一般使用高电平时间1000us 2000us为有效信号区间 xf
  • PX4 ---- Indoor Flight

    文章目录 室内飞行ROS amp PX4Pose Data 飞机配置MAVROS 基于工训赛 VIO 飞行总结 室内飞行 ROS amp PX4 Pose Data 飞机配置 VIO 参考此处 xff0c 采用 T265 配置 相机与飞控机
  • PX4模块设计之一:SITL & HITL模拟框架

    PX4模块设计之一 xff1a SITL amp HITL模拟框架 1 模拟框架1 1 SITL模拟框架1 2 HITL模拟框架 2 模拟器类型3 MAVLink API4 总结 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分
  • PX4模块设计之六:PX4-Fast RTPS(DDS)简介

    64 TOC PX4模块设计之六 xff1a PX4 Fast RTPS DDS 简介 基于PX4开源软件框架简明简介的框架设计 xff0c 逐步分析内部模块功能设计 PX4 Fast RTPS DDS 具有实时发布 订阅uORB消息接口
  • PX4模块设计之十三:WorkQueue设计

    PX4模块设计之十三 xff1a WorkQueue设计 1 WorkQueue启动2 WorkQueue接口2 1 基本接口2 2 辅助接口2 3 WorkQueue任务函数2 3 1 Flat Build2 3 2 Protected
  • PX4模块设计之十六:Hardfault模块

    PX4模块设计之十六 xff1a Hardfault模块 1 Hardfault模块初始化2 Hardfault模块主程序3 Hardfault命令3 1 hardfault check status3 2 hardfault rearm3
  • PX4模块设计之三十:Hysteresis类

    PX4模块设计之三十 xff1a Hysteresis类 1 Hysteresis类简介2 Hysteresis类成员变量介绍3 Hysteresis类迟滞逻辑4 Hysteresis类重要方法4 1 Hysteresis bool ini
  • PX4模块设计之四十三:icm20689模块

    PX4模块设计之四十三 xff1a icm20689模块 1 icm20689模块简介2 模块入口函数2 1 主入口icm20689 main2 2 自定义子命令custom command2 3 模块状态print status 重载 3
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • 【STM32---任务调度】裸系统下的时间片轮询机制

    一 任务调度 众所周知 xff0c 实时多任务操作系统 xff08 RTOS xff09 是嵌入式应用软件的基础和开发平台 xff0c 因其简单易用 开源等优点被大多数嵌入式开发者使用 xff0c 但是在一些简单 实时性要求比较强的情况下
  • px4下载指定版本的固件、git用法

    https hub fastgit org PX4 PX4 Autopilot git describe tag 查看当前版本号 git tag l 查看所有版本 xff0c 也就是打个tag git checkout v1 9 1 跳转到
  • 步骤三:PX4,Mavros的下载安装及代码测试

    1 安装Mavros sudo apt install ros melodic mavros ros melodic mavros extras 2 安装Mavros相关的 geographiclib dataset 此处已经加了ghpro
  • Java定时任务调度工具详解之Quartz篇(中级)一:浅谈JobExecutionContext&JobDatai&浅谈Trigger

    概要 OpenSymphony提供的强大的开源任务调度框架 官网 http www quartz scheduler org 纯java实现 精细控制排程 特点 强大的调度功能 灵活的应用方式 分布式和集群能力 主要用到的设计模式 Buil
  • C语言实现多级反馈队列调度算法

    include

随机推荐

  • 【ubuntu16.04 LTS】设置屏幕分辨率

    第一种方式 直接打开系统设置 xff0c 选择屏幕分辨率即可 xff0c 和Windows一样 xff0c 不多说 第二种方式 如果在第一种方式中 xff0c 没有找到自己想要设置的分辨率的话 xff0c 可以按如下操作 xff1a 1 x
  • verilog中taskd的用法

    本文转载自博客园作者 xff08 id xff09 xff1a 再也不喝冰了 任务就是一段封装在 task endtask 之间的程序 任务是通过调用来执行的 xff0c 而且只有 在调用时才执行 xff0c 如果定义了任务 xff0c 但
  • Github 安装和上手记录

    1 Git xff1a 分布式版本控制软件 xff08 本地含有版本库 xff09 2 安装 xff1a msysgit github io gt 3 Download gt 安装 4 安装时除了其中一步需要选择 use git from
  • Verilog02:结构化建模

    结构化描述是用Verilog HDL 进行电路设计中最基本描述方式 对于系统级电路设计 xff0c 为了把不同的功能模块有层次地组合在一起 xff0c 主要是采用模块调用的结构化建模方式实现 根据所调用子模块的不同抽象级别 xff0c 可将
  • 有无符号数及原码反码补码之间的关系

    前提知识 xff1a 加法器比减法器的电路实现方式更简单 无符号数表示的数值范围大于0 为了简化电路设计 xff0c 引入有符号数可以表示负数 xff0c 便可以用加法器实现减法运算 使用加法器和原码进行减法运算会产生错误结果 引入反码来修
  • MIPS指令格式定义

  • PTA 浙大版《C语言程序设计(第3版)》题目集--练习2-1 Programming in C is fun!

    题目 本题要求编写程序 xff0c 输出一个短句 Programming in C is fun 输入格式 本题目没有输入 输出格式 在一行中输出短句 Programming in C is fun 思路 一个简单的输出 代码 includ
  • 带参数的宏

    定义两个带参数的宏 xff0c 一个用来求s xff0c 另一个用来求area include lt iostream gt using namespace std define s a b c a 43 b 43 c 2 define A
  • RTK和网络RTK

    浅谈传统RTK工作模式与网络RTK工作模式 谈谈传统RTK工作模式与网络RTK工作模式 传统RTK工作模式就是电台工作模式 xff0c 网络RTK工作模式就是CORS系统测量 本文主旨 有网络信号和CORS覆盖范围的地方就选择网络RTK工作
  • KITTI数据集国内下载地址

    文件列表 xff1a http www functionweb tk kitti 如果遭遇下载失败的情况请访问 https blog csdn net weixin 43599336 article details 87801040 原始图
  • HTTP ERROR 405 Method Not Allowed

    一般访问web UI的时候出现以上错误 xff0c 都是浏览器的防火墙问题 可以进行在安全设置里取消一些防护功能即可
  • 【ubuntu16.04 LTS】更换国内清华源

    目录 1 xff0c 备份原始源文件sources list2 xff0c 修改源文件sources list3 xff0c 更新源 1 xff0c 备份原始源文件sources list 在终端输入如下命令 xff1a span clas
  • 串行通信——异步串行通信

    目录 I 串口通信简介 一 定义 二 意义 三 分类 II 异步串行通信详解 一 数据格式 1 起始位 2 数据位 3 奇偶校验位 4 停止位 二 通信制式 1 单工 2 半双工 3 全双工 三 通信速率 I 串口通信简介 一 定义 在一条
  • shell发送请求解析结果

    需求shell发送请求到服务获取返回结果 xff0c 解析结果后提取需要的数据 再次请求服务 1 发送get请求到服务器 xff0c 格式化返回结果输出到result json文件 2 解析json文件并循环处理解析结果 curl命令 X
  • VScode编辑器快捷键整理

    记录 xff1a VScode编辑器快捷键记录 1 代码块折叠 展开 操作光标所在文件中的所有代码块 xff1a 折叠所有 Ctrl 43 K 43 0 展开所有 Ctrl 43 K 43 J 仅仅操作光标所处代码块内的代码 xff1a 折
  • ROS不同版本消息传递问题

    ROS不同版本消息传递问题 问题 不同版本ros间可通信 xff0c 但消息发送接收有问题 主机 xff1a x86 BECKHOFF Ubuntu16 04 ROS Kinetic 从机 xff1a ARM AGX Xavier Ubun
  • 复位电路

    单片机复位电路 系统开始运行和重新启动都是依靠复位电路实现的 以MCS 51为例 xff0c 复位是需要在RST引脚加上2个机器周期 xff08 24个时钟周期 xff09 以上的高电平 简单的计算 xff1a 如果单片机的时钟频率是12M
  • WIFI原理

    1 路由器向下提供给接入的用户一个id xff0c 也就是类似于192 168 1 231 xff0c 这样的ip地址 xff0c 所有在这个路由器下的用户的ip地址的前面的网络号是相同的 xff0c 都是192 168 1 xff08 x
  • :: 在 C++ 中的作用

    一 作用域符号 xff1a 作用域符号 的前面一般是类名称 xff0c 后面一般是该类的成员名称 xff0c C 43 43 为例避免不同的类有名称相同的成员而采用作用域的方式进行区分 另外 xff0c 在类外定义类中已申明的函数成员时 x
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版