PX4-4-任务调度

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博客

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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
PX4-Gazebo是指在PX4无人机开发中使用的Gazebo仿真软件。Gazebo是一个能够模拟现实世界的仿真软件,可以在其中运行PX4无人机模型。在PX4的源代码中,已经提供了PX4无人机的Gazebo模型,通过运行相应的launch文件,可以在Gazebo中模拟无人机的行为。\[1\] 在使用PX4-Gazebo时,可能会遇到一些问题。例如,可能会出现内存不足的情况。解决方法可以是为Ubuntu挂载一个8G的swap虚拟内存。具体的操作可以参考相关链接。\[2\] 另外,有时在运行PX4-Gazebo时,可能会遇到没有弹出Gazebo仿真界面的情况。这可能是因为需要使用root权限运行。可以尝试使用sudo命令来运行相应的指令。\[2\] 此外,关于PX4-Gazebo的目录结构建立,可以参考相关链接中的说明。在使用PX4源代码时,需要注意执行git submodule update --init --recursive命令,以获取所需的每个模块的代码。\[3\] 总之,PX4-Gazebo是一个用于模拟PX4无人机行为的仿真软件,使用时需要注意相关的配置和操作步骤。 #### 引用[.reference_title] - *1* [PX4无人机-Gazebo仿真实现移动物体的跟踪](https://blog.csdn.net/qq_44939973/article/details/120965458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [PX4无人机仿真_Gazebo(1)](https://blog.csdn.net/yanwumuxi/article/details/80097294)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值