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这个版本。
安装步骤很简单,就三步:
# 第一步:下载工具链
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。
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
如果看到版本信息,说明安装成功。
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固件。
记住,环境搭建是嵌入式开发的第一步,也是最容易出问题的一步。但只要你按照这个流程走,基本不会遇到大问题。如果真遇到了,别慌,检查一下我提到的几个关键点,多半能解决。
好,今天就到这里。咱们下章见。