第一章 PX4程序编译过程解析

本文详细介绍了PX4开源项目的固件编译流程,包括Makefile和CMake的使用,以及如何针对不同硬件环境配置编译选项。

第一章 PX4程序编译过程解析

PX4是一款软硬件开源的项目,目的在于学习和研究。其中也有比较好的编程习惯,大家不妨可以学习一下国外牛人的编程习惯。这个项目是苏黎世联邦理工大学的一个实验室搞出来的。该方案是基于NUTTX系统上开发的。开发系统上面最好使用Ubuntu系统进行开发(开发效率高),程序修改和读写可以用Source Insight 。后期的文章将会陆续将软硬件进行开源和分析。

PX4的固件下载地址:https://github.com/PX4/Firmware

PX4的硬件下载地址:https://github.com/3drobotics/Pixhawk_OS_Hardware

         这一章节主要是对PX4程序代码的编译过程进行讲解。首先要说的是makefile,现在windows下面的编程很多都是基于IDE进行开发。但是很多大型工程为了追求更好的开发和维护都用到了Makefile。Makefile定义了很多的开发和编译的规则,PX4的开发还涉及到Cmake使用。Cmake也是类似于Makefile文件,只是它是一个更高一级的编译配置工具,它是一个txt格式的文件。这里我们把它看成一个子Makefile文件。

         好了我们进入到正题。首先我们进入到PX4固件文件的根目录如果是原始下载根目录在scr/Firmware下面。在该目录下有一个Makefile文件


(注意:所有的编译过程都是从需要编译的根目录下的Makefile文件开始),打开该文件我们开始进行分析。

         首先对git是否存在进判断,然后运行check_cmake.sh对cmake的相关规则进行判断(主要是对cmake的版本号进行判断)。注:每行前面带“#”就是注释而已,没有什么用。


         这里主要是对使用开发环境进行选择,这个对我们开发来说关系不大。


         进入cmake的编译规则配置,这个不用管。


进入无人机的的编译配置选项,这个比较重要。主要选择你的硬件开发环境和类型。我们主要讲解的是编译px4fmu-v2_defalt,我们编译的语句是“make px4fmu-v2_defalt”,在这里就体现了。px4fmu-v1_defalt是适用于px4的v1硬件。这个可以从开源的硬件中找到。


         此后的命令都是类似,都是选择不同的编译模式,其中清除指令是make clean,这个指令在后面也能找到的。

         找到了编译源我们就要找到编译文件,对于我们的学习来说编译指令是make px4fmu-v2_defalt。说明一下APM的固件也是一样哦,都是可以找到的,APM是经过PX4的源码修改的哦这个从他的固件中看的出的。

         px4fmu-v2_defalt这个文件在该目录下

。这个在构建整个架构的时候就包含了该文件目录。这里就进入文件的配置选项了哦。当然这个命名是

因为camke组建包含的就是nuttx_px4fmu-v2_defalt文件,注意到了没?

         首先当然是把编译的工具导进来,因为那些模块都是用cmake写的,所以导入的是cmake工具。


         接着就是一些驱动程序。到相应的目录都能找到这个cmake文件的。

这里举一个例子,比如drivers/mup6000。因为包含的关系我们很容易就可以查到这个文件在该目录下

。这个路径找到的是src/Firmware/src路径,然后引导到drivers路径,找到mup6000路径下的cmake文件。注意哦这里有个module drivers __mpu6000。这里的名字是mpu6000,这里在后面说到启动文件的时候会说到哦。这里就是要包含的c++文件,如果要编译自己的也可以写一个cmake文件或者在某个包含的cmake文件中加入自己的程序就行了,不然就不会参与编译哦,至于编写规则你随便找一个cmake文件模仿就行了,然后在这个文件中包含路径就行了。从这些cmake文件中也可以查哪些文件是参与编译的哪些是不参与编译的哦。很多人在看代码的时候总会出现有的文件是相同的然后又不知道时哪个文件参与编译的,那么从这些cmake文件中就可以知道了哦。



在这个camke文件中就有很多的模块和相应的库文件,在这里都是可以找到的哦。那么编译过程就讲到这里,注意这里只是编译过程,真正哪些模块会用到就要到下一章节的启动文件分析去了。

有什么错误欢迎提出来,大家一起修正一起学习。

### 题目重述 根据您提供的文件《山东石油化工学院proteus教程 PROTEUS、KEIL介绍及跑马灯.doc》,第五章“中断实验1”的主要内容是: - 使用AT89C51单片机设计一个发光二极管流水灯实验装置。 - 实现平时LED灯循环点亮(跑马灯效果)。 - 当外部中断0(INT0)触发时,所有LED闪烁8次,频率为某一设定值。 - 当外部中断1(INT1)触发时,所有LED也闪烁8次,但频率不同。 - 进阶要求:将外部中断1设置为高优先级。在主程序运行或外部中断0服务期间,若外部中断1发生,则能打断当前操作,执行中断1的服务程序(从下到上循环亮两次),之后继续执行未完成的中断0服务程序,最后返回主程序。 --- ### 详解 #### 一、硬件设计(Proteus电路搭建) 1. **元件选取**: - AT89C51 单片机 - 8个 LED 发光二极管(连接到P1口) - 两个按钮(分别接至 `INT0(P3.2)` 和 `INT1(P3.3)`) - 晶振(12MHz)、两个30pF电容、一个10μF电解电容、一个10kΩ上拉电阻用于复位 - 若干限流电阻(如300Ω)用于LED 2. **电路连接要点**: - P1.0 ~ P1.7 分别通过限流电阻连接LED阳极,LED阴极接地 → 共阴极接法 - 按钮一端接地,另一端接P3.2(INT0)和P3.3(INT1),并分别通过上拉电阻接VCC(保证常态为高电平) - 晶振跨接XTAL1和XTAL2,配合两个30pF电容接地 - RST引脚通过10μF电容接VCC,再串联10kΩ电阻接地构成复位电路 3. **Proteus仿真注意事项**: - 设置AT89C51的`Program File`为编译生成的`.HEX`文件 - 设置时钟频率为12MHz --- #### 二、软件设计(Keil C51 或汇编编程) 以下是满足实验要求的完整**汇编程序代码**,含详细注释: ```asm ORG 0000H AJMP MAIN ; 复位入口 ORG 0003H ; 外部中断0入口地址 AJMP INTT0 ; 跳转到中断服务程序 ORG 0013H ; 外部中断1入口地址 AJMP INTT1 ; 跳转到中断服务程序 ORG 0100H MAIN: MOV SP, #30H ; 设置堆栈指针 SETB IT0 ; 下降沿触发 INT0 SETB IT1 ; 下降沿触发 INT1 SETB EX0 ; 使能外部中断0 SETB EX1 ; 使能外部中断1 SETB PX1 ; 设置外部中断1为高优先级(PX1=1) SETB EA ; 开启总中断 MOV A, #0FEH ; 初始值:P1.0亮,其余灭 LOOP: MOV P1, A ; 输出到P1口控制LED RL A ; 左移一位实现跑马灯 LCALL DELAY ; 延时约500ms SJMP LOOP ; 循环 ;------------------------ ; 外部中断0服务程序:所有灯闪烁8次(较低频) ;------------------------ INTT0: PUSH ACC ; 保护现场(累加器A) MOV R0, #8 ; 闪烁8次 FLASH0: MOV P1, #0FFH ; 所有LED灭(共阴极,低电平亮,高电平灭) LCALL DELAY_LONG ; 较长延时 MOV P1, #00H ; 所有LED亮 LCALL DELAY_LONG DJNZ R0, FLASH0 POP ACC ; 恢复现场 RETI ; 返回中断 ;------------------------ ; 外部中断1服务程序:所有灯闪烁8次(较高频),且可抢占 ;------------------------ INTT1: PUSH ACC MOV R1, #8 FLASH1: MOV P1, #0FFH LCALL DELAY_SHORT ; 短延时 → 更快闪烁 MOV P1, #00H LCALL DELAY_SHORT DJNZ R1, FLASH1 POP ACC RETI ;------------------------ ; 延时子程序(约500ms,用于跑马灯) ;------------------------ DELAY: MOV R5, #20 D1: MOV R6, #20 D2: MOV R7, #248 DJNZ R7, $ DJNZ R6, D2 DJNZ R5, D1 RET ;------------------------ ; 长延时(用于中断0闪烁) ;------------------------ DELAY_LONG: MOV R5, #15 SJMP DELAY_COMMON ;------------------------ ; 短延时(用于中断1闪烁) ;------------------------ DELAY_SHORT: MOV R5, #5 DELAY_COMMON: MOV R6, #50 D3: MOV R7, #248 DJNZ R7, $ DJNZ R6, D3 DJNZ R5, DELAY_COMMON RET END ``` --- #### 三、关键点解析 | 功能 | 实现方式 | |------|----------| | **中断初始化** | `SETB IT0`, `SETB IT1`: 下降沿触发;`SETB EX0/EX1`: 使能中断;`SETB EA`: 总中断开启 | | **中断优先级设置** | `SETB PX1`:使INT1为高优先级,可打断低优先级中断(如INT0) | | **中断服务程序结构** | 保存`ACC` → 执行任务 → 恢复`ACC` → `RETI`(自动清除中断标志) | | **非阻塞式中断响应** | 主程序持续运行跑马灯,中断到来即响应,体现实时性 | --- #### 四、实验步骤建议 1. **在Keil中创建工程** - 新建 `.asm` 文件,粘贴上述代码 - 添加到工程,选择目标芯片为 `AT89C51` - 设置晶振为12MHz,输出 `.hex` 文件 2. **在Proteus中绘制电路图** - 按照图5-1连接电路 - 特别注意按钮接P3.2和P3.3,并加上拉电阻 3. **加载HEX文件并仿真** - 双击AT89C51 → 编辑属性 → 导入`.hex`文件 → 设置时钟12MHz - 点击运行按钮 ▶️ - 正常状态下观察跑马灯效果 - 点击按钮模拟 `INT0` 和 `INT1` 触发,观察中断行为 4. **验证优先级功能** - 在INT0中断执行过程中(正在缓慢闪烁),迅速触发INT1 - 应能看到:立即切换为快速闪烁(INT1),结束后回到INT0剩余次数,再返回主程序 --- ### 知识点(列出解答该问题需要的知识点) 1. **8051中断系统结构** 五个中断源、两级优先级、IE/IP寄存器控制,中断向量地址固定。 2. **外部中断配置方法** IT0/IT1决定触发方式(电平/边沿),EX0/EX1使能中断,PX1设优先级。 3. **中断嵌套与现场保护** 高优先级可打断低优先级;使用PUSH/POP保存寄存器防止数据冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值