- 本文转自px4原生源码学习-(2)--实时操作系统篇 *
为什么我要谈到实时操作系统?
如果你只是开发一个简简单单的单片机程序,不用考虑以后对于程序的升级与修改,那么你简简单单写个main函数的while循环其实没什么不好。但你要遇到那种开发周期长,系统复杂的产品或者项目,那最好是基于实时操作系统开发。因为这对于代码重用和添加新功能或者新设备来说会方便挺很多,代码的编写程度也会简单很多。像早期的apm飞控也是基于板子的main函数,导致其代码复杂,冗余,后面直接被弃,因为可能每添加一个功能或者设备,代码就可能要重构。
px4飞控是基于一个叫做Nuttx的实时操作系统开发的。
- 在此提醒各位拿到代码找main函数的同志们,不要白费力气,你找不到的,因为确实系统不是main函数启动的!!!,后面我会专门讲一下px4是如何启动的 *
所以要更好理解px4,就一定要有操作系统概念。下面我就基于两点谈谈:第一:什么是实时操作系统,第二:px4的实时操作系统Nuttx。
一、什么是实时操作系统
说到操作系统,大家首先会想到windows,linux或者Mac os,亦或者手机的一些操作系统。没错这些都是操作系统,但这些操作系统和今天要谈的实时操作系统有一些基本的概念和理论都是一样的,但他们又有一些不同。相同点,所有操作系统无非由以下四大部分组成(熟记这四个模块):
-
任务调度。什么是任务调度?(很多课本上会说进程管理,但后面操作系统发展出了线程,这个说法其实不严谨)想想你日常使用的手机,有各式各样的APP,其实每个APP都可以把它抽象为一个简单的task(任务),你在各个APP之间切换自如,包括有一些后台运行的APP,假设你手机是单核的,一次只能运行一个task,那手机是怎么实现后台运行多个APP的呢?这个就得归功于操作系统的任务调度功能,由于大部分的APP都不会涉及到太多的计算,所以这些APP真正使用CPU的时间少之又少,大部分时间是在等待输入和输出操作的,这个时候就可以把他们挂起,让别的task使用CPU了,由于这个切换很快,你感觉不到,所以你就感觉事实上有多个程序在同时运行。简单点说任务调度就是一个程序,这个程序决定其他程序什么时候使用CPU,什么时候挂起。上面的说法就引出了一个问题,如果同时有两个task都要求使用CPU呢?怎么办!谁先用?这就引进了另外一个概念:优先级。谁优先级高谁用CPU。而这个就是实时操作系统同普通操作系统的区别。实时操作系统有严密的等级制度和相应制度即:高优先级task抢低优先级task (即使这个task在用CPU)CPU,对于高优先级的程序,要求系统有快速的反映时间(这是衡量一个实时操作系统好坏的主要标准)。
-
内存管理。 程序要运行首先要干嘛?要把它从ROM(可理解为硬盘)里面加载到RAM(可理解为内存)里面。如果单片机就跑一个程序,整个内存都是你的,你想怎么用就怎么用。可是引入操作系统后,要对多个task进行调度,就得把他们全部加载到内存中,可是毕竟单片机或者mcu的内存有限(即使电脑的也有限),这就引出了内存管理。简单点说内存管理也是一个程序,这个程序决定谁驻留在内存,谁离开内存。
-
文件系统。在ROM里面保存的东西,如果是少量的东西,你可以随便保存。可是当你有几十个g种子的时候,你也直接用单片机的方式一个一个写到flash里面!!!你杂乱无章的保存会导致后面查找,删除,修改变得非常麻烦,使用我们要用文件系统来帮我们管理这些个文件,而我们只要对文件系统进行操作就能对文件操作了。简单点说文件系统是一个程序,它帮我们管理我们的文件,使我们操作文件更方便。
-
I/O。CPU不能独立的存在,它得和周围的设备通信,内存也好,flash也罢,这些都可以通归为I/O设备。对于px4来说I/O设备就更多了,什么gps,陀螺仪,加速计,气压计,空速计,pmm输入等等,还在一直加呢!我们自己写个main数,也可以读出这些设备的数据,但在操作系统中,对这些设备进行操作就不是那么简单了。由于I/O算的上计算机组件当中最复杂的东西了,你不能简简单单把它归类为某个程序。Unix系统对I/O设备有个很好的抽象:文件。Unix系统中把所有东西都抽象成文件,I/O设备是一种特殊的文件。因为事实上我们并不关心你I/O设备是什么,我们只想要其中的数据,文件可以存取数据,传感器数据不断更新,我就不断更新这个文件内容,其他程序想要里面的数据可以去读这个文件就行。不同系统对于I/O管理的理念大不相同,我无法把它抽象为一个程序或者文件。
二、px4的实时操作系统Nuttx
首先说说px4和Nuttx的渊源:PX4是一个软、硬件开源项目(遵守BSD协议),目的在于为学术、爱好和工业团体提供一款低成本高性能的高端的自驾仪。这个项目源于 ETH Zurich (苏黎世联邦理工大学)的计算机视觉与几何实验室的PIXHAWK项目、并得到了自主系统实验室和 自动控制实验室的支持。而Nuttx也是苏黎世联邦理工大学的一个开源项目(这个学校在计算机方面可能算的上是欧洲最强的了,那个提出最短路径算法和信号量的教授就是这个学校的)。所以他们两个就走到了一起。
下面背下书: * NuttX 是一个实时操作系统(RTOS),强调标准兼容和小型封装,具有从8位到32位微控制器环境的高度可扩展性。NuttX 主要遵循 Posix 和 ANSI 标准,对于在这些标准下不支持的功能,或者不适用于深度嵌入环境的功能(如 fork()),采用来自 Unix 和常见 RTOS (如 VxWorks)的额外的标准 API。 *