查看: 1147|回复: 0

PX4飞控 -任务调度

[复制链接]

37

主题

739

帖子

1474

积分

金牌飞友

Rank: 6Rank: 6

积分
1474
飞币
731
注册时间
2017-8-28
发表于 2022-11-15 18:12:01 | 显示全部楼层 |阅读模式
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,这个类提供了队列需要的方法,其继承关系如图所示:

PX4飞控 -任务调度w2.jpg

队列执行时序图:

PX4飞控 -任务调度w3.jpg

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

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

这样设计的优点:

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

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

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

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


以上的图表是使用 工欲善其事-4-绘制程序流程图 方法绘制,由于微信不能插入该绘图插件,因此采用图片方式上传,显示的分辨率可能有限。

源自:AcmeUavs
往期推荐阅读
往期热文(点击文章标题即可直接阅读):
    我国首架35克超微侦察无人机-蜂鸟惊艳阿布扎比防务展

    我国首个实用化无人机“蜂群”,中国电科单车发射48架巡飞弹

    揭秘无人机自动机场 — 换电机场VS充电机场

    汉王智能仿生机器鸟 !小孩大人都抢着玩

    极飞的泡沫还能够吹多久?下一个暴雷的会不会是极飞?

    走进飞思无人科研平台,让无人智能科研更简单


    上海特金推出国内首个城市级网格化无人机管控系统


PX4飞控 -任务调度w4.jpg

PX4飞控 -任务调度w5.jpg

您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表