[toc]
飞控PX4用的嵌入式操作系统是NuttX,为了PX4,先学习NuttX,心急吃不了热豆腐,一步一步来。
## NuttX 开发环境的搭建 ##
Nuttx开发环境的目录结构如下图:
|
+---------+--------+
| | |
nuttx/ apps/ tools/
1. 安装ubuntu,更新系统所有package。
```
sudo apt-get update
```
2. 安装ARM交叉编译工具链ARM Toolchain
```
sudo apt-get install gcc-arm-none-eabi
```
3. 安装Kconfig-frontends package
这个工具包是用来图形化配置NuttX系统的工具。安装过程挺特别,需要下载源码、编译、make和配置环境变量:
* 下载源码
```
git clone https://bitbucket.org/nuttx/tools.git
```
* 下载编译tools所需依赖包
```
sudo apt-get install gperf libncurses5-dev flex bison
```
* 编译,安装(make install需要root权限)
```
cd kconfig-frontends
./configure --enable-mconf
make
make install
```
4. 下载NuttX源码
```
git clone https://bitbucket.org/nuttx/nuttx.git
```
5. 下载NuttX之apps源码
```
git clone https://bitbucket.org/nuttx/apps.git apps
```
## 配置编译NuttX ##
下面以STM32F4 Discovery开发板为例介绍NuttX配置编译的步骤:
1. 切换至NuttX源码目录
```
cd nuttx
# 这步不产生输出,只是复制configuration至/nuttx/.config
tools/configure.sh stm32f4discovery/usbnsh
# nsh console/usb - usb终端输出,需要microUSB转USB线缆
# 或者
tools/configure.sh stm32f4discovery/nsh
# nsh console/UART,2 - UART2终端输出,需要UART-TTL转USB电缆,如FTDI
```
2. 用图形配置工具kconfig-frontends对工程配置
```
make menuconfig
```
用图形配置工具kconfig-frontends,在主界面,最主要的设置是设置编译的平台所用的操作系统
> Build Setup->Build host platform:Linux(甚至在Mac OS,这也是个很好的选择)
3. 编译工程
```
make
```
> 注意,如果在menuconfig中没有正确选择编译平台的话,会产生如下错误
> make[1]: cygpath: Command not found,这是由于选择编译平台为windows而实际用的平台为linux
编译生成文件nuttx,elf格式,可以通过SWD/JTAG电缆烧录,stm32f4discovery开发板有两个usb接口,miniUSB接至板载的ST-Link SWD/JTAG调试器。stm32f4discovery开发板可以通过任何支持USB ST-Link的主机烧录程序,microUSB连接至STM32F407之OTG-FS端口,NSH console终端仅支持linux,版本17.13不支持windows
### 问题1 ###
kconfig-mconf路径的问题:
成功编译安装kconfig-frontends工具后,会发现如下错误提示:
> kconfig-mconf: error while loading shared libraries: libkconfig-parser-3.8.0.so: cannot open shared object file: No such file or directory
make: *** [menuconfig] Error 127
针对该问题有两个解决方法:
1. 添加kconfig-frontends库所在的目录(通常是 /usr/local/lib)至文件(/etc/ld.so.conf),然后执行命令 ldconfig
2. 编译kconfig-frontends工具时,配置环境变量LD_RUN_PATH,如下:
```
./configure --enable-mconf
LD_RUN_PATH=/usr/local/lib
make
make install
```
3. 仅用静态库编译工具kconfig-frontends:
```
./configure --enable-mconf --disable-shared --enable-static
```
I have also been told that some people see this error until they re-boot, then it just goes away. I would try that before anything else.
### 问题2 ###
1. [Getting Started with NuttX -- LM3S6965-EK (Ubuntu Linux)](http://www.nuttx.org/doku.php?id=wiki:getting-started:lm3s6965-ek)
1. make编译时出现以下错误:
```
ERROR: arm-nuttx-eabi-gcc failed: 127
```
这是由于在配置时(make menuconfig)没有选择合适的工具链,该该开发板用的编译链为Generic GNU eabi ,而不是arm-nuttx-eabi-xxx。重新打开配置工具(make menuconfig),选择工具链:
> System Type -> Tool chain selection -> Generic GNU eabi tool chain under linux
>之前默认是Buildroot(Cygwin or Linux)
### 参考文档 ###
1. 善用代码仓库的文档(nuttx/Documention),在这里有对系统很详细系统的介绍,包括用户手册和开发这手册:
* 《NuttX RTOS Porting Guide》,开发手册;
* 《NuttX C Coding Standard》,编程风格;
* [《Getting Started with NuttX -- STM32F4 Discovery (Unix)》](http://www.nuttx.org/doku.php?id=wiki:getting-started:stm32f4discovery_unix)
2. 其它参考
* 博客[Linux环境下的Nuttx开发环境搭建](https://blog.csdn.net/qq_29912325/article/details/47857743);
* 博客[NuttX配置和编译](https://blog.csdn.net/liqiuhua2016/article/details/53318581);
* 百度文库[linux下建立nuttx开发环境](https://wenku.baidu.com/view/a1a38f36195f312b3069a5a5.html)