您的位置:首页 > 其它

px4原生源码学习-(2)--实时操作系统篇

2016-12-11 10:02 211 查看
/**************************************************************************************************************
  po上我使用到的硬件和开发环境

  px4硬件:某宝销量最高的pixhawk套件(主机,gps+指南针,数传,pwm转pmm,安全开关,蜂鸣器,电源转换接头)

  遥控器:某国产神器

  开发环境:虚拟机vm12+ubuntu14

 ps:此文章只针对纯代码分析,关于那些个飞机类型啦,硬件什么的我就不多说了,这个得自己去亲身体验才行,切不可贸然飞行,这个还是很危险的!!!!!

 还有就是什么GitLinux,make什么的也不会多说,毕竟只是工具属性。

 获得更好支持可以访问http//:px4.io 我知道的大部分来自这个网站。

  **************************************************************************************************************/

    为什么我要谈到实时操作系统?首先据我所知,国内除了软件工程专业和计算机专业,其它专业应该很少会开操作系统这门课程,对于广大的自控和电子专业的学生来说,其实这非常不利的!!!!如果你只是开发一个简简单单的单片机程序,不用考虑以后对于程序的升级与修改,那么你简简单单写个main函数的while循环其实没什么不好。但你要遇到那种开发周期长,系统复杂的产品或者项目,那最好是基于实时操作系统开发,因为这对于代码重用和添加新功能或者新设备来说会方便挺很多,代码的编写程度也会简单很多。像早期的apm飞控也是基于板子的main函数,导致其代码复杂,冗余,后面直接被弃,因为可能每添加一个功能或者设备,代码就可能要重构。我们要讲的px4飞控其实也是基于一个叫做Nuttx的实时操作系统的(在此提醒各位拿到代码找main函数的同志们,不要白费力气,你找不到的,因为确实系统不是main函数启动的!!!,后面我会专门讲一下px4是如何启动的),其实我没猜错的话大疆飞控用的应该是在国内外很出名的开源实时操作系统µC/OS。所以要更好理解px4,就一定要有操作系统概念。下面我就基于两点谈谈:第一:什么是实时操作系统,第二:px4的实时操作系统Nuttx。

     首先谈谈操作系统,说到操作系统,大家首先会想到windows,linux或者Mac os,亦或者手机的一些操作系统。没错这些都是操作系统,但这些操作系统和今天要谈的实时操作系统有一些基本的概念和理论都是一样的,但他们又有一些不同。

   相同点:所以操作系统无非由以下四大部分组成(熟记这四个模块):

                   1.任务调度

                   2.内存管理

                   3.文件系统

                   4. I/O

     对于主流的操作系统而言,这四个缺一不可!!,而对于一些非常简单的实时操作系统可能会没有3和4。

     px4所使用的的Nuttx这四个模块都有。

     什么是任务调度(很多课本上会说进程管理,但后面操作系统发展出了线程,这个说法其实不严谨)?

     想想你日常使用的手机,有各式各样的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设备有个很好的抽象:文件。Un
aebd
ix系统中把所有东西都抽象成文件,I/O设备是一种特殊的文件。因为事实上我们并不关心你I/O设备是什么,我们只想要其中的数据,文件可以存取数据,传感器数据不断更新,我就不断更新这个文件内容,其他程序想要里面的数据可以去读这个文件就行。

  
不同系统对于I/O管理的理念大不相同,我无法把它抽象为一个程序或者文件,后面我会针对Nuttx的I/O谈谈。

 
px4的实时操作系统Nuttx
  

    首先说说px4和Nuttx的渊源:PX4是一个软、硬件开源项目(遵守BSD协议),目的在于为学术、爱好和工业团体提供一款低成本高性能的高端的自驾仪。这个项目源于
ETH Zurich (苏黎世联邦理工大学)的计算机视觉与几何实验室PIXHAWK项目、并得到了自主系统实验室

自动控制实验室的支持。而Nuttx也是苏黎世联邦理工大学的一个开源项目(这个学校在计算机方面可能算的上是欧洲最强的了,那个提出最短路径算法和信号量的教授就是这个学校的)。所以他们两个就走到了一起。

 
下面背下书:NuttX 是一个实时操作系统(RTOS),强调标准兼容和小型封装,具有从8位到32位微控制器环境的高度可扩展性。NuttX 主要遵循  Posix 和 ANSI 标准,对于在这些标准下不支持的功能,或者不适用于深度嵌入环境的功能(如 fork()),采用来自 Unix 和常见 RTOS (如 VxWorks)的额外的标准 API。

   下面一篇文章我将着重讲解一下Nuttx系统的使用。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息