这一篇我们聊一下如何搭建使用PX4硬件的Nuttx的系统开发环境,这里我们脱离PX4的软件框架,单独搭建Nuttx的开发环境,使用Nuttx的make进行编译,并在Nuttx系统上编写应用程序。
搭建开发环境
前几年玩Nuttx的话搭建Nuttx的开发环境还是有点麻烦的,对新手不是很友好,这两年Nuttx加入apache开源基金会后,文档上有一些完善,提供了比较全面的入门教程,开发环境按照官方文档就没有什么问题,以下是官方文档:
https://nuttx.apache.org/docs/latest/quickstart/install.html
开发环境主要包括及部分
-
依赖库安装
-
配置工具安装
KConfig在ubuntu20上有包可以直接安装,在20版本之前的系统上需要手动编译,按照步骤来即可,当然很可能会出现编译错误,这里之前整理了遇到的问题,如果有需要可以在我的公众号回复 Nuttx配置环境 获取,太长了不在这里展开。
-
安装编译工具链
对于stm32或者其他arm-m内核的单片机的工具链和PX4中使用的是一致的,可能不需要单独安装。如果要开发其它内核的单片机,可能需要单独安装对应的工具链,比如esp32,可以参考 这一系列的上一篇文章
-
下载Nuttx源码
源码包括两部分,一部分是系统源码,另外一部分是App仓库。
App仓库是基于Nuttx的一些应用程序组件或者示例应用,这里面的程序都可以参考,去编写自己的应用程序,比如串口读写操作、socket操作、任务线程创建等等。
当然里面也有一些第三方组件的支持,比如图形UI组件 LVGL。
生成配置文件
Nuttx目前支持非常多的芯片和开发板,demo配置在nuttx/boards目录下,可以找到自己使用的开发板配置,比如常用的stm32f4开发板 nuttx/boards/arm/stm32/stm32f4discovery,在这个目录下的configs下放置了很多编译配置文件
.
├── configs
│ ├── canard
│ ├── cxxtest
│ ├── ipv6
│ ├── netnsh
│ ├── nsh
在nuttx根目录下运行./tools/configure.sh脚本
cd nuttx
./tools/configure.sh -l stm32f4discovery:nsh
该操作的目的是使用configs目录下nsh配置文件defconfig生成根目录下的.config文件,用于对系统进行配置
配置
创建了配置文件后,可以直接make,目前的系统已经由./tools/configure.sh按照stm32f4discovery/configs/nsh/defconfig文件配置完成。
当然也可以基于当前配置修复配置
cd nuttx/
make menuconfig
执行该指令后会调用上面安装的KConfig工具,进行图形化的配置,可以重新配置Nuttx使用的mcu、mcu开启的外设(串口、spi、gpio、iic、usb等)、系统组件、系统应用等等。
编译
配置完成后直接make即可完成编译,编译完成会在根目录下创建.bin的目标文件,即可进行烧录
PX4硬件的Nuttx配置
很多同学手上由PX4的飞控,也可以用于玩Nuttx的系统开发,它有丰富的外设接口和集成传感器,如果想深入学习Nuttx和飞控底层开发,基于PX4的硬件和Nuttx的系统,写一个简单的飞控程序也是学习飞控非常好的方式,自己动手写和只是看代码很多遍收获是不一样的。
使用PX4的硬件的方法简单讲分为几步,以PX4 fmu-v2版本,stm32f427单片机为例:
-
创建board目录
这里可以参考nuttx/boards/arm/stm32/stm32f4discovery,里面包括
- configs:编译配置文件,可以仅保留nsh一个配置
- src:系统底层外设的配置文件,Nuttx底层驱动调用这些文件完成外设的定制化配置,比如spi、sd卡、iic等外设的io配置,这里需要根据PX4的io定义做一些调整
- include:主要就是board.h文件,包括一些系统底层需要的宏配置
- scripts:链接脚本文件,基本不用修改直接使用即可
这里可以参考PX4/boards/px4目录下的文件,这是px4对nuttx的底层配置文件,不过不能直接移植使用,因为里面调用了很多px4的头文件和类。
-
创建.px4固件
为了将nuttx生成的bin固件通过px4的boot写入PX4硬件中,需要生成px4格式的固件,这里我们可以参考PX4项目中自带的格式转换工具
PX4/Tools/px_mkfw.py,并参考platforms/nuttx/CMakeLists.txt中调用方式:
${PYTHON_EXECUTABLE} ${PX4_SOURCE_DIR}/Tools/px_mkfw.py --prototype ${PX4_SOURCE_DIR}/boards/${PX4_BOARD_VENDOR}/${PX4_BOARD_MODEL}/firmware.prototype --git_identity ${PX4_SOURCE_DIR} --parameter_xml ${PX4_BINARY_DIR}/parameters.xml --airframe_xml ${PX4_BINARY_DIR}/airframes.xml --image ${PX4_BINARY_DIR}/${PX4_BOARD}.bin > ${fw_package}
当然这里只是一个参考,需要修改px_mkfw.py去掉一些没有的内容,比如parameters.xml和airframes.xml,是PX4需要的文件,而Nuttx项目中不包含。这里还是会有一些坑,不过怎么能难倒身为开发爱好者的同学们呢。
-
烧录固件
生成了.px4固件以后,我们就可以使用px4的固件烧写脚本,和正常的px4固件一样写入飞控了,直接调用PX4/Tools/upload.sh
好了,这就是基本的步骤了,如果对Nuttx和PX4的底层不太熟悉的话这部分还是有一定难度的,不过如果能搭建起这样一个框架,那么对这个系统也就有了不少的认识吧。如果对这部分感兴趣的同学不妨动手试试吧。
–
我的微信公众号,文章同步更新,欢迎关注。