今天我们来聊聊Ardupilot的调度总线机制。
任何程序都有自己的调度总线,事务性程序一般有一个监听线程,当监听到触发条件后,调度出事务处理线程执行功能;算法密集类程序往往是精妙设计的若干层循环函数,亦或巧妙分布的若干个计算线程;交互类程序则都会专门分配一个界面线程以保证用户流畅的体验。
对于APM飞控而言,他的调度机制有以下两个特点:
1.事务性
飞控算法可以看作若干事务性算法的集合。每个算法都按照不同的频率循环,针对外界刺激产生响应。各事务性算法之间也有先后关系,某些算法的输出是某些算法的输入,但是这种关联较少。
2.单线程
单片机仅仅提供了单线程的运行模式,所以APM飞控无法调用附属线程,无法采用定时器进行周期性工作。
因为这种特点,apm的调度总线,在单线程逻辑的基础上,通过时分复用的方式运行多个功能算法,通过若干机制,控制这些算法的循环频率和先后顺序。为了确保整体循环的流畅性和完整性,还具有防止某些能算法的超时,对飞控产生多米诺骨牌崩盘一般的恶劣影响。
我们看以下AP_Scheduler.h的代码中对于一个任务(功能算法)的定义
struct Task {
task_fn_t function;
uint16_t interval_ticks;
uint16_t max_time_micros;
};
对于每一个任务结构体,其中
function是算法