前言
啊对对对
几点要点
- 不同的硬件运行不同的操作系统,如pixhawk运行了ChibiOs,树莓派运行了Linux
- 操作系统执行了任务调度
- 什么是任务?什么是线程?什么是进程?任务即线程线程即任务,进程=n个线程的集合,线程是进程中最小的执行单元;
- 将自动驾驶功能拆解成各个子模块功能,这些子模块功能则可以成为各个任务,即一个大功能拆成多个小功能,完成这些小功能都需要进行代码的循环执行即死循环,因此要把实现这些小功能的代码创建成对应的线程并进行任务调度(线程调度);
- 在操作系统中,可以将需要进行死循环的程序代码创建成一个或多个线程,此时线程函数不会有返回值,需要手动退出线程;当然也可以将普通的代码即没有死循环操作的代码创建成线程,此时程序执行完线程自动退出。
- 指定硬件平台并编译代码时,整个Ardupilot会被编译成几个重要的部分或称模块:
(1)实时操作系统RTOS,以Pixhakw为例则是ChibiOS,Ardupilot中可以找到ChiBiOS的源码:ardupilot\modules\ChibiOS。
(2)基于(1)中操作系统的可执行应用程序,如Copter.cpp中的代码和Example中的代码,操作系统在执行这些应用程序时会为他们创建对应的线程,查看Copter.cpp中的代码可以发现,它的启动了其他任务即创建了一些线程,这些线程一起实现了自动驾驶的大功能,这些线程包络:姿态控制、位姿结算、卡尔曼滤波、电机控制、遥控器信号接收等多个独立子功能,实现这些功能的代码已经在编译前被指定为编译的依赖项,即已经被编译成可以行程序,因为给一段代码创建一个对应线程的前提是该段代码已经被编程为可执行程序!!
Copter.cpp:
const AP_Scheduler::Task Copter::scheduler_tasks[] = {
......
FAST_TASK(check_ekf_reset),
FAST_TASK(update_flight_mode),
FAST_TASK(update_home_from_EKF),
SCHED_TASK(update_batt_compass, 10, 120, 15),
SCHED_TASK_CLASS(RC_Channels, (RC_Channels*)&copter.g2.rc_channels, read_aux_all, 10, 50, 18),
SCHED_TASK(update_altitude, 10, 100, 42),
SCHED_TASK(run_nav_updates, 50, 100, 45),
SCHED_TASK(update_throttle_hover,100, 90, 48),
SCHED_TASK(one_hz_loop, 1, 100, 81),
SCHED_TASK(ekf_check, 10, 75, 84),
SCHED_TASK(check_vibration, 10, 50, 87),
SCHED_TASK(gpsglitch_check, 10, 50, 90),
SCHED_TASK(takeoff_check, 50, 50, 91),
......
};
(3)文件,一些如txt或其他的文件也可以被编译成符合(1)中操作系统的文件系统的文件,如rc.APM就是这个原理。
(4)其他??待补充!!!