第2章:开发环境搭建——用west工具管理NuttX源码

说实话,搭建开发环境这件事,很多新手觉得枯燥。但我得说一句:环境搭好了,后面能省80%的坑。我自己在NuttX社区混了这几年,见过太多人因为工具链版本不对、源码拉取不全,折腾一整天连个hello world都跑不起来。

这一章,我就带你一步步把环境搭好。咱们用west工具来管理源码,这是NuttX官方推荐的方式。你想想看,如果手动去git clone几十个仓库,那得多崩溃?

2.1 准备工作:你需要什么

先看看你手头有什么。我建议你准备一台Linux机器,Ubuntu 20.04或22.04都行。Windows也能搞,但说实话,我在Windows上踩过不少坑,最后还是切到WSL2了。

硬件方面,一台能联网的电脑就行。不需要多高的配置,4GB内存、20GB磁盘空间就够用。我当年用一台树莓派都编译过NuttX,虽然慢了点,但也能跑。

我的建议:如果你手头是Windows,直接用WSL2。别在原生Windows上折腾,那感觉就像穿着西装游泳——能游,但难受。

2.2 安装west工具

west是NuttX的元工具,说白了就是帮你管理多个git仓库的管家。安装它之前,你得先有Python 3.6以上版本。

检查Python版本:

python3 --version

如果版本太低,去Python官网下载新的。我个人习惯用Python 3.8或3.10,这两个版本我测试过,跟west配合得最好。

然后安装west:

pip3 install west

嗯,就这么简单。但有个坑——如果你用的是系统自带的pip,可能会遇到权限问题。我建议加个--user参数:

pip3 install --user west

安装完后,验证一下:

west --version

如果看到版本号,恭喜你,第一步走通了。

小技巧:如果你在Linux上遇到"command not found",多半是~/.local/bin没加到PATH里。执行 export PATH=$PATH:~/.local/bin 就能解决。我建议你把这个加到.bashrc里,一劳永逸。

2.3 拉取NuttX源码

有了west,拉源码就简单了。找个你喜欢的目录,比如~/nuttx

mkdir ~/nuttx
cd ~/nuttx
west init
west update

west init会创建一个manifest文件,里面记录了NuttX所有组件的版本信息。west update则根据这个manifest,把几十个仓库全部拉下来。

这个过程取决于你的网速。我拉过一次,大概5分钟。如果你在墙内,可能会慢一些。我曾经帮一个朋友远程调试,他拉了半小时还没完,最后发现是公司网络限制了git协议。换成https就好了。

拉完之后,看看目录结构:

nuttx/
├── nuttx/          # 主仓库,包含内核和大部分驱动
├── apps/           # 应用仓库,包含各种示例和工具
└── ...             # 其他组件

你主要关注nuttx/apps/这两个目录。前者是操作系统本身,后者是用户态程序。

注意:千万不要手动修改manifest文件里的版本号,除非你知道自己在做什么。我见过有人把版本号改错了,结果编译出一堆莫名其妙的错误,排查了两天才发现是版本不匹配。

2.4 配置工具链

源码拉下来了,但还不能编译。你得先装交叉编译工具链。NuttX支持几十种架构,咱们先拿ARM来举例。

安装ARM工具链:

sudo apt-get install gcc-arm-none-eabi binutils-arm-none-eabi

如果你用的是其他架构,比如RISC-V:

sudo apt-get install gcc-riscv64-unknown-elf

装完后,检查一下:

arm-none-eabi-gcc --version

看到版本信息就对了。我建议用10.3或11.2版本,这两个版本我测试过,跟NuttX最新代码兼容性最好。

还有个东西别忘了——Kconfig前端。NuttX用Kconfig来配置内核,你需要装个kconfig-frontends

sudo apt-get install kconfig-frontends

如果apt里没有,可以从源码编译。不过说实话,我建议直接用menuconfig的Python版本,省事:

pip3 install kconfiglib

2.5 验证环境:编译一个示例

环境搭好了,咱们跑个例子验证一下。以STM32F4Discovery开发板为例:

cd ~/nuttx/nuttx
./tools/configure.sh stm32f4discovery:nsh
make

第一条命令会生成配置文件,第二条开始编译。第一次编译会慢一些,因为要编译整个内核。我当年第一次编译等了大概3分钟,喝杯咖啡的功夫。

如果一切顺利,你会看到nuttx.binnuttx.elf两个文件。这就是编译好的固件。

常见错误:如果编译时报错"arm-none-eabi-gcc: command not found",说明工具链没装好。检查一下PATH,或者重新安装。我曾经犯过一个低级错误——装完工具链忘了重启终端,结果折腾了半小时才发现。

2.6 Windows环境特别说明

我知道有些同学用Windows。嗯,我理解,毕竟不是所有人都能切到Linux。但我要说一句:在Windows上搞嵌入式开发,真的不如Linux顺手。

如果你坚持用Windows,我推荐两种方式:

  • WSL2(推荐):在Windows里装个Ubuntu子系统,然后完全按照Linux的步骤来。我试过,性能损失很小,而且能直接用Linux工具链。
  • MSYS2:如果你不想用WSL,可以用MSYS2模拟Linux环境。但说实话,我试过一次就放弃了——包管理太麻烦,而且有些工具链装不上。

我个人强烈建议用WSL2。你想想看,在Windows上跑Linux,既能用Windows的日常软件,又能用Linux的开发工具,两全其美。

WSL2安装小贴士:以管理员身份打开PowerShell,执行 wsl --install,然后重启。之后去Microsoft Store装个Ubuntu 22.04。整个过程不到10分钟。

2.7 避坑指南

最后,我总结几个常见问题,都是我在社区里帮人排查时遇到的:

  • 网络问题:如果west update卡住,试试挂代理,或者换成国内镜像。我记得有个同学在深圳,用github直连死活拉不下来,换了gitee镜像后秒搞定。
  • Python版本:west要求Python 3.6+。如果你系统默认的是Python 2,记得用python3pip3
  • 磁盘空间:NuttX完整源码大概1.5GB,编译后还会生成一些中间文件。确保你有至少5GB空闲空间。
  • 权限问题:不要在/root/opt下搞开发,否则你会被权限问题折磨死。老老实实用用户目录。

好了,环境搭建就到这里。下一章咱们开始写第一个NuttX程序,到时候你就知道今天搭的环境有多重要了。