PX4代码解析(4)

2023-05-16

一、引言

PX4程序是基于实时操作系统(Real-time operating system, RTOS)的上层应用程序,PX4飞控程序的很多重要模块都是在Nuttx操作系统的调度下运行的。因此,想要弄懂PX4源码,需要了解一些操作系统的相关知识。

二、任务调度

早期计算机由于技术限制,大部分处理器都是单一核心,即CPU在同一时间只能处理一个工作。例如,在没有任务调度的打印程序中,程序需要等待打印机就绪,之后才能向打印机发送文字。但由于打印机是外部设备,其响应速度与执行速度远低于CPU,这会导致CPU需要等待打印机响应,导致CPU资源浪费,为了解决这个问题,人们提出了一系列任务调度的方法。

1.时间片轮转调度

时间片轮转调度是最为简单的调度方法,当某任务执行一小段时间后,CPU保存当前任务,然后去执行另一个任务,再执行一小段时间后,再将这个任务保存,再转回执行第一个任务。每个被执行的任务都会被操作系统分配一个时间片,CPU在执行任务时会计算当前任务执行的时间,当时间片耗尽之后,会对当前任务进行保存,并对另一个任务恢复现场并执行。例如,任务A与B,处理器先载入A任务相关参数并执行,当执行一段时间后,转入任务B执行,并保存A任务状态,再过一段时间,将任务B执行状态保存,转去执行任务A,重复此操作,示意图如下所示。
在这里插入图片描述

2.多级反馈队列

在实际应用中,简单的时间片轮转调度有很大的局限性,在这种调度下,每一个任务所占用的CPU执行时间相同,所有任务都是平等的,但这种方法不切合实际,因此人们提出了多级反馈队列的调度方式。这一部分可以参考多级反馈队列调度算法.

3.抢占式优先级

在嵌入式操作系统中,通常对任务的实时性有要求。为此,我们可以为每一个任务分配一个优先级,操作系统优先执行高优先级的任务,只有高优先级任务主动休眠,或者等待资源时才将其挂起,运行低优先级的任务。这种调度策略就是抢占式优先级调度,即高优先级任务抢占低优先级任务的运行权。
PX4中Nuttx系统采取的就是抢占式优先级调度,每一个运行的任务都可以为其指定优先级,Nuttx在调度时按优先级调度。如果多个任务具有相同优先级,则采取时间片轮转的方式。
这种调度方式的优点在于可以保证高优先级任务运行的实时性,对嵌入式系统具有重要意义。例如,在无人机中,导航任务与控制任务的优先级就要高于数据传输和网络通信任务,只有这样才可以最大程度保证无人机飞行安全。

三、多进程与多线程

1.进程

进程,简单来说,就是运行中的程序。我们在计算机上播放音乐,上网冲浪,查看照片,像这样操作系统为用户提供的多个任务,被称为操作系统中的进程。举个简单的例子,我们在linux中创建c文件,命名为test1.c,并输入如下代码

#include <stdio.h>
#include <unistd.h>


int main()
{
    for(int i = 0; i<1000; i++)
    {
	printf("%d\n",i);
	sleep(1);
    }
    return 0;
}

该程序通过for循环输出i的值,将程序保存,通过gcc命令将其编译为一个可执行的文件test1

gcc test1.c -o test1

执行过后,会在当前文件夹下生成名为test1的可执行文件。在操作系统没有执行之前,它作为普通文件存放在计算机中,当执行./test1后,计算机会将test1文件载入内存,并开始运行,此时该可执行文件就成了可以运行的进程,运行结果如图
在这里插入图片描述在linux中,我们可以采用ps命令查看进程
在这里插入图片描述在PX4飞控程序中,许多模块作为一个进程(任务)运行在pixhawk中。链接pixhawk硬件,输入top命令,可以得到
在这里插入图片描述通过top命令可以清晰看到每一个进程(任务)的ID号,名称,CPU占用百分比,进程优先级等。有关进程更为详细的应用我会后续介绍

2.线程

通常我们并不希望操作系统的最小调度单位为进程。换句话来说,我们希望一个进程在执行时,这个进程可以并行执行多个任务,而不是只能执行一个任务,于是就有了线程的概念。还是以个人电脑为例,电脑中有一个记事本的程序,我们打开运行后可以在其中输入内容,同时我们还可以将输入的内容进行保存,在使用时,输入与保存功能往往是可以同时进行的。事实上,输入与保存就是记事本进程下的两个并行任务,我们称为线程。
操作系统允许一个进程中创建多个可并行的调度单元,即线程。所以线程机制使进程在同一时间执行多个任务。多个进程在操作系统运行的过程通常称为多进程,一个进程中的多个线程运行的过程称为多线程,下面以一段代码讲解多线程的创建与运行。首先创建test2.c文件,在其中输入如下内容:

#include<stdio.h>
#include<unistd.h>
#include<pthread.h>

void* pth_func1(void *arg)
{
    for (int i = 0; i < 2; i++)
    {
        printf("%s: i = %d\n",__func__,i);
        sleep(1);
    }
    return NULL;
    
}

void* pth_func2(void *arg)
{
    int cnt = (int)(long int)arg;
    for (int i = 0; i < cnt; i++)
    {
        printf("%s: i = %d\n",__func__,i);
        sleep(1);
    }
    return NULL;
    
}

int main(int argc, char *argv[])
{
    //定义3个多线程描述符变量
    pthread_t pth1, pth2, pth3;
    //创建进程,进程名称为pth1,执行函数为pth_func1(),输入参数为NULL(无)
    pthread_create(&pth1, NULL, &pth_func1, NULL);
    pthread_create(&pth2, NULL, &pth_func2, (void*)3);
    pthread_create(&pth3, NULL, &pth_func2, (void*)5);
    //调用pthread_join()函数等待线程运行结束,当三个线程都结束后,主进程才会继续运行
    pthread_join(pth1, NULL);
    pthread_join(pth2, NULL);
    pthread_join(pth3, NULL);
    return 0;
}

保存文件然后输入如下代码进行编译

gcc test2.c -o test2 -lpthread

随后输入./test2运行代码,运行结果如下
在这里插入图片描述程序一共运行5s,然后退出,运行过程为:线程1运行2s,输出两次;线程2运行3s,输出三次;线程3运行5s,输出五次。可以看到,在同一进程下的可以同时运行多个任务(线程)

3.PX4中进程与线程

大致了解了进程与线程,看看PX4代码中是如何调用这一功能吧。PX4代码版本为V1.11,打开/PX4_Firmware/platforms/posix/src/px4/common/tasks.cpp文件,你会看到PX4中创建进程的函数px4_task_spawn_cmd(),具体函数注释如下

px4_task_t px4_task_spawn_cmd(const char *name, int scheduler, int priority, int stack_size, px4_main_t entry,
			      char *const argv[])
//函数功能:创建进程
//返回值:返回创建进程的ID号
//输入值:name:进程名称
//       scheduler:线程调度调度方式,RR或FIFO,RR是指时间片轮转,FIFO是指先进先出的调度策略
//       priority:进程优先级
//       stack_size:分配堆栈内存大小
//       entry:进程函数
//       argv:进程参数

此外,px4_task_t在PX4中为int的别名,后续文章我将更新PX4如何使用进程与线程以及怎么在PX4中创建自己的进程

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

PX4代码解析(4) 的相关文章

  • PX4+QGC+jmavsim软件在环仿真

    一 环境修改 参考官方手册jMAVSim 仿真模拟 PX4 Developer Guide xff0c 以上环境基于上一篇内容 xff0c 未完成ROS 43 jmavsim 43 QGC环境搭建的请移步Ubuntu18 04下px4 43
  • PX4与TX2通信

    PX4与TX2通信以及相关数据的获取 目录 1 PX4硬件接口 2 TELEM1 2接口线序 3 PX4与TX2通信 PX4 IO口定义 xff1a PX4硬件 xff1a 4 通信测试 5 RTPS 43 ROS Jetson TX2终端
  • PX4使用I2C方式添加自定义传感器(1)

    PX4使用I2C方式添加自定义传感器 xff08 1 xff09 前言 毕业设计就是要在PX4上添加一个传感器 xff08 角度传感器 xff09 xff0c 由于板子上的接口数量很少 xff0c 很是宝贵 最后只能选择通过I2C通信方式
  • 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
  • PX4代码学习系列博客(5)——在px4中添加自己的模块

    怎么在px4中添加自己的模块 在 px4固件目录结构和代码风格 这一节 xff0c 曾经说过NuttX是一个实时的嵌入式系统 xff0c 上面可以像windows那样运行程序 那既然是应用程序 xff0c 那我们应该也能写一些可以在Nutt
  • PX4代码学习系列博客(6)——offboard模式位置控制代码分析

    分析offboard模式的代码需要用到以下几个模块 local position estimator mavlink mc pos control mc att control mixer 程序数据走向 mavlink 一般的offboar
  • px4源码编译指南

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

    sudo git clone https github com PX4 PX4 Autopilot git recursivegit submodule update init recursivegit submodule update r
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • 无人机仿真—PX4编译,gazebo仿真及简单off board控制模式下无人机起飞

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

    PX4模块设计之十七 xff1a ModuleBase模块 1 ModuleBase模块介绍2 ModuleBase类介绍3 ModuleBase类功能介绍3 1 模块入口3 2 模块启动3 3 模块停止3 4 状态查询3 5 任务回调3
  • PX4模块设计之三十四:ControlAllocator模块

    PX4模块设计之三十四 xff1a ControlAllocator模块 1 ControlAllocator模块简介2 模块入口函数2 1 主入口control allocator main2 2 自定义子命令custom command
  • PX4模块设计之三十九:Commander模块

    PX4模块设计之三十九 xff1a Commander模块 1 Commander模块简介2 模块入口函数2 1 主入口commander main2 2 自定义子命令custom command 3 Commander模块重要函数3 1
  • 关于github px4 gps 驱动的开发的总结

    源码编译上边已经写过文章了 遇到的几个问题 1 解决虚拟机不能共享文件夹的问题 一开始虚拟机的更新 vmware tools 是灰色的 xff0c 不能点 xff0c 然后通过关掉虚拟机 xff0c 然后再开启的时候 xff0c 在没有启动
  • PX4-4-任务调度

    PX4所有的功能都封装在独立的模块中 xff0c uORB是任务间数据交互和同步的工具 xff0c 而管理和调度每个任务 xff0c PX4也提供了一套很好的机制 xff0c 这一篇我们分享PX4的任务调度机制 我们以PX4 1 11 3版
  • px4无人机常识介绍(固件,px4等)

    专业名词解释 aircraft 任何可以飞或者可以携带物品还是搭载旅客的飞行器统称为飞机 航空器 uav 无人驾驶飞机 vehicle 飞行器 airplane plane aero plane 有机翼和一个或多个引擎的飞行器统称为飞机 D
  • PX4软件在环仿真注意点

    注 xff1a 最新内容参考PX4 user guide 点击此处 PX4下载指定版本代码和刷固件的三种方式 点击此处 PX4sitl固件编译方法 点击此处 PX4开发指南 点击此处 PX4无人机仿真 Gazebo 点击此处 px4仿真 知
  • 四、无人机知识笔记(初级:基本运动原理)

    笔记来源于 沈阳无距科技 工业级无人机的中国名片 编程外星人 目录 一 多旋翼直升机 二 基本飞行姿态 三 多旋翼飞行原理 四 反扭力与偏航运动 五 螺旋桨 六 有刷电机和无刷电机 七 电调与PWM信号 八 动力电池 九 遥控器 十 机架设
  • 大神浅谈无人机飞控软件设计 系统性总结

    写在前面 深感自己对飞控软件 算法的知识点过于杂乱 很久没有进行系统的总结了 因此决定写几篇文章记录一些飞控开发过程的知识点 主要是针对一些软件 算法部分进行讨论 如内容有错误 欢迎指出 1 飞控软件的基本模块 无人机能够飞行主要是依靠传感

随机推荐

  • JavaScript设计模式:四、发布订阅模式

    JavaScript设计模式 xff1a 四 发布订阅模式 文章目录 JavaScript设计模式 xff1a 四 发布订阅模式一 概述1 观察者模式2 发布订阅模式3 观察者模式是不是发布订阅模式 一 概述 观察者模式 xff1a 观察者
  • FreeRTOS教程——二值信号量(四)

    二值信号量 信号量简介 目的 xff1a 共享资源访问 与任务同步 信号量类型 xff1a 二值信号量 计数型信号量 互斥信号量 递归互斥信号量 本质上是一种只包含一个项数的队列 二值信号量 0 和 1 xff0c 一种内核机制 内核同步
  • Bug:Warning: [antd: ***] overlay is deprecated. Please use menu instead.以及解决方案

    Ant Design Pro umi4Bug记录 xff1a Bug xff1a Warning antd overlay is deprecated Please use menu instead 解决方案 xff1a yarn add
  • 前端初学者的Ant Design Pro V6总结(上)

    前端初学者的Ant Design Pro V6总结 xff08 上 xff09 一 UI组件开发流程 61 gt 通用 xff08 异步 xff09 函数useEmotionCss 定义CSSuseModel获取全局状态useCallbac
  • 关于C语言在VS2017上开头格式

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • Java中Long和long的区别

    Java中Long和long的区别 Java的数据类型分为两种 xff1a 1 基本类型 xff1a byte 8 short 16 int 32 long 64 float 32 double 64 char 16 boolean 1 2
  • Windows 10 下如何彻底关闭 Hyper-V 服务

    CMD运行bcdedit set hypervisorlaunchtype off 恢复使用 xff1a bcdedit set hypervisorlaunchtype auto
  • 从百度运维实践谈“基于机器学习的智能运维”

    清华大学计算机系副教授裴丹于运维自动化专场发表了题为 基于机器学习的智能运维 的演讲 xff0c 上篇参看 科研角度谈 如何实现基于机器学习的智能运维 文章 xff0c 此为下篇 从百度运维实践谈基于机器学习的智能运维 以下为演讲实录 xf
  • python通过udp传输图片

    首先要了解UDP的工作模式 对于服务器 xff0c 首先绑定IP和端口 xff0c 本机测试的时候可以使用127 0 0 1是本机的专有IP xff0c 端口号 大于1024的是自定义的 xff0c 所以用大于1024的端口号 xff0c
  • D435i跑通ORB-SLAM2

    这篇文章主要记录我的实现过程 根据官方安装文档 xff0c 并参考以下两篇博客 xff0c 可以比较顺利的实现 xff1a Realsense D435i 在ubuntu上安装SDK与ROS Wrapper 运行ORB SLAM2 RTAB
  • 通俗理解滑模变结构控制(1)

    这里写自定义目录标题 1 什么是滑模变结构控制2 滑模变结构的一些基本知识3 滑模控制器设计4 滑模控制器例子 1 什么是滑模变结构控制 在开始介绍滑模变结构控制之前 xff0c 最好先学习一些线性控制的基础 xff0c 知道什么是李亚普诺
  • 终端滑模(Terminal滑模)理解

    一 什么是终端滑模 在前面所介绍的滑模控制中 xff0c 我们是选取了一个线性的滑模面s xff0c 使系统达到滑模面后 xff0c 误差逐渐收敛到0 xff0c 收敛的速度可以通过调节滑模面的参数来实现 后来人们为了使滑模控制有更好的性能
  • PX4环境git submodule update --init --recursive失败的解决办法

    最近开始搭建PX4环境 xff0c 搭建是需要从github下载工程 xff0c 然后使用语句git submodule update init recursive更新工程子模块 xff0c 但往往由于网络原因这一步需要很久 xff0c 甚
  • 变结构滑模控制抖振处理(1)------动态滑模法

    1 什么是动态滑模 从前面一些关于滑模的介绍 xff0c 我们知道 xff0c 在设计滑模控制器时 xff0c 避不开的问题就是抖振 至于抖振的产生 xff0c 很大程度上是由于一般滑模控制器的控制律u是一个不连续的函数 xff0c u中往
  • 四旋翼双环PID控制

    在我上篇博客 四旋翼无人机Matlab建模 中 xff0c 我建立了四旋翼的模型 xff0c 并在simulink中搭建了仿真 xff0c 但并没有设计控制器 本章便针对四旋翼设计最常见的串级PID控制器 xff0c 本篇文章主要从两个部分
  • PX4代码解析(1)

    前言 做pixhawk飞控有一段时间了 xff0c 但在学习过程中遇到许多困难 xff0c 目前网上找不到比较完整的PX4学习笔记 xff0c 我打算结合自己理解 xff0c 写写自己对PX4源码的理解 xff0c 不一定对 xff0c 只
  • PX4代码解析(2)

    前言 在大致了解PX4代码架构后 xff0c 我们需要了解PX4的通信机制 在PX4代码架构中 xff0c 每通信总线主要分为两个部分 xff0c 一是内部通信总线uORB 即PX4内部进程通信采用的协议 xff0c 例如PX4内部姿态控制
  • px4代码解析(3)

    前言 在使用PX4飞控时 xff0c 我们难免要对其进行二次开发 xff0c 例如修改控制算法 xff0c 添加新的传感器 xff0c 这时需要在代码中定义属于自己的消息 本节主要分享一下如何在PX4代码中添加自己的消息 一 消息添加与配置
  • 七月在线NLP千元课程笔记

    xfeff xfeff NLP七月在线 照着PDF的内容解释 第一课 NLP基础知识 Python基础知识7分钟 正则表达式验证工具 https regexr com v1 基本字符 匹配除了换行符外所有字符 d匹配所有数字 能找到所有数字
  • PX4代码解析(4)

    一 引言 PX4程序是基于实时操作系统 xff08 Real time operating system RTOS xff09 的上层应用程序 xff0c PX4飞控程序的很多重要模块都是在Nuttx操作系统的调度下运行的 因此 xff0c