PX4-6-串口设备驱动

2023-05-16

上一篇我们讲了PX4的SPI/IIC设备驱动,现在讲一下PX4的串口设备。

PX4的串口设备驱动框架比SPI/IIC设备简单不少,使用了两种底层实现方式:

一种是系统自带的标准字符设备接口,一种是直接使用mcu的底层资源通过自行配置中断和DMA的方式实现的串口收发。

使用系统接口

PX4使用Nuttx的标准的字符设备接口,通过标准接口函数open、close、read、write、ioctl等函数操作。

熟悉linux的同学对这个应该不陌生,通过看linux的驱动编程书籍对Nuttx的串口编程也同样有参考意义。

大多数搞飞控的都没有系统性的学习过系统编程,这里分享一个linux的设备驱动编程参考书,里面的知识在Nuttx中也非常适用,可以参考学习一下,对于了解Nuttx非常有参考意义。可以在公众号中回复 驱动编程 获取。

PX4的大多数串口使用的是系统接口,如GPS、数传、以及所有的串口外设等等。PX4的串口驱动在任务调度上分两种情况:

一种是使用task、一种是使用工作队列。

那么都在什么情况下使用呢?

我们回顾前面分享的 PX4-4-任务调度 里面讲到的task与工作队列的区别,具体到串口驱动上。

  • 使用task

使用task的典型应用是gps驱动,gps驱动独立开启了一个线程,串口采用poll阻塞方式读取。以下是gps读取的关键代码:

int GPS::pollOrRead(uint8_t *buf, size_t buf_length, int timeout)
{
    pollfd fds[1];
    fds[0].fd = _serial_fd;
    fds[0].events = POLLIN;

    int ret = poll(fds, sizeof(fds) / sizeof(fds[0]), math::min(max_timeout, timeout));

    if (ret > 0) {
        /* if we have new data from GPS, go handle it */
        if (fds[0].revents & POLLIN) {
            ...
        }
    }
}

这样的读取的方式的优点是在串口没有数据时任务可以自动挂起,在收到数据时有系统唤醒直接读取数据,这样的方式数据延时可以做到很小。

  • 使用工作队列

大多数的串口任务会使用工作队列的方式,比如距离传感器distance_sensor下的各种串口传感器,这些驱动的串口都采用轮训的方式读取,即非阻塞的定时获取。它的串口读取的关键代码为:

int
XXX::collect()
{
    // Check the number of bytes available in the buffer
    int bytes_available = 0;
    ::ioctl(_fd, FIONREAD, (unsigned long)&bytes_available);

    do {
        // read from the sensor (uart buffer)
        ret = ::read(_fd, &readbuf[0], readlen);

        // bytes left to parse
        bytes_available -= ret;

    } while (bytes_available > 0);
}

可以发现串口只有在周期调度函数collect执行到时尝试读取一次,没有获取到数据则直接返回,这样做的读取延时最大为一个调度周期,如果以100hz调度的话即为10ms。

为什么采用这种方式呢?PX4同时支持非常多的串口设备,而大多数的串口设备的实时性要求不高,采用工作队列非阻塞的方式,可以降低系统的内存、堆栈、调度的消耗,同时也能满足应用的需要。

值得一提的是使用工作队列的方式不能使用阻塞方式的串口读取,否则会影响队列中的其它任务的运行导致严重的故障!

自定义串口驱动

只有一种情况PX4采用的自定义的串口驱动,即板载fmu芯片与io芯片间的串口,这个串口用于两个单片机间的高速数据通信,波特率达到921600,用于传输输出控制信号,遥控输入信号。这个串口的要求是高带宽、低延时,因此PX4选择自己实现这个串口驱动。

我们以pixhawk为例,它的串口驱动底层代码在 platforms/nuttx/src/px4/stm/stm32f4/px4io_serial/px4io_serial.cpp 和 src/drivers/px4io/px4io_serial.cpp 中

这个驱动主要实现了:

  • 使用Nuttx的底层接口(irq_attach()),配置串口中断为自定义的串口中断函数 ArchPX4IOSerial::_interrupt(int irq, void *context, void *arg)

  • 配置了发送和接收数据的dma stm32_dmasetup()

  • 大多操作直接对寄存器操作,效率非常高

这个驱动这里不做详细的分析,感兴趣的同学可以深入的去看看

PX4在使用Nuttx为RTOS的时候,大多接口使用了系统上的API,但在一些高效率的场合还是会直接面向硬件直接编写驱动,比如这里的px4io_serial以及任务调度中提到的hrt。

往期分享:

PX4-5-SPI-IIC设备驱动

AcmeGCS-5-模拟国庆阅兵

Uav开发杂记-2-无人机的RTOS

这个博客转载自我个人的微信公众号,这里会不定期更新一些我整理的无人机相关知识和个人设计,欢迎添加关注。

 

 

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

PX4-6-串口设备驱动 的相关文章

  • Ubuntu下PX4飞控开发环境搭建

    双清微电子 前言 xff1a PX4支持Pixhawk pixracer 高通骁龙飞控板 树莓派 派诺特等硬件 PX4是构建在Nuttx实时操作系统上的 第一步 xff1a 安装Linux基础软件 第二步 xff1a 下载源代码 第三步 安
  • ardupilot & px4 书写自己的app & drivers (二)

    新建任务列表任务 打印时间 任务列表 const AP Scheduler span class hljs tag Task span Copter span class hljs tag scheduler tasks span span
  • PX4 SITL Gazebo 仿真时 libgazebo_multirotor_base_plugin 插件运行时出错

    PX4 SITL Gazebo 仿真时 libgazebo multirotor base plugin 插件运行时出错 问题描述原因分析解决办法总结 问题描述 在 Gazebo 中进行 PX4 的软件在环仿真时 xff0c 执 make
  • Ubuntu20.04+MAVROS+PX4+Gazebo保姆级安装教程

    Ubuntu20 04 43 MAVROS 43 PX4 43 Gazebo 安装PX4步骤安装MAVROS安装QGCPX4仿真 安装PX4步骤 从github上clone源码 span class token function git s
  • PX4+Offboard模式+代码控制无人机起飞(Gazebo)

    参考PX4自动驾驶用户指南 https docs px4 io main zh ros mavros offboard cpp html 我的另一篇博客写了 键盘控制PX4无人机飞行 PX4无人机 键盘控制飞行代码 可以先借鉴本篇博客 xf
  • PX4无人机 - 键盘控制飞行代码

    PX4无人机 键盘控制飞行代码 仿真效果 实机效果 由于图片限制5M以内 xff0c 只能上传一小段了 xff0c 整段视频请点击链接 Pixhawk 6c 无人机 键盘控制无人机 Offboard模式 核心 xff1a 发布 mavros
  • 基于F4/F7/H7飞控硬件和px4飞控固件的廉价自主无人机系统(1)-飞控

    前言 穿越机F4 F7 H7飞控是一系列采用stm32系列F4xx和F7xx处理器的飞控的统称 xff0c 是目前穿越机爱好者非常喜欢使用的飞控硬件 xff0c 其价格也非常便宜180 xff5e 410 而px4则是一款常见的开源飞控固件
  • px4源码编译指南

    px4源码编译指南 强烈推荐大家去看官网的英文文档 xff0c 国内的博客杂七杂八 xff0c 官网的中文也很久没有更新 xff0c 这几天自己踩了很多坑 xff0c 写个教程希望能帮助到大家 xff08 本文选用平台是pixhawk1 1
  • PX4飞控之PWM输出控制

    PX4飞控之PWM输出控制 多旋翼电调如好盈XRotor xff0c DJI通用电调等都支持PWM信号来传输控制信号 常用的400Hz电调信号对应周期2500us xff0c 一般使用高电平时间1000us 2000us为有效信号区间 xf
  • 无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

    无人机仿真 PX4编译 xff0c gazebo仿真及简单off board控制模式下无人机起飞 前言 在上篇记录中 xff0c 已经对整体的PX4仿真环境有了一定的了解 xff0c 现如今就要开始对无人机进行起飞等仿真环境工作 xff0c
  • PX4 -- EKF2

    文章目录 EKF2参数高度估计Range Finder滤波 单变量更新单变量更新对多变量的影响 EKF2 参数 EKF2 中有一类 GATE 参数 当测量值在 VAR GATE 范围内才会更新值 高度估计 四种高度控制方法 xff1a 气压
  • PX4模块设计之二十一:uORB消息管理模块

    PX4模块设计之二十一 xff1a uORB消息管理模块 1 uORB模块构建模式2 uORB消息管理函数2 1 状态查询2 2 资源利用2 3 模块启动2 4 模块停止3 uORB消息接口3 1 消息主题注册3 2 消息主题去注册3 3
  • PX4模块设计之二十三:自定义FlightTask

    PX4模块设计之二十三 xff1a 自定义FlightTask Step1 创建飞行模式文件夹Step2 创建飞行模式源代码和CMakeLists txt文件Step3 更新CMakeLists txt文件Step4 更新FlightTas
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • PX4模块设计之四十六:dataman模块

    PX4模块设计之四十六 xff1a dataman模块 1 dataman模块简介2 模块入口函数dataman main3 dataman模块重要函数3 1 start3 2 stop3 3 status3 4 task main 4 A
  • PX4模块设计之四十七:mavlink模块

    PX4模块设计之四十七 xff1a mavlink模块 1 mavlink模块简介2 模块入口函数mavlink main3 mavlink模块重要函数3 1 Mavlink start3 2 Mavlink task main3 3 Ma
  • 【px4】运行mavsdk中的offboard example

    运行MAVSDK中的offboard例子时无人机不执行 想控制无人机前后左右移动 xff0c 在按照官方教程实现offboard 插件的时候 发现用action插件能正常起飞和降落 但是一旦执行到offboard的插件代码的时候就会自动降落
  • 步骤八:PX4使用cartographer与move_base进行自主建图导航

    首先老样子硬件如下 飞控 HOLYBRO PIXHAWK V4 PX4 机载电脑 jetson nano b01 激光雷达 思岚a2 前提 你已经完成了cartographer建图部分 能够正常输出map话题 前言 由于要参加中国机器人大赛
  • PX4项目学习::(七)飞控栈:commander

    PX4的飞行控制程序通过模块来实现 xff0c 与飞控相关的模块主要有commander xff0c navigator xff0c pos control xff0c att control这几个 xff0c 分别可以在src modul
  • 无人机PX4使用动捕系统mocap的位置实现控制+MAVROS

    动捕系统Optitrack xff0c 有很高的定位精度 xff0c 能够给无人机提供比较精确的位置信息 xff0c 因此如果实验室有条件 xff0c 都可以买一套动捕系统 动捕系统的原理 xff1a 光学式动作捕捉依靠一整套精密而复杂的光

随机推荐

  • C语言截取某个字符之前的字符串

    uint32 size 61 0 int p char str 61 34 fadhjkfhadl fhdjfkhla dfjkadlf 34 char str2 61 34 34 p 61 0 for int k 61 0 strlen
  • Xlib: extension “XInputExtension“ missing on display “:1.0“

    ubuntu 安装vscode之后点击生成的图标无法打开 xff08 没有图标记得重启 xff09 xff0c 建议在安装地址直接打开可以看到报错信息 如果是root用户 xff0c 可能需要 no sandbox参数才能启动 继续执行 c
  • matlab的帮助文档切换成中文(求助贴)

    Matlab的帮助文档切换成中文 xff08 求助贴 xff09 题主的matlab版本 xff1a 2018a 系统win10 问题描述 xff1a 当使用matlab时 xff0c 有时需要使用help 语句查看一些关键字的用法 xff
  • Android使用Google Breakpad进行崩溃日志管理

    开发过程中 xff0c 最担心的问题就是程序崩溃 xff0c 而且还不知道崩溃的原因 xff0c 现在使用Google Breakpad来跟踪崩溃的位置 xff0c 非常方便 xff1b 由于目前使用Mac系统开发 xff0c Google
  • Python--使用jieba进行分词并计算词权重

    span class token keyword import span jieba span class token keyword import span xlrd span class token keyword import spa
  • 商务统计_13 使用excel拟合曲趋势线

    趋势线拟合 xff1a 选中两列数据 xff0c 汇制带平滑曲线的散点图选中图中曲线 xff0c 右键 增加趋势线在右边的趋势线格式中 xff0c 将 显示公式 amp 显示R平方值 打勾选择合适的趋势线 xff0c 指数 xff0c 线性
  • 解决k8s无法安装flannel

    手动创建 kube flannel yml文件 span class token punctuation span root 64 k8smaster span class token punctuation span span class
  • 树莓派 VNC Viewer 远程桌面配置教程 及 显示 cannot currently show the desktop 的解决方法

    树莓派 VNC Viewer 远程桌面配置教程 在此之前你需要能够登录树莓派 xff0c 使用命令窗口对树莓派进行操控 下面的操作使用的是ssh对树莓派进行控制 启用VNC服务 打开终端 xff0c 进入配置界面 span class to
  • 分享几个找论文参考文献的网站

    1 库问搜索 打造免费开源文献资源共享平台 http www koovin com 2 论文驿站 免费中文文献库 xff0c 顶级论文数据库 xff0c 每天同步更新 https www lunwenyizhan com 3 中国知网 ht
  • 解决ubuntu全屏后分辨率低的问题

    Ubuntu 设置屏幕分辨率显示Unknown display 无法设置分辨率 解决方法 方法一 xff1a xff08 临时性 xff0c 重启会失效 xff09 使用xrandr命令调节分辨率 xff0c 带 号的为当前分辨率 xff0
  • ubuntu18.04安装WINEHQ时出现的问题:E: 文件 list 第 x 行的记录格式有误 /etc/apt/sources.list (Component) E: 无法读取源列表。

    ubuntu18 04安装WINEHQ时出现的问题 xff1a E 文件 list 第 x 行的记录格式有误 etc apt sources list Component E 无法读取源列表 详细安装过程可以参考 xff08 官网 xff0
  • Hexo系列——(一) Hexo的安装与使用

    目录 前言一 安装Node js和Git1 安装node js和npm xff0c npm是node js的包管理工具2 更新npm的镜像源 3 全局安装n管理器 用于管理node js 4 安装最新的node js xff08 stabl
  • 协方差和协方差矩阵的定义和理解

    先复习一下这个 xff1a 均值 标准差 方差 为什么需要协方差 xff1f 上面几个统计量看似已经描述的差不多了 xff0c 但我们应该注意到 xff0c 标准差和方差一般是用来描述一维数据的 xff0c 但现实生活我们常常遇到含有多维数
  • dockerfile 中运行 apt-get update 报错 returned a non-zero code: 100

    在 docker 中运行 apt get update 报错 returned a non zero code 100 出现问题 xff1a 在构建 docker 执行 Dockerfile 中的 RUN apt get update 时报
  • Opencv 实现简单UDP局域网实时摄像头传输 (一)

    做项目需要用到网络编程及摄像头捕捉 xff0c 经过简单学习完成一个简单的视频发送 发送端 sender cpp include 34 stdafx h 34 include 34 WinSock2 h 34 include lt open
  • 使用3D地面站(AcmeGCS)的编队飞行

    使用3D地面站 xff08 AcmeGCS xff09 的编队飞行 无人机编队飞行的方法有很多种 xff0c 本文演示一种使用PX4 43 3D地面站 AcmeGCS 43 ROS的多机控制方法 PX4提供了非常好的软件仿真环境 xff0c
  • PX4-1-开源飞控项目

    分享完工具系列 xff0c 我们开始PX4飞控技术的分享 xff0c 写分享相对于自己写笔记要难很多 xff0c 在整理自己笔记的过程中也重新思考很多问题 飞控技术的分享系列更多分享的是思路和框架 对于PX4这种大型开源项目 xff0c 源
  • PX4-3-uORB

    uORB Micro Object Request Broker 微对象请求代理器 是PX4中非常重要且关键的一个模块 xff0c 用于各个模块之间的数据交互 实际上uORB是一套跨 进程 的IPC通讯模块 在PX4中 xff0c 所有的功
  • PX4-5-SPI-IIC设备驱动

    在之前的分享中 xff0c 我们聊了PX4的通信框架和任务调度框架 xff0c 现在我们讲一下PX4的设备驱动 PX4支持很多种设备 xff0c 根据通信方式的不同大致分为 xff1a SPI IIC设备 串口设备 IO设备 CAN设备 这
  • PX4-6-串口设备驱动

    上一篇我们讲了PX4的SPI IIC设备驱动 xff0c 现在讲一下PX4的串口设备 PX4的串口设备驱动框架比SPI IIC设备简单不少 xff0c 使用了两种底层实现方式 xff1a 一种是系统自带的标准字符设备接口 xff0c 一种是