当前位置: 首页 > news >正文

10. PH47代码框架文件组织

通过之前章节对PH47体系的介绍,读者对PH47能建立起了初步的概念及掌握各主要构成部分的使用开发方法。从本章节开始,就将对PH47代码的二次开发内容进行具体讲述。

本部分就将对PH47框架当中代码文件的组织方式及功能作用进行介绍,对于将来熟练使用代码框架进行二次开发具有重要的意义。

PH47代码框架重要文件夹及文件

PH47文件夹包含了代码框架的所有代码文件,以及由Stm32CubeMx生成的控制板代码框架。此文件夹下DevStudio文件夹内为框架的核心代码。

BBP,BBP_Copter, BBDB均为Stm32CubeMx生成,对应各自控制板工程框架的代码文件夹,以下均以XXX来代替。

各控制板Keil项目文件PH47\xxx\MDK-ARM\xxx.uvprojx

PH7 代码适用控制板的keil项目文件位于PH47\xxx\MDK-ARM\文件夹下,文件名为xxx.uvprojx。xxx对应控制板名称,即BBP、BBP_Copter、BBDB等。上述项目文件由Stm32CubeMx生成硬件代码框架时生成。

各控制板Visual Studio项目文件\PH47\xxx\xxx.sln

Visaual Studio 项目文件,在Visual Studio IDE进行代码编辑管理时,控制板相关代码文件组织度好于VS Code

文件夹 PH47\DevStudio

PH7 代码框架所有源代码文件及库文件均位于DevStudio文件夹中。此文件夹同时是用户进行二次开发的主要文件夹。框架自身代码文件及用户二次开发代码文件均位于本文件夹中。

控制板配置文件PH47\DevStudio\BoardConfig\BoardConfig.h

PH7框架的各控制板项目(PH4, BBP, BBP_Copter等)编译开关配置文件为 \DevStudio\BoardConfig\BoardConfig.h。该文件确定了控制板的硬件类别以及固件类别。同时设定了PH47框架最基本的一些数值。

在打开 xxx.uvprojx 文件进行keil项目编译之前,必须将 BoardConfig.h 文件中设置飞控板类型的 BOARD_TYPE,以及固件类型FIRM_WARE_TYPE。

例如要编译适用于BBP控制板(BBP v2,BBP mini),固件项目为多传感器基础开发平台的BBDB,那么就需要进行如下设定:

#define BOARD_TYPEBOARD_BBP
#define FIRM_WARE_TYPEFIRMWARE_BBDB

控制板ID宏定义位于PH47\DevStudio\ConfigConstant.h文件中。

文件夹DevStudio下各文件夹功能

DevStudio文件夹下各子文件夹分别对应的逻辑层、引用对象、实现文件如下表所示:

文件夹实现的逻辑层全局引用对象实现文件
\BSP驱动层 Driverdrv或mcuDriver.cpp(.h)McuDev(.h)
\Frame框架层 FrameFrm或coreFrame.cpp(.h)
\Algorithms算法层 AlgorithmsalgoAlgorithms.cpp(.h)
\Application应用层 ApplicationappApp_BBP.cpp(.h)
\BoardConfig飞控板配置----BoardConfig.h

PH47代码框架各逻辑层介绍

PH7代码框架在由Stm32CubeMx自动生成的硬件代码基础上,由底向上构建了4个逻辑层,分别为:驱动层 driver、框架层 frame、算法层 algorithms、应用层 application。

drv(mcu)、frm(core)、algo、app 4个全局引用分别对应以上4个逻辑层。通过这些引用,用户可在整个PH7代码框架范围内调用各逻辑层的功能。

硬件驱动层引用对象drv及mcu

硬件驱动层driver用于实现对控制板硬件设备的驱动及管理。驱动层下包含多个指向硬件设备驱动对象的指针。通过这些指针,用户可对硬件设备进行数据读写、设备控制等多种功能。

驱动层代码对用户开放,高级用户可通过创建指向不同类型设备驱动类的指针,实现支持设备类型的扩展。或对已有硬件设备进行替换。

驱动层外设驱动引用对象drv下的个外设模块指针介绍如下(在\DevStudio\Bsp\Driver.h文件中声明):

drv._pImu// 6轴(Gyro,Accel) IMU对象指针
drv._pMag// 磁强计对象指针
drv._pGps// GPS 对象指针
drv._pAirSpeed // 空速计对象指针
drv._pFlash// Flash存储器对象指针
drv._pEeprom// EEProm存储器对象指针
drv._pUsartTele// 遥测通讯串口对象指针
drv._pUsartGps// GPS通讯窗口指针
drv._pUsartConsole // 调试串口(控制台串口)指针
drv._pPwm // PWM in 对象指针
drv._pMutiDof// 10dof 传感器对象指针(可选)

驱动层MCU驱动引用对象mcu下的指针介绍(在\DevStudio\Bsp\Driver.h文件中声明):

CTimer_Port*_pSysTimer;// 系统定时器对象指针
CI2C*_pI2C_1;// I2C 1 接口对象指针
CSpi_Port*_pSpiImu;// IMU SPI 接口对象指针
CSpi_Port*_pSpiAdcImu;// IMU ADC 的SPI 接口对象指针(PH7)
CSpi_Port*_pSpiFlash;// Flash SPI 接口对象指针

框架层引用对象frm 及 core:

框架层frame是PH47代码框架最重要的逻辑层之一,框架层顾名思义,为整个PH47代码体系建立了运行逻辑的框架,框架层负责整个框架的运行调度及包括参数系统、遥测通讯系统等重要的基础功能实现。

框架层下包含多个实现不同功能的次级引用,通过这些次级引用,用户可使用它们提供的功能函数。重要的次级引用对象如:

frm.log// 机载数据记录系统引用对象
frm.mutipilot// 多飞控板板协作控制引用对象
core.para// 机载控制参数系统引用对象
core.wp// 航点记录系统引用对象
core.mavlink// 对地面站(GCS)数据通讯系统引用对象
core.airlink// 多飞控板通讯系统引用对象

框架层功能函数可通过frm或core引用对象来使用,它们的区别在于,开源代码部分可以同时使用frm或core引用对应的功能函数。而在闭源代码部分,只能通过core来引用相应的功能函数。框架层功能代码小部分向用户开放。

算法层引用对象algo:

算法层Algorithms用于飞控各种控制算法的实现,如基础数学库、姿态控制器、高度——速度控制器、输入控制器、状态控制器等的具体实现。算法层下包含多个指向不同控制器对象的指针。高级用户可通过创建指向不同控制器的指针实现控制器功能的拓展或控制器的替换。关于算法层下对象或指针的详细介绍,参见:

应用层引用对象app

应用层Application用于对PH47代码框架的最终逻辑功能实现。用户对飞控或其他控制对象的逻辑应用控制功能均位于该层。用户的二次开发工作的主要代码实现也位于该层。

应用层引用对象app主要面向用户二次开发,方便用户使用应用层的各种功能函数。

数据总线系统引用bus

数据总线引用bus是PH7框架中最重要和常用的引用之一,通过bus引用,户可以在整个PH7框架内进行数据的交换传输。关于bus引用的详细介绍,参见:“11.PH47代码框架数据总线系统”。

消息循环系统引用msg

功能测试系统引用test

用户二次开发涉及主要文件:

文件DevStudio\Application\App_xxx.cpp(.h)

应用层实现文件,用可在该文件中实现自己的各种运行及控制逻辑。是用户二次开发工作的主要代码承载文件。

文件DevStudio\BoardConfig\Board_xxx\DataBus_BBP_xxx.cpp(.h)

数据总线定义文件,用户可在已有数据总线条目设置的基础上进行追加,定制方法具体可见“数据总线使用”。

文件DevStudio\BoardConfig\Board_xxx\ParamDict_xxx.cpp(.h)

参数属性字典及参数定义文件,用户在这两个文件中可对参数系统进行定制,定制方法具体可见“参数系统使用”

文件PH47\DevStudio\Algorithms\Algorithms.cpp(.h)

算法层实现文件,用户可增加新的算法或控制器模块,或替换原有模块。

文件DevStudio\Bsp\Driver.cpp(.h)

驱动层实现文件,用户可增加新的硬件驱动,或替换原有驱动模块。

更多内容见CSDN博客专栏:无人机飞控icon-default.png?t=O83Ahttps://blog.csdn.net/ss15/category_9690939.html?spm=1001.2014.3001.5482
相关资源:PH47: PH47运动控制代码框架.icon-default.png?t=O83Ahttps://gitee.com/ss15/ph47

相关文章:

10. PH47代码框架文件组织

通过之前章节对PH47体系的介绍,读者对PH47能建立起了初步的概念及掌握各主要构成部分的使用开发方法。从本章节开始,就将对PH47代码的二次开发内容进行具体讲述。 本部分就将对PH47框架当中代码文件的组织方式及功能作用进行介绍,对于将来熟…...

LabVIEW提高开发效率技巧----VI继承与重载

在LabVIEW开发中,继承和重载是面向对象编程(OOP)中的重要概念。通过合理运用继承与重载,不仅能提高代码的复用性和灵活性,还能减少开发时间和维护成本。下面从多个角度介绍如何在LabVIEW中使用继承和重载,并…...

4.8 大数据发展趋势

文章目录 今天,我想与大家探讨一个充满潜力和变革的主题——大数据的发展趋势。大数据不仅正在改变我们的工作和生活方式,更是推动社会进步和经济发展的关键因素。 首先,让我们看看国内的大数据发展趋势。中国政府高度重视大数据产业&#x…...

【无标题】react组件封装

子组件制作 import { useState,useRef, useEffect} from "react"const Table (data)> {const {value ,option} dataconsole.log(value)const [stata,setValue] useState()const useRefs useRef(value)useEffect(()> {useRefs.current.value value })c…...

git+cmake将Open3D配置到visual studio

这里假设你已经安装好了上述内容,我们直接开始安装: 第一步:以管理员身份打开powershell,执行 git clone https://github.com/isl-org/Open3D.git然后依次执行 cd Open3D mkdir build cd build开启你的梯子,并设置你…...

ArcGIS-CityEngine 2024-新手小白也能试用+入门可视化vga编程--第一篇

目录 下载CityEngine并创建空项目 场景双击 _Tour (Navigator面板)的就行了,(不用额外下载) 生成街道 基本操作 多个图层Group 区分 Editor 多个区域(插件模式,浮空窗口, 官方的例子&…...

IntelliJ IDEA 快捷键大全(也适用全家桶其他编辑器)

以下是 IntelliJ IDEA 的常用功能快捷键大全,适用于 Windows/Linux 系统(Mac 用户可将 Ctrl 替换为 Cmd,Alt 替换为 Option): 功能分类功能描述快捷键 (Windows/Linux)基本操作显示所有快捷键Ctrl J显示主菜单Alt H…...

基于SSM高校普法系统的设计

管理员账户功能包括:系统首页,个人中心,学生管理,律师管理,法律知识管理,新闻类型管理,法律新闻,律师推荐管理 律师账号功能包括:系统首页,个人中心&#xf…...

CDN加速流程分享

我们有IP,我们需要用CDN的阿里云进行加速,让网站的视频显示的更加流畅 首先,我们面对的第一个问题就是把ip解析成域名的形式,我们这里的域名是 edu.senhacore.xyz 解释一下为什么要变成域名才行,因为国内要使用cdn就必须把ip转…...

全网爆火的排队免单模式究竟是如何运作?

在私域平台的探索过程中,许多企业主尝试了链动21、推三返一等裂变模式。虽然这些模式在某些情况下取得了显著成效,但也有不少企业反映难以推广。问题的核心在于客户的购买意愿不足,市场动力缺乏。仅仅依靠推广团队的积极裂变是不够的&#xf…...

Excel:vba实现批量修改文件名

原文件名:修改后的文件名: Sub test() 我这里只定义了一个cell,其余的我没有定义 Dim cell As Range清空 A 列中所有的内容,确保之前的数据不会影响到后续的操作 [a:a].Clear获取文件加的名字,这里的dir函数只返回一个文件名,即该文件下的第…...

【数据分享】中国历史学年鉴(1979-2001)

数据介绍 目录如下: 特稿 2000年国际历史科学大会 史学研究 史学理论 西周春秋战国史 秦汉史 魏晋南北朝史 隋唐五代史 宋史 辽西夏金史 蒙元史 明史 清史 晚清政治史 近代文化史 中外关系史 近代经济史 近代社会史 近代思想史 民国政治史 世…...

ubuntu系统启动wmplayer提示vmware unable to install all modules的处理方法

1. 终端中输入下面的命令查看vmplayer版本 vmplayer -v 2. git clone https://github.com/mkubecek/vmware-host-modules.git 3. cd vmware-host-modules 4. make 5. sudo make install...

数据库原理与应用(基于MySQL):实验六数据查询

实验6.1 对学生实验数据库(stuexpm)的学生信息表(StudentInfo)和成绩信息表(Scorelnfo)进行信息查询,编写和调试查询语句的代码,完成以下操作 (1)使用两种方式查询Studentlnfo表的所有记录 ①使用列名表。 ② 使用*. use stuexpm;select StudentID,Name,Sex,Birthday,Specia…...

【java面经thinking】二

目录 redis了解 使用原因 应用场景 数据类型 redis事务 数据持久化 RDB(快照): AOF(即时更新): 选择方式: redis快速的原因 redis单线程 单机瓶颈 经典3问 参考博客 redis了解 缓存中间件 使用原因 缓解高并发、提升高可用。…...

正规方程推导,详细版

推导正规方程(Normal Equation)通常是在线性回归的上下文中进行的。线性回归的目标是找到一个线性模型 h θ ( x ) θ T x h_\theta(x) \theta^T x hθ​(x)θTx,使得模型的预测值与实际值之间的差异(通常是均方误差&#xff0…...

【原创】java+ssm+mysql在线文件管理系统设计与实现

个人主页:程序猿小小杨 个人简介:从事开发多年,Java、Php、Python、前端开发均有涉猎 博客内容:Java项目实战、项目演示、技术分享 文末有作者名片,希望和大家一起共同进步,你只管努力,剩下的交…...

cocos Creator + fairyGUI 快速入门

版本 Creator 3.8.x,FairyGUI 2022 大部分内容来自 https://en.fairygui.com/docs/sdk/creator 1.新建cocos项目,根目录运行 npm install --save fairygui-cc 引入 fairyGUI库 2.assets目录之外新建fairyGUI项目 3.fairyGUI中编辑UI 完成后发布到Creato…...

UICollectionView 的UICollectionReusableView复用 IOS18报错问题记录

- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 方法复用报错 报错详情: Terminating app due to uncaught exception NSInternal…...

Ansible Roles与优化

Ansible Roles与优化 Ansible作为一款自动化运维工具,凭借其简洁的语法、强大的功能以及良好的扩展性,在IT运维领域得到了广泛应用。Ansible Roles作为Ansible的核心特性之一,为自动化部署和管理提供了极大的便利。本文将深入探讨Ansible Ro…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

cf2117E

原题链接&#xff1a;https://codeforces.com/contest/2117/problem/E 题目背景&#xff1a; 给定两个数组a,b&#xff0c;可以执行多次以下操作&#xff1a;选择 i (1 < i < n - 1)&#xff0c;并设置 或&#xff0c;也可以在执行上述操作前执行一次删除任意 和 。求…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代&#xff0c;数据已成为企业和社会发展的核心资产&#xff0c;而数据库作为存储、管理和处理数据的关键工具&#xff0c;在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理&#xff0c;到社交网络的用户数据存储&#xff0c;再到金融行业的交易记录处理&a…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...