2、开发环境搭建(上):在Ubuntu上搭建NuttX编译环境

说实话,每次带新人入门NuttX,最头疼的就是环境搭建这一步。很多人兴致勃勃地下载了源码,结果卡在工具链安装上,一卡就是一整天。我自己当年也踩过不少坑,所以这一章我打算把整个过程拆开揉碎了讲清楚。

咱们今天要做的三件事:装工具链、下载源码、装kconfig-frontends。听起来不多,但每一步都有讲究。

2.1 工具链安装:选对版本很重要

NuttX支持多种架构,ARM、RISC-V、x86都有。我以最常用的ARM Cortex-M系列为例,用的是gcc-arm-none-eabi这个工具链。

为什么选它?说白了,这是ARM官方推荐的交叉编译器,稳定可靠。我在项目里用过好几个版本,踩过不少坑,最后锁定了9-2020-q2-update这个版本。

注意:不要用apt直接装!Ubuntu源里的版本太老了,编译NuttX会报各种奇怪错误。我曾经因为这个折腾了一下午,最后发现是工具链版本问题。

安装步骤很简单,就三步:

# 第一步:下载工具链
wget https://armkeil.blob.core.windows.net/developer/Files/downloads/gnu-rm/9-2020-q2-update/gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2

# 第二步:解压到指定目录
tar -xjf gcc-arm-none-eabi-9-2020-q2-update-x86_64-linux.tar.bz2 -C ~/

# 第三步:配置环境变量
echo 'export PATH=$PATH:~/gcc-arm-none-eabi-9-2020-q2-update/bin' >> ~/.bashrc
source ~/.bashrc

装完之后验证一下:

arm-none-eabi-gcc --version

如果看到版本号输出,恭喜你,第一步搞定了。

小技巧:我个人习惯把工具链放在/opt目录下,这样多个项目都能共用。不过放在家目录也行,看个人喜好。

2.2 源码下载:用git还是压缩包?

NuttX的源码托管在GitHub上,我建议用git克隆。为什么呢?因为NuttX的版本更新很快,用git可以随时拉取最新代码,还能方便地切换分支。

但这里有个坑——NuttX的仓库结构比较特殊。它分为两个仓库:

  • nuttx:核心内核代码
  • apps:应用程序和库

这两个仓库必须放在同一级目录下。我见过有人只下载了nuttx,结果编译时找不到apps,一脸懵。

正确的下载方式:

# 创建工作目录
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目录,不是nuttx-apps。这是NuttX构建系统的硬性要求,目录名必须叫apps

重要:如果你用压缩包方式下载,解压后记得把apps目录重命名。我当年就因为这个目录名不对,编译报错找了半天原因。

2.3 kconfig-frontends:配置工具的前世今生

NuttX使用Kconfig配置系统,和Linux内核一样。但有个问题——Ubuntu源里没有现成的kconfig-frontends包,需要自己编译安装。

为什么要装这个?说白了,没有它你就没法用make menuconfig来配置NuttX。你想想看,一个嵌入式系统,不配置怎么行?

安装过程稍微有点繁琐,但跟着我来,不会出错:

# 安装依赖
sudo apt-get install gperf libncurses5-dev flex bison

# 克隆kconfig-frontends源码
git clone https://bitbucket.org/nuttx/tools.git
cd tools/kconfig-frontends

# 配置、编译、安装
./configure --prefix=/usr
make
sudo make install

装完之后验证:

kconfig-conf --version

如果看到版本信息,说明安装成功。

避坑指南:我曾经在Ubuntu 20.04上编译kconfig-frontends时,遇到flex版本不兼容的问题。解决方案是安装flex-old这个包。如果你也遇到类似问题,试试这个命令:sudo apt-get install flex-old

2.4 验证环境:跑一个简单的例子

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

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

如果编译成功,你会看到nuttx.bin文件生成。这说明你的开发环境完全OK了。

小提示:第一次编译会比较慢,因为要编译整个内核。之后如果只改配置,可以用make -j4加速,利用多核CPU。

2.5 常见问题与解决

问题 原因 解决方法
arm-none-eabi-gcc: command not found 环境变量没配置好 检查PATH是否包含工具链路径,重新source .bashrc
make: *** No rule to make target 'menuconfig' kconfig-frontends没装好 重新编译安装kconfig-frontends,检查依赖
fatal error: nshlib/nshlib.h: No such file or directory apps目录缺失或路径不对 确认apps目录和nuttx在同一级目录

嗯,到这里,NuttX的编译环境就搭建好了。下一章咱们会深入讲解如何使用menuconfig进行配置,以及如何编译出第一个可运行的NuttX固件。

记住,环境搭建是嵌入式开发的第一步,也是最容易出问题的一步。但只要你按照这个流程走,基本不会遇到大问题。如果真遇到了,别慌,检查一下我提到的几个关键点,多半能解决。

好,今天就到这里。咱们下章见。