介绍
一个完整的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函数和进行阻塞操作;
相关函数、命令介绍
- 新建一个任务:
independent_task = px4_task_spawn_cmd(
"commander",
SCHED_DEFAULT,
SCHED_PRIORITY_DEFAULT + 40,
3600,
commander_thread_main,
(char * const *)&argv[0]
);
- 运行的任务查看,可以查看当前运行的所有工作队列:
top
工作队列(Work queue tasks)
工作队列有以下特点:
- 一个工作队列中所有的线程必须是协调的,因为他们共享优先级,无法打断对方;
- px4支持多个工作队列,每个工作队列包含多个线程;
- 每个线程应该是按一定周期调度更新,或者按uorb的话题更新来更新
- 在线程中不允许实用sleep、poll、阻塞IO等会导致延时的操作。
- 避免在线程中进行大量运算,一般每个线程的一次cpu消耗时间应该只有几十个微秒。
相关函数、命令介绍
- 依赖:
使用时需要在cMakefile.txt里面添加依赖
DEPENDS
px4_work_queue
- 必须继承ScheduledWorkItem类。
在构造函数中,需要通过配置,将线程绑定到指定的工作队列中。
WorkItemExample::WorkItemExample() :
ModuleParams(nullptr),
ScheduledWorkItem(MODULE_NAME, px4::wq_configurations::test1)
{
}
- 需要提供指定一种调度方式,如延时运行、定时运行、触发运行等:
ScheduleOnInterval(1000);
- 运行的工作队列查看,可以查看当前运行的所有工作队列:
work_queue status
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)