PX4FMU和PX4IO最底层启动过程分析(上)

PX4FMU和PX4IO最底层启动过程分析(上)

主处理器和协处理器的固件烧写和运行过程

在这里插入图片描述

PX4FMU:各种传感器数据读取、姿态解算、PWM控制量的计算、与PX4IO通信。负责飞控最主要的工作。
PX4IO(STM32F103):为PIXHAWK中专用于处理输入输出的部分,输入为支持的各类遥控器(PPM,SPKT/DSM,SBUS),输出为电调的PWM驱动信号,它与PX4FMU(STM32F427)通过串口进行通信。

在这里插入图片描述

两个处理器固件烧写流程如下:
在这里插入图片描述

主处理器和协处理器,固件下载到固件运行的流程图。值得说明的一点是分别给两个处理器下载blootloader以后,主处理器等待下载飞控固件,用地面站通过USB向飞控固件下载完以后,主处理器的飞控固件启动,这时候通过串口给协处理器下载固件(固件只是下载一次)。这个工作完成之后,主处理器和协处理器同时开始工作。

详细的这段代码在px4io.cpp中,随着px4io.cpp进程启动而启动。功能就是由主处理器向协处理器烧写代码。

其中协处理器的固件源代码在:E:\Firmware-master\Firmware\src\modules\px4iofirmware这里面主要是是一些,IO口的操作和安全开关的操作。他会在编译飞控固件的时候,一起被编译成为px4io-v2.bin,放在NUTTX文件系统中,在主处理器运行的时候把这个固件烧写进入协处理器。具体的烧写到单片机的FLASH哪个位置可以在px4io.cpp相关代码找到。

在软件层面的详细流程图如下:
在这里插入图片描述

BootLoader和NUTTX启动详解

在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从而将系统的软硬件环境带到一个合适状态,以便为最终调用操作系统内核准备好正确的环境。在嵌入式系统中,通常并没有像BIOS那样的固件程序(注,有的嵌入式CPU也会内嵌一段短小的启动程序),因此整个系统的加载启动任务就完全由BootLoader来完成。Bootloader是嵌入式系统在加电后执行的第一段代码,在它完成CPU和相关硬件的初始化之后,再将操作系统映像或固化的嵌入式应用程序装在到内存中然后跳转到操作系统所在的空间,启动操作系统运行。

进入px4/Bootloader可以看到main_f1.c、main_f4.c,分别对应着PX4IO、PX4FMU的Bootloader。值得注意的是单片机的二进制代码在单片机的启动位置。

STM32芯片CortexM3的内核有三种启动方式,其分别是:
A. 通过boot引脚设置可以将中断向量表定位于SRAM区,即起始地址为0x2000000,同时复位后PC指针位于0x2000000处;
B. 通过boot引脚设置可以将中断向量表定位于FLASH区,即起始地址为0x8000000,同时复位后PC指针位于0x8000000处;
C. 通过boot引脚设置可以将中断向量表定位于内置Bootloader区。

M3单片机复位后,从0x00000000取栈指针(SP),从0x00000004取复位向量(PC),有了栈指针和复位向量后,单片机就按照正常流程运行了,单片机启动默认先运行BootLoader,所以默认的中断向量表位置是BootLoader的中断向量表。我们知道Bootloader是上电执行的第一个代码,Pixhawk的启动是通过B的方式来启动的,所以我们在下Bootloader的时候也是向FLASH这0x8000000地址烧写的固件(具体可以看固件烧写这篇文章),Bootloader烧写成功以后每次上电就会启动,启动的起始地址就是FLASH的0x8000000。Bootloader启动执行到最后,会用汇编语句,自动跳转到FLASH中固件下载的位置,开始执行固件代码。

NUTTX启动(也就是上面的固件代码,汇编语句就是跳转到这个位置来执行stm32_start.c):
代码位置:Firmware/build_px4fmu-v2_default/px4fmu-v2/Nuttx/nuttx/arch/arm/src/stm32/stm32_start.c

__start负责STM32芯片的底层初始化,包括时钟,FPU,GPIO等单元的初始化。
os_start负责OS的底层初始化,包括各种队列和进程结构的初始化。
os_bringup负责OS基本进程的启动以及用户进程的启动,用户启动入口由(CONFIG_USER_ENTRYPOINT)宏进行指定是执行nsh_main还是user_start。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2809264.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

java spring 01 IOC源码

01.spring 中的基础是IOC 中有一个方法 例子:

《最新出炉》系列初窥篇-Python+Playwright自动化测试-26-处理单选和多选按钮-下篇

1.简介 今天这一篇宏哥主要是讲解一下,如何使用Playwright来遍历单选和多选按钮。大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选和多选按钮进行实战。 2.demo准备 2.1demo页面的H…

【MySQL面试复习】什么是聚簇索引(聚集索引)和非聚簇索引(二级索引)/什么是回表?

系列文章目录 在MySQL中,如何定位慢查询? 发现了某个SQL语句执行很慢,如何进行分析? 了解过索引吗?(索引的底层原理)/B 树和B树的区别是什么? 系列文章目录什么是聚簇索引(聚集索引&#xff09…

【GameFramework框架内置模块】3、数据表(Data Table)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录: https://blog.csdn.net/q7…

pytest钩子函数-pytest_runtest_logreport提取测试用例相关信息

问题:想在每个日志中记录测试用例开始结束时间,获取到测试用例的名称。 解决办法:使用钩子pytest_runtest_logreport 在pytest中,想要在conftest.py文件中获取正在运行的测试用例的名称,可以使用pytest_runtest_logre…

蓝桥杯-修建灌木

思考&#xff1a;整个过程很巧妙&#xff0c; 解答&#xff1a; #include <iostream> using namespace std; int main() { int n; cin>>n; for(int i1;i<n;i) { cout << max(n - i,i - 1) * 2<<endl; } return 0…

WPF 【十月的寒流】学习笔记(1):DataGrid过滤

文章目录 相关链接代码仓库前言环境DataGrid 数据筛选项目配置使用原理主要代码&#xff08;详细代码可以看我的GitHub仓库&#xff09;Models.PersonDataGirdViewDataGridViewModel 实现效果 总结 相关链接 十月的寒流 在 WPF 中制作 DataGrid 的数据筛选功能 WPF 中如何制作 …

C++ 游戏飞机大战, 字符型的

//#define _CRT_SECURE_NO_WARNINGS 1 用于禁止不安全函数的警告 #include<iostream> #include<stdlib.h> #include<string> #include<conio.h> #include<Windows.h> #include<time.h> #include <graphics.h> using namespace std;…

SSRF靶场实战

SSRF&#xff08;curl&#xff09; SSRF&#xff08;file_get_content&#xff09;

爬虫入门五(Scrapy架构流程介绍、Scrapy目录结构、Scrapy爬取和解析、Settings相关配置、持久化方案)

文章目录 一、Scrapy架构流程介绍二、Scrapy目录结构三、Scrapy爬取和解析Scrapy的一些命令css解析xpath解析 四、Settings相关配置提高爬取效率基础配置增加爬虫的爬取效率 五、持久化方案 一、Scrapy架构流程介绍 Scrapy一个开源和协作的框架&#xff0c;其最初是为了页面抓取…

高频面试题整理(一)

文章目录 平台无关性如何实现&#xff1f;JVM如何加载 .class文件&#xff1f;什么是反射?谈谈ClassLoader谈谈类的双亲委派机制类的加载方式Java的内存模型?JVM内存模型-jdk8程序计数器&#xff1a;Java虚拟机栈局部变量表和操作数栈&#xff1a; Java内存模型中堆和栈的区别…

✅鉴权—cookie、session、token、jwt、单点登录

基于 HTTP 的前端鉴权背景cookie 为什么是最方便的存储方案&#xff0c;有哪些操作 cookie 的方式session 方案是如何实现的&#xff0c;存在哪些问题token 是如何实现的&#xff0c;如何进行编码和防篡改&#xff1f;jwt 是做什么的&#xff1f;refresh token 的实现和意义ses…

groovy:XmlParser 读 Freeplane.mm文件,生成测试案例.csv文件

Freeplane 是一款基于 Java 的开源软件&#xff0c;继承 Freemind 的思维导图工具软件&#xff0c;它扩展了知识管理功能&#xff0c;在 Freemind 上增加了一些额外的功能&#xff0c;比如数学公式、节点属性面板等。 强大的节点功能&#xff0c;不仅仅节点的种类很多&#xff…

首届Supernova国际青少年模特艺术大赛

2024 全国海选北京站&#xff0c;于 2 月 21 日圆满成功。 # 中国首席超模 # 伍倩 # 超模 # 演员 # 那广子 身着明星挚爱高定礼服 EvaLendel 惊艳亮相。总决赛重磅起航&#xff01;报名从速&#xff01; 整场海选比赛全国进行角逐&#xff0c;有北京、深圳、重庆、新疆、安徽…

高温应用中GaN HEMT大信号建模的ASM-HEMT

来源&#xff1a;An ASM-HEMT for Large-Signal Modeling of GaN HEMTs in High-Temperature Applications&#xff08;JEDS 23年&#xff09; 摘要 本文报道了一种用于模拟高温环境下氮化镓高电子迁移率晶体管&#xff08;GaN HEMT&#xff09;的温度依赖性ASM-HEMT模型。我…

【管理咨询宝藏资料25】某能源集团五年发展战略报告

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏资料25】某能源集团五年发展战略报告 【关键词】战略规划、五年战略、管理咨询 【文件核心观点】 - LL应以快速做大做强为目标&#xff0c;专注…

信息系统项目管理师论文分享(质量管理)

水一篇文章。我发现身边考高项的朋友很多都是论文没过&#xff0c;我想着那就把我的论文分享出来&#xff0c;希望能有帮助。 质量管理 摘要 2020年5月&#xff0c;我作为项目经理参加了“某市某医联体的互联网诊疗&#xff08;互联网医院和远程医疗&#xff09;平台”的建设…

数据结构之栈的链表实现

数据结构之栈的链表实现 代码&#xff1a; #include<stdio.h> #include<stdbool.h> #include<stdlib.h> //链表节点定义 typedef struct node {int value;struct node* next; }Node; //入栈操作 bool push(Node** head, int val) {if (*head NULL){*head …

HTTP攻击,该怎么防护

一般网络世界里为人们所熟知的DDoS攻击&#xff0c;多数是通过对带宽或网络计算资源的持续、大量消耗&#xff0c;最终导致目标网络与业务的瘫痪&#xff1b;这类DDOS攻击&#xff0c;工作在OSI模型的网络层与传输层&#xff0c;利用协议特点构造恶意的请求载荷来达成目标资源耗…

.NET Core使用NPOI导出复杂,美观的Excel详解

前言&#xff1a; 这段时间一直专注于数据报表的开发&#xff0c;当然涉及到相关报表的开发数据导出肯定是一个不可避免的问题啦。客户要求要导出优雅&#xff0c;美观的Excel文档格式的来展示数据&#xff0c;当时的第一想法就是使用NPOI开源库来做数据导出Excel文档&#xf…