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

2023-05-16

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

  po上我使用到的硬件和开发环境

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

  遥控器:某国产神器

  开发环境:虚拟机vm12+ubuntu14

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

 还有就是什么Git,Linux,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设备有个很好的抽象:文件。Unix系统中把所有东西都抽象成文件,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系统的使用。

 






本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

px4原生源码学习-(2)--实时操作系统篇 的相关文章

  • GVINS论文阅读笔记

    Code Pseudorange Measurement c o d e p s e
  • matlab 读取csv文件绘图

    话不多说 xff0c 直接上代码 读取csv文件然后绘图 clc data 61 csvread 39 home lyb tools matlab files test csv 39 x 61 data 1 y 61 data 2 t 61
  • vins-mono初始化代码分析

    大体流程 初始化主要分成2部分 xff0c 第一部分是纯视觉SfM优化滑窗内的位姿 xff0c 然后在融合IMU信息 这部分代码在estimator processImage 最后面 主函数入口 xff1a void Estimator p
  • 浅谈嵌入式驱动设计

    一 总体说明 提到嵌入式的概念 xff0c 一时间脑容量已经容纳不下 xff0c 转到驱动的设计刚刚好 xff0c 习惯将一件事分层次去做 xff0c 驱动设计亦是如此 xff0c 很多人做工程时因为项目的时间紧张 xff0c 直接想到如何
  • 激光数据去畸变

    机械激光雷达产生数据原理 机械激光雷达中内置高速旋转的电机 xff0c 电机旋转的频率决定了激光雷达产生数据的频率 比如一个fov为360度的激光雷达 xff0c 每秒旋转一圈 xff0c 那么激光数据的频率就是1Hz xff1b 如果每秒
  • rosbag 录包

    ros提供了方便的录包指令 xff0c 基本使用如下 xff1a rosbag record topic 1 topic 2 这里记录下 xff0c 类似于滑动窗口的方式录制指定size的N个bag包 这主要用于只录制最近一段时间的数据包
  • pyhon记录cpu数据并保存到日志

    import logging import psutil time import re string log filename 61 34 logging txt 34 log format 61 39 asctime s message
  • ubuntu 修改重启时间

    ubuntu 默认重启时间过长 xff0c 默认为90s xff08 太久了 xff09 xff0c 下面为修改重启时间的正确姿势 cd etc systemd sudo vim system conf 打开文件后将下面这两行取消注释并修改
  • 数据分析实战(一):2019北大软微考研初试分析

    2019考研的初试成绩陆续放出 xff0c 也是几家欢喜几家愁 北大确实公平公正公开 xff0c 所有成绩 xff0c 排名在其研招网均能悉数找到 xff0c 下面选取了较为热门的北大软件与微电子学院考研初试成绩进行数据分析 导入excel
  • 程序员如何写项目经历

    对于程序员的简历来说 xff0c 简历的好坏可能影响着你能不能拿到满意的offer和薪资 xff0c 所以写一份高质量的简历 xff0c 突出自己技术能力非常重要 xff0c 就大家如何写简历中最重要的项目经历部分给出一些建议 了解项目的背
  • TypeError: iter() returned non-iterator of type ‘xxx‘

    最近在读 Python高级编程 xff08 Ziade著 xff09 xff0c 看到里面的自我设计的迭代器 xff1a 自己写的 xff1a span class token keyword class span span class t
  • memcpy与memmove函数的区别和实现

    1 函数定义 memcpy与memmove都是C语言的库函数 xff0c 在头文件string h中 xff0c 作用是内存拷贝 唯一的区别是 xff0c 当内存发生局部重叠时 xff0c memmove保证了拷贝的结果是正确的 xff0c
  • C语言strstr()函数用法-字符串查找

    1 函数定义 strstr 函数是一个参数为两个字符指针类型 xff0c 返回值是char 类型的函数 用于找到子串 xff08 str2 xff09 在一个字符串 xff08 str1 xff09 中第一次出现的位置 xff08 不包括s
  • "XXXX" is not translated in "en" (English), "zh" (Chinese)

    http www jianshu com p 39cd21451f06 Android Lint 34 XXXX 34 is not translated in 34 en 34 English 34 zh 34 Chinese 字数269
  • Qt之make: Nothing to be done for ‘first‘

    今天在修改了pro cpp h等文件 xff0c 重新编译时 xff0c 出现了标题所示的内容 如下图1所示 和同事讨论了一下 xff0c 主要有几个问题 xff0c 可能导致make不成功 1 xff09 工程文件内容没有变化 xff0c
  • cannot open shared object file: No such file or directory

    在一台Linux上编译库文件和执行文件后 xff0c 放到另一台Linux机器上 xff0c 执行报错 xff0c 显示 xff1a cannot open shared object file No such file or direct
  • C++ float转换int,四舍五入

    正常的float 转换为 int 的情况是采用去尾巴的方式 xff0c 也就是说去掉小数点后面的数值 1 常规的float 转换为 int xff1a 例如 xff1a 9 34 61 xff08 int xff09 9 xff1b 9 9
  • 如何隐藏QTabWidget中的一个tab

    QTabWidget 中的tab xff0c 采用hide xff0c close xff0c setHidden true xff0c setVisible false 等方式都无法隐藏tab 可以通过以下方式隐藏 ui gt tabWi
  • C++排序之stable_sort()的方法

    stable sort 可以对vector的某个成员进行排序 xff0c 而且可保证相等元素的原本相对次序在排序后保持不变 下面是该函数的实现方法代码 xff1a include lt iostream gt include lt math
  • QString和QDateTime之间的相互转换

    1 QDateTime 转换为QString QString strBuffer QDateTime time time 61 QDateTime currentDateTime strBuffer 61 time toString 34

随机推荐

  • QDateEdit日历修改之QCalendarWidget 样式设置

    1 QDateEdit控件显示日历 xff0c 需要用下面的setCalendarPopup true xff1b ui dateEdit gt setCalendarPopup true 2 日历样式的修改需要用到QCalendarWid
  • 解决ssh连接远程机器时提示“ssh_exchange_identification: Connection closed by remote host”或 Connection refused

    不少人在ssh连接远程机器时遇到过ssh exchange identification Connection closed by remote host的问题 xff0c 在网上找了一堆教程试了都不行 xff0c 博主总结了常见的几种解决
  • 百度地图POI数据获取并转为Excel文件

    查看全文百度地图POI数据获取并转为Excel文件
  • HAL库版STM32双轮自平衡车(四) ———— 原理图以及PCB绘制

    系列文章目录 HAL库版STM32双轮自平衡车 一 代码思路和PID基础精讲 HAL库版STM32双轮自平衡车 二 CubeMX的配置 原理图接线 物料准备 HAL库版STM32双轮自平衡车 三 代码精讲 HAL库版STM32双轮自平衡车
  • 关于VR的历史及发展

    寒假我看了关于一些虚拟现实的东西 xff0c 并在网上查获了一些资料 xff0c 作出以下归纳总结 xff1a 虚拟现实 xff0c 无法绕开它的历史 xff0c 最早可以追溯到公元前427年的古希腊时代 xff0c 当时的哲学家柏拉图在提
  • 机器人RPY角和Euler角 -- 基本公式

    参考 xff1a 机器人学 熊有伦等 编著 机械工业出版社 P36 P40 说明 xff1a 假设两个坐标系A和B xff0c 二者初始时完全重合 一 绕定轴X Y Z旋转 xff08 RPY角 xff09 过程如下 xff1a B绕A的X
  • solvepnp函数-世界坐标系

    一 二 世界坐标系是任意选定的 xff0c 可以任意事先定义 xff0c 然后给出每个特征点在世界坐标系下的三维坐标 xff0c 然后以一定顺序存储这些点 特征点的像素坐标 xff0c 一般是通过角点检测算法直接得到的 xff0c 角点检测
  • 【C++】STL-迭代器

    Iterator xff08 迭代器 xff09 模式又称游标 xff08 Cursor xff09 模式 xff0c 就是把不同集合类的访问逻辑抽象出来 xff0c 使得不用暴露集合内部的结构而达到循环遍历集合的效果 xff0c 而又不需
  • Windows11 + Linux子系统(ubuntu)体验(篇一)

    今年10月份微软发布了新一代的Windows系统 Windows11 xff0c 这距离上一代产品Windows10发布已经有6年之久 xff0c 打破了微软自Windows7之后每三年更新一代操作系统的传统 可以说这一代Win11是蓄势已
  • 喜获蚂蚁offer,定级p7,面经分享,万字长文带你走完面试全过程

    前言 在今天 xff0c 我收到了蚂蚁金服A级的实习录用offer 从开始面试到拿到口头offer xff08 四面技术 43 一面HR xff09 战线大约拉了半个月 xff0c 从拿到口头offer到收到正式录用邮件大概又是半个月 思前
  • C++中 #define的用法

    C 43 43 中 define的用法 转自 xff1a http www dingge com main article asp id 61 10 今天整理了一些 define的用法 xff0c 与大家共享 xff01 1 简单的defi
  • LeetCode的语言使用

    看来以后不能再用python来写算法的题目了 用python竟然是一种取巧的办法 xff0c 以后还是用C 43 43 来写吧 python里面有很多内置的库 xff0c 这也就导致掩盖了很多复杂的算法的特性 虽然在写代码的时候很简单 xf
  • Windows10安装Ubuntu16.04

    由于最近要在Ubuntu上面开发 xff0c 得安装一个Ubuntu的系统 xff0c 这些是很常见的安装 xff0c 但是也踩了一些坑 xff0c 下面记录下来 安装环境 Windows10Ubuntu16 04 基础理论 在安装的时候有
  • python 下划线 _ __ 开头的变量 详解

    在python中 xff0c 我们经常能看到很多变量名以 下划线开头 xff0c 而且下划线的数量还不一样 xff0c 那么这些变量的作用到底是什么 xff1f 变量名分类 xff1a 以数字 字母开头 xff1a 正常的公有变量名 a 6
  • 两个画图工具助力论文绘图

    欢迎关注笔者的微信公众号 如果使用matplotlib绘制论文图片时需要做非常多的设置 xff0c 字体 xff0c 大小 xff0c 间距 xff0c 多子图配置等 xff0c 而这些操作可以封装好从而简化用户工作量 Proplot对ma
  • 对自然数e的理解,推导(基础)

    对自然数e的理解 xff0c 推导 基础 在前面的博文 古典概型事件数计算 分房 xff0c 配对 xff0c 乱序 概统1 一文中 xff0c 已经写到了对e的理解 xff0c 在n把钥匙配n把锁的 乱序配对 问题中 xff0c 当n很大
  • 检验和算法

    1 CRC xff08 循环冗余码 校验和的算法为 xff1a 所有各字节的和模256的余 即各字节二进制算术和 xff0c 不计超过256的溢出值 xff08 即只取其和 的低8位数据 xff09 xff0c 然后用0x100减去这个算数
  • 我的四轴专用PID参数整定方法及原理---超长文慎入

    给四轴调了好久的PID xff0c 总算是调好了 xff0c 现分享 PID 参数整定的心得给大家 xff0c 还请大家喷的时候手下留情 首先说明一下 xff0c 这篇文章的主旨并不是直接教你怎么调 xff0c 而是告诉你这么调有什么道理
  • px4原生源码学习-(1)

    接触px4代码有几天了 xff0c 想把自己所学所想记录下来 px4就不过多介绍了 xff0c 算得上目前使用的最广泛的开源飞控了 为什么说 px4原生代码学习呢 xff0c 这还得追溯到被大疆干死的3DR xff0c 3DR想做消费级无人
  • px4原生源码学习-(2)--实时操作系统篇

    po上我使用到的硬件和开发环境 px4硬件 xff1a 某宝销量最高的pixhawk套件 xff08 主机 xff0c gps 43 指南针 xff0c 数传 xff0c pwm转pmm xff0c 安全开关 xff0c 蜂鸣器 xff0c