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
由于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