为什么要做这篇文章?
nuttx作为px4,小米vela等厂商使用的 rtos它具备许多优点,尤其吸引我这样的“发烧人员”的一点是他支持各种类型的嵌入式设备,并且有大量的常用驱动。这就意味着我的一套代码基本上不怎么修改就可以直接部署在不同的设备上面,但是呢他的资料实在是太少了,所以我在此记录我的学习历程,并且希望帮助那些希望学习nuttx的人们快速入门。
下面开始正文叙述
一、环境配置:(我这边使用的是ubuntu20.04)
1.使用git拉取对应的代码和工具包,我这边是直接使用的官方教程里面的文件夹路径。
mkdir nuttxspace
cd nuttxspace
git clone https://github.com/apache/nuttx.git nuttx
git clone https://github.com/apache/nuttx-apps apps
2.对环境进行配置,这些很简单就是把官网上要求的工具装一遍
sudo apt install bison flex gettext texinfo libncurses5-dev libncursesw5-dev xxd git gperf automake libtool pkg-config build-essential gperf genromfs libgmp-dev libmpc-dev libmpfr-dev libisl-dev binutils-dev libelf-dev libexpat1-dev gcc-multilib g++-multilib picocom u-boot-tools util-linux
3.安装Kconfig工具这个主要是用来对项目进行配置的,所以需要图形化配置Kconfig的支持,了解Linux开发的人应该对这个工具很熟悉
sudo apt install kconfig-frontends
我这边同时也安装了python版本的Kconfig库,无所谓可装可不装
sudo apt install python3-kconfiglib
4.安装openocd这个很重要主要是在Linux上面烧录,当然如果你用的VMware之类的虚拟机的话也可以选择用虚拟机编译然后在windows主机上用烧录软件烧录
你可以使用sudo直接安装,也可以编译安装,我这边都贴出来了(这边使用的就是韦东山文章里的步骤NUTTX移植到STM32 - 韦东山嵌入式开发者社区 (100ask.net))
sudo apt install openocd
还可以直接在网上下载压缩包,传到Ubuntu解压即可,跟据提示进行相应操作:
官网下载:OpenOCD - Open On-Chip Debugger download | SourceForge.net
解压后进入目录中,并且在终端打开:
tar -jxvf openocd-0.12.0.zip
cd openocd-0.12.0
./configure --enable-stlink
之后可以使用./configure实现这个配置。
出现问题:configure: error: libusb-1.x is required for the ST-Link Programme:
sudo apt-get install libusb-1.0.0-dev
之后我们可以执行以下命令,去掉一些无用的报错警告:
./configure --disable--werror
设置完以后进行软件安装:
sudo make install
安装好OpenOCD后,我们需要根据操作系统,设置访问debug适配器的权限。在Linux系统上,通常会涉及etc/udev/rules.d文件夹的操作。OpenOCD会附带一个通用规则文件60-openocd.rules,位置在于OpenOCD解压后的文件夹contrib目录中。这个时候我们需要把我们的60-openocd.rules拷贝过去。(下面的步骤如果不做的话,在每次烧录的时候在命令行前边加上sudo给足权限也可以,可能调试的时候稍微麻烦一点)
sudo cp 60-openocd.rules /etc/udev/rules.d/
5.安装交叉编译链
sudo apt install gcc-arm-none-eabi binutils-arm-none-eabi
6.安装minicom 在nuttx官网上面使用的好像是picocom,无所谓都可以,我习惯用minicom所以就安装了minicom
sudo apt-get install minicom
二、STM32g4的测试
1、将nuttx代码调到跟自己的板子类似的
cd nuttxspace/nuttx
./tools/configure.sh nucleo-g431rb:nsh
2、打开menuconfig(可以不开,因为跑的例程)
make menuconfig
3.查看具体硬件配置
我这边查看了一下他开启了哪些个串口(串口2)
位置在System Type ─>STM32 Peripheral Support下面
下面这个是选择作为中断输出的串口,位置在Device Drivers → Serial Driver Support
引脚位置可以查看代码文件nuttxspace/nuttx/boards/arm/stm32/nucleo-g431kb/include/broad.h文件和/nuttxspace/nuttx/arch/arm/src/stm32/hardware/stm32g4xxr_pinmap.h文件
所以在烧录之后需要将串口模块连接到
串口模块 TX---->PA3
RX---->PA2
4.对代码进行编译烧录同时打开minicom
终端一
cd /nuttxspace/nuttx
make
openocd -f interface/stlink.cfg -f target/stm32f1x.cfg -c init -c "reset halt" -c "program nuttx.bin exit 0x08000000
终端二(我使用的是stlink自带串口并非ch340系列所以是虚拟串口ttyACM0)
sudo minicom -D /dev/ttyACM0
5.按下复位之后就会在串口终端出现NUTTX的nsh
Welcome to minicom 2.7.1
OPTIONS: I18n
Compiled on Dec 23 2019, 02:06:26.
Port /dev/ttyACM0, 06:08:56
Press CTRL-A Z for help on special keys
NuttShell (NSH)
nsh>
NuttShell (NSH)
nsh>
6.简单测试,一切正常
nsh> ?
help usage: help [-v] [<cmd>]
. cd exit mkrd sleep unset
[ cp expr mount source uptime
? cmp false mv test usleep
alias dirname help printf time watch
unalias dd hexdump pwd true xd
basename dmesg kill rm truncate
break echo ls rmdir uname
cat exec mkdir set umount
Builtin Apps:
ostest sh nsh
nsh> echo "helloworld
nsh: ": no matching "
nsh> echo "Hello Nuttx"