Ardupilot任务调度的理解

Ardupilot的任务调度是通过定时器定时调度一系列任务来实现的。


由于Ardupilot固件有基于arduino的APM发展而来,因此程序与arduino的形式类似,包含一个setup函数与一个loop函数。这些函数的执行与arduino的执行方式类似,其中setup只执行一次,loop函数在setup函数执行后循环执行。


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


这些AP_Scheduler::Task Copter::scheduler_tasks[]数组中定义的任务将在loop函数中scheduler.run(time_available)语句中被执行。进入scheduler.run函数中,for (uint8_t i=0; i<_num_tasks; i++)表示飞控程序并没有设置这些任务的优先级,而是从第一个任务开始,使用一个for循环依次向下执行。其中dt = _tick_counter - _last_run[i];得到的dt用来保证这些任务按指定的频率执行。若第一个任务执行频率为100Hz,即4个tick,那么在第一次进入这个语句时dt=1,不满足下面的if (dt >= interval_ticks) 语句, _last_run[i]不变。而在loop函数中,每进行一次循环经历2.5ms(由ins.wait_for_sample();函数保证2.5ms的周期), _tick_counter在scheduler.tick();加1,经历四个tick之后,再次进入之前提到的for循环,此时对于第一个任务dt=4,满足if (dt >= interval_ticks) 条件,任务将得到执行,之后记录下这一次执行的tick次数,赋值给 _last_run[i],以此来保证每个任务的执行频率。


在任务执行时,还会通过if (_task_time_allowed <= time_available)语句判断剩余时间是否足够执行该任务,一次来保证每次循环执行的时间。其中_task_time_allowed 就是之前在 AP_Scheduler::Task Copter::scheduler_tasks[]输入的第三个参数。


除AP_Scheduler::Task Copter::scheduler_tasks[]中定义的任务外,在loop函数中还有一个fast_loop()函数,这个函数中的任务将以400Hz的频率执行。


其中,fast_loop的任务调度可参考
http://wenku.baidu.com/link?url=wRKUgK3NIKTajkGow6VTjGt0tLBBhYNzXDvHmpz2S4Vdv1lLlHBNHTBgV9mAFH7nZD49RN0m9FuM7RqUtCGGgKEasIRIGdawjNTGIautyyG
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值