ArduPilot 第2章 任务调度


参考文献
https://blog.csdn.net/guanzhiyuan1994/article/details/51327451

前言

本文主要介绍Ardupilot任务调度,Ardupilot通过定时器定时调度一系列任务实现任务调度

一、定义任务

Ardupilot程序与arduino的形式类似,包含一个setup()函数与一个loop()函数。setup()只执行一次,loop()函数在setup()函数执行后循环执行。
为了执行任务首先要将任务定义出来。在ArduCopter.cpp程序中,首先在 AP_Scheduler::Task Copter::scheduler_tasks[]中定义了一系列要完成的任务。
第一个参数是要调用的函数,
第二个参数通过定义tick的个数(一个tick为1/400Hz=2.5ms)来定义执行的频率。
第三个参数为该任务的最大执行时间,这在后面scheduler.run(time_available)函数中将用来判断是否要继续执行该任务。

请添加图片描述

二、任务调度

1.run函数调用

代码如下(示例):
这些AP_Scheduler::Task Copter::scheduler_tasks[]数组中定义的任务将在loop()函数中scheduler.run(time_available)语句中被执行。
进入scheduler.run()函数中,for (uint8_t i=0; i<_num_tasks; i++)表示飞控程序并没有设置这些任务的优先级,而是从第一个任务开始,使用一个for循环依次向下执行。
\libraries\AP_Scheduler\AP_Scheduler.cpp
请添加图片描述

2.执行频率

(1)其中dt = _tick_counter - _last_run[i];得到的dt用来保证这些任务按指定的频率执行。
(2)若第一个任务执行频率为100Hz,即4个tick,那么在第一次进入这个语句时dt=1,不满足下面的if (dt >= interval_ticks) 语句, _last_run[i]不变。
(3)而在loop()函数中,每进行一次循环经历2.5ms(由ins().wait_for_sample();函数保证2.5ms的周期), _tick_counter在scheduler.tick();加1
请添加图片描述

请添加图片描述
(4)经历四个tick之后,再次进入之前提到的for循环,此时对于第一个任务dt=4,满足if (dt >= interval_ticks) 条件,任务将得到执行,之后记录下这一次执行的tick次数,赋值给 _last_run[i],以此来保证每个任务的执行频率。
(5)在任务执行时,还会通过if (_task_time_allowed <= time_available)语句判断剩余时间是否足够执行该任务,一次来保证每次循环执行的时间。其中_task_time_allowed 就是之前在 AP_Scheduler::Task Copter::scheduler_tasks[]输入的第三个参数。
(6)除AP_Scheduler::Task Copter::scheduler_tasks[]中定义的任务外,在loop()函数中还有一个fast_loop()函数,这个函数中的任务将以400Hz的频率执行。fast_loop()中的任务调度可以参考
http://wenku.baidu.com/link?url=wRKUgK3NIKTajkGow6VTjGt0tLBBhYNzXDvHmpz2S4Vdv1lLlHBNHTBgV9mAFH7nZD49RN0m9FuM7RqUtCGGgKEasIRIGdawjNTGIautyyG

总结

以上就是今天要讲的内容,本文仅仅简单介绍了Ardupilot任务调度的理解,能使我们快速便捷理解Ardupilot任务调度相关内容。
[1]: https://blog.csdn.net/guanzhiyuan1994/article/details/51327451
[2]: http://wenku.baidu.com/link?url=wRKUgK3NIKTajkGow6VTjGt0tLBBhYNzXDvHmpz2S4Vdv1lLlHBNHTBgV9mAFH7nZD49RN0m9FuM7RqUtCGGgKEasIRIGdawjNTGIautyyG

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值