3.1AP_HAL(APM的硬件抽象层)

2023-05-16

前言

前段时间梳理了PX4IO以及PX4FMU的类,但是还是没真正上去梳理到硬件框架上去,这次直接开始梳理AP_HAL框架,从根本上去认识pixhawk在硬件框架上的实现;

namespace AP_HAL

在pixhawk里面对于硬件的驱动在使用上完全是依赖了nuttx的驱动层,所以在驱动的调用上也是沿用了nuttx的fs_ops的方式,但是通过源码可以发现的是,pixhawk对与硬件又进行了抽象例如之前抽象的Device以及派生出来的CDev,这些最终只是提出了一个device框架,来定义设备,以及派生出的字符设备;对于底层硬件抽象这是通过AP_HAL来完成:
【device】是对设备抽象的一个框架,使得设备代码更清晰、易维护;
【AP_HAL】是对硬件抽象的一个框架,目的在于适应多个硬件平台;

namespace AP_HAL {

  /* 顶层的虚类 Hal. 最顶层的抽象类*/
  class HAL;

  /* 顶层驱动类 drivers. 抽象的各个接口驱动 */
  class UARTDriver; //串口
  class I2CDevice; //I2C
  class I2CDeviceManager; //I2C
  class Device;

  /*SPI总线*/
  class SPIDevice;
  class SPIDeviceDriver;
  class SPIDeviceManager;

  /*外设抽象*/
  class AnalogSource;
  class AnalogIn;
  class Storage;
  class DigitalSource;
  class GPIO;
  class RCInput;
  class RCOutput;
  class Scheduler;
  class Semaphore;
  class OpticalFlow;

  class Util;

  /* Utility Classes */
  class Print;
  class Stream;
  class BetterStream;

  /* Typdefs for function pointers (Procedure, Member Procedure)

  For member functions we use the FastDelegate delegates class
  which allows us to encapculate a member function as a type
  对于成员函数,我们使用FastDelegate代理类,它允许我们将一个成员函数封装为类型
  */
  typedef void(*Proc)(void);
  FUNCTOR_TYPEDEF(MemberProc, void);

  /**
  * Global names for all of the existing SPI devices on all platforms.
  * 在所有平台上的存在的SPI设备名称
  */

  enum SPIDeviceType {
  // Devices using AP_HAL::SPIDevice abstraction
  SPIDevice_Type = -1,
  };

  /* Must be implemented by the concrete HALs.
  *必须有具体的HAL的实现
  *调用AP_HAL::get_HAL()-->return static HAL_PX4 hal_px4
  *class HAL_PX4 是公共继承了AP_HAL::HAL,所以绕了一圈最终的HAL就是AP_HAL::HAL,也就是上面所列举出 * 来的。
  */
  const HAL& get_HAL();
}

class HAL

在Pixhawk中的通过一个命名空间实现了对所有数据结构的抽象,下面挨个讨论;
对HAL来说在实现AP_HAL的时候就必须实现HAL,这里对应硬件(pixhawk)—>HAL_PX4_Class.h

class AP_HAL::HAL {
public:
  HAL(AP_HAL::UARTDriver* _uartA,  // console
  AP_HAL::UARTDriver* _uartB,      // 1st GPS
  AP_HAL::UARTDriver* _uartC,      // telem1
  AP_HAL::UARTDriver* _uartD,      // telem2
  AP_HAL::UARTDriver* _uartE,      // 2nd GPS
  AP_HAL::UARTDriver* _uartF,      // extra1
  AP_HAL::I2CDeviceManager* _i2c_mgr,
  AP_HAL::SPIDeviceManager* _spi,
  AP_HAL::AnalogIn* _analogin,
  AP_HAL::Storage* _storage,
  AP_HAL::UARTDriver* _console,
  AP_HAL::GPIO* _gpio,
  AP_HAL::RCInput* _rcin,
  AP_HAL::RCOutput* _rcout,
  AP_HAL::Scheduler* _scheduler,
  AP_HAL::Util* _util,
  AP_HAL::OpticalFlow *_opticalflow)
  :
  uartA(_uartA),
  uartB(_uartB),
  uartC(_uartC),
  uartD(_uartD),
  uartE(_uartE),
  uartF(_uartF),
  i2c_mgr(_i2c_mgr),
  spi(_spi),
  analogin(_analogin),
  storage(_storage),
  console(_console),
  gpio(_gpio),
  rcin(_rcin),
  rcout(_rcout),
  scheduler(_scheduler),
  util(_util),
  opticalflow(_opticalflow)
  {
  AP_HAL::init();
  }
  // 定义回调纯虚函数
  struct Callbacks {
  virtual void setup() = 0;
  virtual void loop() = 0;
  };

  // 实现setup_fun、loop_fun与私有函数指针_setup和_loop关联起来
  struct FunCallbacks : public Callbacks {
  FunCallbacks(void (*setup_fun)(void), void (*loop_fun)(void));

  void setup() override { _setup(); }
  void loop() override { _loop(); }

  private:
  void (*_setup)(void);
  void (*_loop)(void);
  };

  //
  virtual void run(int argc, char * const argv[], Callbacks* callbacks) const = 0;

  AP_HAL::UARTDriver* uartA;
  AP_HAL::UARTDriver* uartB;
  AP_HAL::UARTDriver* uartC;
  AP_HAL::UARTDriver* uartD;
  AP_HAL::UARTDriver* uartE;
  AP_HAL::UARTDriver* uartF;
  AP_HAL::I2CDeviceManager* i2c_mgr;
  AP_HAL::SPIDeviceManager* spi;
  AP_HAL::AnalogIn* analogin;
  AP_HAL::Storage* storage;
  AP_HAL::UARTDriver* console;
  AP_HAL::GPIO* gpio;
  AP_HAL::RCInput* rcin;
  AP_HAL::RCOutput* rcout;
  AP_HAL::Scheduler* scheduler;
  AP_HAL::Util *util;
  AP_HAL::OpticalFlow *opticalflow;
};

(1)从结构上来看,HAL抽象了串口、i2c、spi、rcin、rcout、adc、storage…等设备及接口,在namespace AP_HAL中这几个抽象类是平行的,而在class HAL中定义了个各类的指针,方便建立与后面implement各个类建立关系;更多还是基于硬件平台的抽象了;
HAL构造函数中实现了建立关系;
(2)HAL 本身比价简单,仅仅是集合了所有类,我们关注具体对HAL实现的的HAL_PX4;

这里需要划重点,之前AP_HAL命名空间下的class 是一个纯粹的抽象,具体实现是要依附于硬件平台来的;
说直白一点,对pixhawk来说:
第一、定义namespace PX 包含类“大致”与AP_HAL相当
第二、定义各个class 对应公共继承AP_HAL下的class,例如HAL_PX4 继承AP_HAL::HAL;

路径对应上:
…/ardupilot/libraries/AP_HAL/AP_HAL_Namespace.h
…/ardupilot/libraries/AP_HAL_PX4/AP_HAL_PX4_Namespace.h
每个文件里面都包含命名空间里面各个类是实现,且都是一一对应过来的,PX支持多个硬件平台的原因也就是在这里了

从文件中,我们可以明显看到AP_HAL_AVR、AP_HAL_Empty、AP_HAL_FLYMAPLE、AP_HAL_LINUX、AP_HAL_PX4、AP_HAL_QURT…
对平台的支持可见一斑…

namespace PX4

namespace PX4 {
  class PX4Scheduler;
  class PX4UARTDriver;
  class PX4Storage;
  class PX4RCInput;
  class PX4RCOutput;
  class PX4AnalogIn;
  class PX4AnalogSource;
  class PX4Util;
  class PX4GPIO;
  class PX4DigitalSource;
  class NSHShellStream;
  class PX4I2CDriver;
  class PX4_I2C;
  class Semaphore;
}

这里就是pixhwk平台下针对AP_HAL定义的namespace,查看每个class定义不难发现:
class PX4::PX4UARTDriver : public AP_HAL::UARTDriver;
class PX4::PX4Scheduler : public AP_HAL::Scheduler

都是继承了抽象AP_HAL下的抽象类

接下来就是每个类实现的了,…/ardupilot/libraries/AP_HAL_XXX该路径下存在各个不同硬件平台的实现;
其实这些class都是操作nuttx底层已经定义好了的驱动,只是封装的更好用.

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

3.1AP_HAL(APM的硬件抽象层) 的相关文章

  • sed流编辑器中使用变量替换以及执行外部命令

    在使用sed对日志或者其它文本进行parse的过程当中 xff0c 有时候我们需要引用外部变量的值 xff0c 或者获取一个shell命令执行的结果 xff0c 以便达到更加可观的输出结果 这里介绍如何做到 sed 流编辑 1 sed命令及
  • mkisofs命令制作iso文件

    mkisofs命令行格式 mkisofs adDfhJlLNrRTvz print size quiet A lt 应用程序ID gt b lt 开机映像文件 gt c lt 开机文件名称 gt hide lt 目录或文件名 gt hide
  • windows下tree命令列出文件目录树

    windows下tree命令列出文件目录树 tree path f tree D AR C Team f 可以将D AR C Team目录下所有目录及子目录下的文件都打印出来 tree D AR C Team f gt HOMEPATH f
  • yum命令安装历史回滚彻底删除安装的依赖包

    yum命令安装一个软件包是会连同依赖包一起安装 xff0c 但是yum remove卸载时却只卸载这个文件包本身 如果需要删除安装时附加的依赖包可以使用yum history的相关操作实现回滚 假如安装了ecliipse pde xff0c
  • latex在ipython jupyter notebook中的使用

    In 2 from IPython display import Latex In 5 数学公式的前后要加上 或 和 Latex r 34 f x 61 3x 43 7 34 Out 5 In 6
  • MATLAB 2018b 帮助页面设置为中文显示

    MATLAB 2018b 帮助页面设置为中文显示 具体步骤如下 xff1a 1 随机点击一个matlab的函数点击 help 2 点击帮助页面的设置按钮 3 按照如下步骤设置即可
  • 图解Java线程死锁的必要条件

    文章目录 What is Deadlock发生死锁要如何解决如何预防死锁参考资料 What is Deadlock In concurrent computing a deadlock is a state in which each me
  • 远程LINUX桌面的好用工具,NoMachine.

    安装及使用都比VNC及XManager要好用 xff0c 网站 https www nomachine com 对应下各自的版本后 xff0c 按照网站的说明进行安装就可以了 xff0c 安装过程不需要其他依赖项 xff01 Linux安装
  • 竞赛经验|2019年电赛B题四旋翼无人机组巡线机器人

    竞赛经验 xff5c 2019年电赛B题四旋翼无人机组巡线机器人 参赛背景和比赛回忆 xff1a 1 院校背景 xff1a 2 规则与现实 xff1a 3 比赛流程 xff1a 备赛建议1 器件选择 xff1a 2 针对学习 xff1a 写
  • C语言实现http post请求和get请求,post请求可以上传图片和文件

    文章目录 1 http协议简介2 http协议分析2 1 http请求2 1 1 请求行2 1 1 1 请求方法2 1 1 2 URL2 1 1 3 协议版本2 1 1 4 请求行总结 2 1 2 请求头部2 1 3 请求数据 2 2 ht
  • 软件改变世界

    随着科技的不断进步 xff0c 软件及其相关技术的发展已经深刻地改变了人类社会的方方面面 从交通运输 医疗卫生到商业服务 教育培训 xff0c 软件技术的应用已经深入到我们的日常生活中 xff0c 对我们的生活方式和生产方式都带来了深刻的影
  • MATLAB 比较好入门书籍有哪些推荐

    https www zhihu com topic 19559252 hot https www zhihu com question 19904418 作者 xff1a 陈村 链接 xff1a https www zhihu com qu
  • pymavlink使用简单教程

    这里写自定义目录标题 pymavlink主要包含的模块连接样例 设置任务样例 更改飞行参数param样例 飞行模式总结 pymavlink Pymavlink是MAVLink协议的python实现 自身包括一个源代码生成器 xff08 ge
  • Python案例003——句子生成器

    目标 xff1a 通过用户提供的内容 xff0c 随机生成唯一的句子 提示 xff1a 以用户输入的名词 代词 形容词等作为输入 xff0c 然后将所有数据添加到句子中 xff0c 并将其组合返回 输出固定的 内容 43 用户输入的内容 c
  • 嵌入式软件工程师面试题

    1 int a 10 61 1 2 3 4 5 6 7 8 9 0 int p 61 amp a 1 则p 6 等于8 2 整数数组清零 xff1a bzero memset 3 siezof 测试变量所占地址的字节数 4 main cha
  • 国内代码仓库-码云

    相信使用github的同学会经常碰到这样的情况 xff0c 当我们从github上面下载稍微大一点的代码的时候就经常下载失败 xff0c 下载网速是非常的感人 国内从github上下载代码非常慢 xff0c 解决办法就是修改host或者vp
  • php对接支付宝Web支付-tp5.1框架

    具体流程 1 获取支付宝相关配置 2 传相关参数请求支付宝网关 订单金额 订单号等 3 支付宝请求回调地址 4 回调地址做相关业务处理 数据库增删改查之类 5 处理完成以后返回success给支付宝服务器 1 首先获取应用id和商户私钥以及
  • TX2+realsense D435i跑VSLAM--001--内核劝退篇

    想要使用tx2连接深度相机realsense D435i xff0c 没想到下载好官方自带SDK后 xff0c 说tx2的版本不满足需求 需要至少L4T28 2 1 xff0c 为什么偏偏就差这么一点版本 xff0c 然后查了查 xff0c
  • PHP对接微信支付--Native tp5框架

    这里实现的功能是 xff1a 网页上点击支付 xff0c 然后调用此方法生成二维码并且返回二维码的图片路径 xff0c 然后扫码支付 xff0c 付款成功进行回调 xff0c 在回调地址进行数据库操作 1 配置微信支付参数 微信支付参数 f
  • 微信支付退款 PHP

    应用场景 当交易发生之后一段时间内 xff0c 由于买家或者卖家的原因需要退款时 xff0c 卖家可以通过退款接口将支付款退还给买家 xff0c 微信支付将在收到退款请求并且验证成功之后 xff0c 按照退款规则将支付款按原路退到买家帐号上

随机推荐