[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)