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 | 驱动层 Driver | drv或mcu | Driver.cpp(.h)McuDev(.h) |
| \Frame | 框架层 Frame | Frm或core | Frame.cpp(.h) |
| \Algorithms | 算法层 Algorithms | algo | Algorithms.cpp(.h) |
| \Application | 应用层 Application | app | App_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博客专栏:无人机飞控
https://blog.csdn.net/ss15/category_9690939.html?spm=1001.2014.3001.5482
相关资源:PH47: PH47运动控制代码框架.
https://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高校普法系统的设计
管理员账户功能包括:系统首页,个人中心,学生管理,律师管理,法律知识管理,新闻类型管理,法律新闻,律师推荐管理 律师账号功能包括:系统首页,个人中心…...
CDN加速流程分享
我们有IP,我们需要用CDN的阿里云进行加速,让网站的视频显示的更加流畅 首先,我们面对的第一个问题就是把ip解析成域名的形式,我们这里的域名是 edu.senhacore.xyz 解释一下为什么要变成域名才行,因为国内要使用cdn就必须把ip转…...
全网爆火的排队免单模式究竟是如何运作?
在私域平台的探索过程中,许多企业主尝试了链动21、推三返一等裂变模式。虽然这些模式在某些情况下取得了显著成效,但也有不少企业反映难以推广。问题的核心在于客户的购买意愿不足,市场动力缺乏。仅仅依靠推广团队的积极裂变是不够的…...
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,使得模型的预测值与实际值之间的差异(通常是均方误差࿰…...
【原创】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…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...

