第二章 开发环境概览:搭建NuttX开发环境所需的工具链、主机系统要求、整体搭建流程概览

好,咱们正式开始动手之前,先聊聊环境。说实话,很多人卡在第一步,不是代码不会写,而是环境没搭对。我见过太多人一上来就编译,结果报错一堆,心态直接崩了。所以这一章,咱们把「地基」打牢。

2.1 主机系统怎么选?Linux、Windows还是WSL?

先给结论:首选Linux,次选WSL,Windows原生不推荐

为什么?NuttX的构建系统、工具链,说白了都是基于POSIX设计的。Windows那套API跟它八字不合。我早期在Windows上折腾过,各种路径问题、换行符问题,搞得我差点放弃。后来切到Ubuntu,世界清净了。

具体建议:

  • Linux(Ubuntu 20.04/22.04):最省心,我个人的主力环境。包管理直接装工具,编译速度也快。
  • WSL2(Windows Subsystem for Linux):如果你只有Windows笔记本,那就装WSL2。性能损失很小,日常开发完全够用。我出差时就用WSL2,没出过问题。
  • Windows原生(Cygwin/MSYS2):嗯,这里要注意,不是不能用,但坑多。我曾经帮一个同事排查了三天,最后发现是Cygwin的路径映射搞鬼。新手别碰。
我的小建议: 如果你还在犹豫,直接装个Ubuntu 22.04虚拟机。VMware或VirtualBox都行,分配4核CPU、8GB内存,硬盘给40GB。这套配置跑NuttX编译绰绰有余。

2.2 工具链全家桶:你需要装哪些东西?

搭建NuttX环境,说白了就是凑齐三样东西:编译器、构建工具、源码。咱们一个一个说。

2.2.1 编译器:ARM GCC工具链

NuttX主要跑在ARM Cortex-M系列芯片上,所以你需要ARM交叉编译器。别用系统自带的gcc,那个编译出来的是x86程序,跑不到板子上。

安装命令(Ubuntu/WSL):

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

装完验证一下:

arm-none-eabi-gcc --version
# 输出类似:arm-none-eabi-gcc (GNU Arm Embedded Toolchain) 10.3-2021.10

如果你需要特定版本,可以去ARM官网下载。我个人习惯用10.3版本,稳定,没出过幺蛾子。

2.2.2 构建工具:Kconfig + Make

NuttX的配置系统基于Kconfig,跟Linux内核一样。你需要装:

  • kconfig-frontends:提供图形化配置界面(menuconfig)
  • make:构建工具
  • gperf:哈希函数生成器,编译某些组件时需要

一条命令搞定:

sudo apt install kconfig-frontends make gperf
注意: 如果你用的是Ubuntu 22.04,kconfig-frontends可能不在默认源里。需要添加一个PPA:sudo add-apt-repository ppa:ubuntu-toolchain-r/test。我当初在这卡了半小时,后来发现是源的问题。

2.2.3 其他辅助工具

还有一些小工具,虽然不是必须的,但有了能省很多事:

工具 用途 安装命令
git 下载源码、版本管理 sudo apt install git
curl/wget 下载文件 sudo apt install curl
python3 某些脚本依赖 sudo apt install python3
openocd 调试烧录 sudo apt install openocd

2.3 整体搭建流程:三步走

好,工具都齐了,咱们走一遍完整流程。你跟着做就行,别跳步。

第一步:拉取源码

NuttX的源码托管在GitHub上,分两个仓库:

  • nuttx:主仓库,包含内核、驱动、文件系统等
  • apps:应用仓库,包含shell、网络工具、示例程序等

克隆命令:

mkdir ~/nuttx_space
cd ~/nuttx_space
git clone https://github.com/apache/nuttx.git
git clone https://github.com/apache/nuttx-apps.git apps

注意:apps目录必须命名为apps,否则构建系统找不到。我有个朋友就栽在这,编译报错说找不到应用目录,折腾了半天才发现是目录名写错了。

第二步:配置工程

NuttX支持上百种开发板。咱们以STM32F4-Discovery为例:

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

这条命令会生成一个.config文件,里面包含了所有配置项。如果你想自己定制,可以运行:

make menuconfig

你会看到一个图形界面,跟Linux内核配置一模一样。在这里可以开关驱动、调整内存大小、选择文件系统等。我个人习惯先跑默认配置,能编译通过再慢慢调。

第三步:编译

配置完直接编译:

make -j$(nproc)

-j$(nproc) 表示用所有CPU核心并行编译,速度能快不少。第一次编译大概3-5分钟,取决于你的机器性能。

编译成功后,你会看到:

CP: nuttx.hex
CP: nuttx.bin

这两个文件就是最终的固件,可以直接烧录到板子上。

避坑指南: 我曾经在编译时遇到一个错误:arm-none-eabi-gcc: not found。检查了半天,发现是工具链没装对。记住,装完一定要运行 arm-none-eabi-gcc --version 验证。如果提示找不到,多半是环境变量没配好,或者装的是32位版本但系统是64位的。

2.4 验证环境:跑个Hello World

环境搭好了,咱们验证一下。把编译好的固件烧到板子上,用串口连接:

sudo screen /dev/ttyUSB0 115200

按一下复位键,你会看到NuttX的启动日志。最后出现 nsh> 提示符,说明系统跑起来了。输入:

nsh> hello

如果看到 Hello, World!,恭喜你,环境搭建成功!

嗯,到这里,开发环境就齐活了。下一章咱们开始深入NuttX的配置系统,看看那些Kconfig选项到底在干什么。别急,先把今天的内容消化掉,动手搭一遍。遇到问题很正常,我当年也是踩了无数坑才走过来的。