본문 바로가기
  • 경제적 자유를 얻는 그날까지
엔지니어링/임베디드

NuttX OS 알아보기

by 베니스상인 2023. 3. 16.

개발 환경

  • 장비: 노트북
  • OS: Ubuntu 20.04
  • 타겟보드: STM32F407
  • 에뮬레이터: SEGGER J-Link 

 

 

 

 

 

1. 개발 환경설정

 

필수 패키지 설치

sudo apt-get install automake bison build-essential flex gcc-arm-none-eabi gperf git libncurses5-dev libtool libusb-dev libusb-1.0.0-dev pkg-config -y

 

 

OpenOCD 설치

  • 설치 configure 에는 다양한 에뮬레이터를 활성화하는 옵션이 포함되어 있다. 본인은 J-link를 사용하는데 configure 실행시 아래와 같은 에러가 나면 J-link용 libjaylink-0.2 패키지를 별도로 설치해야 한다.
$ mkdir nuttxspace
$ cd nuttxspace/

$ git clone http://repo.or.cz/r/openocd.git
$ cd openocd
$ ./bootstrap

$ ./configure --enable-internal-jimtcl --enable-maintainer-mode --disable-werror --disable-shared --enable-stlink --enable-jlink --enable-rlink --enable-vslink --enable-ti-icdi --enable-remote-bitbang
checking for makeinfo... no
configure: WARNING: Info documentation will not be built.
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no

.
.
.

configure: libusb-1.0 header bug workaround: LIBUSB1_CFLAGS changed to "-isystem /usr/include/libusb-1.0"
checking for CAPSTONE... no
checking for HIDAPI... no
checking for HIDAPI... no
checking for HIDAPI... no
checking for LIBFTDI... no
checking for LIBFTDI... no
checking for LIBGPIOD... no
checking for LIBJAYLINK... no
configure: error: libjaylink-0.2 is required for the SEGGER J-Link Programmer

 

 

libjaylink 패키지는 0.1만 설치 파일이 있고 0.2는 설치가능한 패키지가 없어서 소스를 빌드하여 패키지를 설치한다.

 

 

l

 

ibjaylink-0.2 패키지 빌드 및 설치

 

아래 사이트에서 다운받을 수 있다. 버전이 다르다면 0.2.0 으로 변경하여 주소를 복사하면 된다.

 

https://gitlab.zapb.de/libjaylink/libjaylink/-/tree/0.2.0

 

Files · 0.2.0 · libjaylink / libjaylink · GitLab

GitLab Community Edition

gitlab.zapb.de

 

 

 

$ git clone https://gitlab.zapb.de/libjaylink/libjaylink.git

$ cd libjaylink/

$ ./autogen.sh

$ ./configure 
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
.
.
.


config.status: executing depfiles commands
config.status: executing libtool commands

libjaylink configuration summary:
 - Package version ................ 0.3.1
 - Library version ................ 2:0:2
 - Installation prefix ............ /usr/local
 - Building on .................... x86_64-pc-linux-gnu
 - Building for ................... x86_64-pc-linux-gnu

Enabled transports:
 - USB ............................ yes
 - TCP ............................ yes


$ make

$ sudo make install

 

 

 

패키지가 정상적으로 설치되었으면 아래와 같이 설치된 패키지를 확인할 수 있다.

swift@swift-HP-Pavilion-dv6-Notebook-PC:~/workspace/git/libjaylink$ dpkg -l | grep libjay
ii  libjaylink-dev:amd64                       0.1.0-3                                     amd64        library for interacting with J-Link programmers (development files)
ii  libjaylink0:amd64                          0.1.0-3                                     amd64        library for interacting with J-Link programmers

 

 

패키지가 정상 설치되었으면, 다시 OpenOCD configure를 수행한다. 정상적으로 설치가 완료되면 마지막 결과에서 SEGGER J-link Programmer가 'yes'로 설정되어야 한다.

$ ./configure --enable-internal-jimtcl --enable-maintainer-mode --disable-werror --disable-shared --enable-stlink --enable-jlink --enable-rlink --enable-vslink --enable-ti-icdi --enable-remote-bitbang
checking for makeinfo... makeinfo
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes

.
.
.

Created build-jim-ext from build-jim-ext.in
Created jimtcl.pc from jimtcl.pc.in


OpenOCD configuration summary
--------------------------------------------------
MPSSE mode of FTDI based devices        yes (auto)
ST-Link Programmer                      yes
TI ICDI JTAG Programmer                 yes
Keil ULINK JTAG Programmer              yes (auto)
Altera USB-Blaster II Compatible        yes (auto)
Bitbang mode of FT232R based devices    yes (auto)
Versaloon-Link JTAG Programmer          yes (auto)
TI XDS110 Debug Probe                   yes (auto)
CMSIS-DAP v2 Compliant Debugger         yes (auto)
OSBDM (JTAG only) Programmer            yes (auto)
eStick/opendous JTAG Programmer         yes (auto)
Olimex ARM-JTAG-EW Programmer           yes (auto)
Raisonance RLink JTAG Programmer        yes
USBProg JTAG Programmer                 yes (auto)
Espressif JTAG Programmer               yes (auto)
CMSIS-DAP Compliant Debugger            no
Nu-Link Programmer                      no
Cypress KitProg Programmer              no
Altera USB-Blaster Compatible           yes (auto)
ASIX Presto Adapter                     yes (auto)
OpenJTAG Adapter                        yes (auto)
Linux GPIO bitbang through libgpiod     no
SEGGER J-Link Programmer                yes
Bus Pirate                              yes (auto)
Use Capstone disassembly framework      no

 

 

 

 

 

 

 

2. Compile NuttxOS Source Code

 

NuttX 소스코드는 openocd 폴더에서 빠져나와 nuttxspace$ 폴더에서 작업한다. 만약 make 에서 아래와 같은 에러나 난다면  aclocal-1.15 가 없어서 난 에러이므로 패키지를 별도로 설치해주어야 한다.   

/nuttxspace/openocd$ cd ..
$ git clone https://bitbucket.org/patacongo/nuttx.git

$ git clone https://bitbucket.org/patacongo/apps.git

$ git clone https://bitbucket.org/nuttx/tools.git

$ cd tools/kconfig-frontends/

$ ./configure
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk

.
.
.


configure: 
configure: Configured with:
configure: - parser library     : shared (version: 4.11.0)
configure:   - root-menu prompt : Configuration
configure:   - config prefix    : CONFIG_
configure: - frontends          : kconfig conf mconf nconf
configure:   - localised        : yes
configure: - install utilities  : yes
configure: - CFLAGS CXXFLAGS    : -Wall 


$ make
/home/swift/workspace/git/nuttxspace/tools/kconfig-frontends/scripts/.autostuff/scripts/missing: line 81: aclocal-1.15: command not found
WARNING: 'aclocal-1.15' is missing on your system.
         You should only need it if you modified 'acinclude.m4' or
         'configure.ac' or m4 files included by 'configure.ac'.
         The 'aclocal' program is part of the GNU Automake package:
         <http://www.gnu.org/software/automake>
         It also requires GNU Autoconf, GNU m4 and Perl in order to run:
         <http://www.gnu.org/software/autoconf>
         <http://www.gnu.org/software/m4/>
         <http://www.perl.org/>
make: *** [Makefile:924: aclocal.m4] Error 127

 

 

이 문제는 를 실행함으로써 간단하게 해결할 수 있다. 동일한 문제에 대해서 아래 링크를 참고한다.

https://i5i5.tistory.com/1060

 

[Linux] 에러해결: aclocal-1.15: command not found

문제/에러명 ... line 81: aclocal-1.15: command not found WARNING: 'aclocal-1.15' is missing on your system. You should only need it if you modified 'acinclude.m4' or 'configure.ac' or m4 files included by 'configure.ac'. The 'aclocal' program is part

i5i5.tistory.com

 

$ autoreconf -f -i
libtoolize: putting auxiliary files in AC_CONFIG_AUX_DIR, 'scripts/.autostuff/scripts'.
libtoolize: copying file 'scripts/.autostuff/scripts/ltmain.sh'
libtoolize: putting macros in AC_CONFIG_MACRO_DIRS, 'scripts/.autostuff/m4'.
libtoolize: copying file 'scripts/.autostuff/m4/libtool.m4'
libtoolize: copying file 'scripts/.autostuff/m4/ltoptions.m4'
libtoolize: copying file 'scripts/.autostuff/m4/ltsugar.m4'
libtoolize: copying file 'scripts/.autostuff/m4/ltversion.m4'
libtoolize: copying file 'scripts/.autostuff/m4/lt~obsolete.m4'
configure.ac:36: installing 'scripts/.autostuff/scripts/compile'
configure.ac:23: installing 'scripts/.autostuff/scripts/missing'
Makefile.am: installing 'scripts/.autostuff/scripts/depcomp'

 

다시 make를 실행하면 정상적으로 make 과정이 완료된다. 

$ make
running CONFIG_SHELL=/bin/bash /bin/bash ./configure --no-create --no-recursion
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... no
checking for mawk... mawk
checking whether make sets $(MAKE)... yes


.
.
.


  CCLD     libs/parser/libkconfig-parser.la
  CCLD     frontends/conf/kconfig-conf
  CC       frontends/mconf/kconfig_mconf-mconf.o
  CC       libs/lxdialog/libkconfig_lxdialog_a-checklist.o
  CC       libs/lxdialog/libkconfig_lxdialog_a-inputbox.o
  CC       libs/lxdialog/libkconfig_lxdialog_a-menubox.o
  CC       libs/lxdialog/libkconfig_lxdialog_a-textbox.o
  CC       libs/lxdialog/libkconfig_lxdialog_a-util.o
  CC       libs/lxdialog/libkconfig_lxdialog_a-yesno.o
  AR       libs/lxdialog/libkconfig-lxdialog.a
ar: `u' modifier ignored since `D' is the default (see `U')
  CCLD     frontends/mconf/kconfig-mconf
  CC       frontends/nconf/kconfig_nconf-nconf.o
  CC       frontends/nconf/kconfig_nconf-nconf.gui.o
  CCLD     frontends/nconf/kconfig-nconf
  CC       utils/kconfig_gettext-gettext.o
  CCLD     utils/kconfig-gettext
  GEN      frontends/kconfig
  GEN      utils/kconfig-tweak

 

 

 

make가 완료되면 패키지를 설치한다.

$ sudo make install
 /bin/mkdir -p '/usr/local/lib'
 /bin/bash ./libtool   --mode=install /usr/bin/install -c   libs/parser/libkconfig-parser.la '/usr/local/lib'
libtool: install: /usr/bin/install -c libs/parser/.libs/libkconfig-parser-4.11.0.so /usr/local/lib/libkconfig-parser-4.11.0.so
libtool: install: (cd /usr/local/lib && { ln -s -f libkconfig-parser-4.11.0.so libkconfig-parser.so || { rm -f libkconfig-parser.so && ln -s libkconfig-parser-4.11.0.so libkconfig-parser.so; }; })
libtool: install: /usr/bin/install -c libs/parser/.libs/libkconfig-parser.lai /usr/local/lib/libkconfig-parser.la
libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin:/sbin" ldconfig -n /usr/local/lib
----------------------------------------------------------------------
Libraries have been installed in:
   /usr/local/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
   - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
     during execution
   - add LIBDIR to the 'LD_RUN_PATH' environment variable
     during linking
   - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
   - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.
----------------------------------------------------------------------
 /bin/mkdir -p '/usr/local/bin'
  /bin/bash ./libtool   --mode=install /usr/bin/install -c frontends/conf/kconfig-conf frontends/mconf/kconfig-mconf frontends/nconf/kconfig-nconf utils/kconfig-gettext '/usr/local/bin'
libtool: install: /usr/bin/install -c frontends/conf/.libs/kconfig-conf /usr/local/bin/kconfig-conf
libtool: install: /usr/bin/install -c frontends/mconf/.libs/kconfig-mconf /usr/local/bin/kconfig-mconf
libtool: install: /usr/bin/install -c frontends/nconf/.libs/kconfig-nconf /usr/local/bin/kconfig-nconf
libtool: install: /usr/bin/install -c utils/.libs/kconfig-gettext /usr/local/bin/kconfig-gettext
 /bin/mkdir -p '/usr/local/bin'
 /usr/bin/install -c frontends/kconfig utils/kconfig-tweak '/usr/local/bin'
 /bin/mkdir -p '/usr/local/bin'
 /usr/bin/install -c utils/kconfig-diff utils/kconfig-merge '/usr/local/bin'
 /bin/mkdir -p '/usr/local/share/doc/kconfig-frontends'
 /usr/bin/install -c -m 644 docs/kconfig-language.txt docs/kconfig.txt '/usr/local/share/doc/kconfig-frontends'
 /bin/mkdir -p '/usr/local/include/kconfig'
 /usr/bin/install -c -m 644 libs/parser/list.h libs/parser/lkc.h libs/parser/expr.h libs/parser/lkc_proto.h '/usr/local/include/kconfig'
 /bin/mkdir -p '/usr/local/lib/pkgconfig'
 /usr/bin/install -c -m 644 libs/parser/kconfig-parser.pc '/usr/local/lib/pkgconfig'

 

 

설치후 타켓보드에 해당하는 configure 를 설정한다. configure 설정시  ./configure.sh -L 옵션을 사용하면 타켓보드 리스트를 확인할 수 있다. 본인은 STM32F407ZE를 사용하므로 stm32f4discovery를 해당 보드로 설정하였다.

$ sudo ldconfig

$ cd ../..

$ cd nuttx/tools/

$ ./configure.sh stm32f4discovery:nsh
  Copy files
  Select CONFIG_HOST_LINUX=y
  Refreshing...
CP: arch/dummy/Kconfig to /home/swift/workspace/git/nuttxspace/nuttx/arch/dummy/dummy_kconfig
CP: boards/dummy/Kconfig to /home/swift/workspace/git/nuttxspace/nuttx/boards/dummy/dummy_kconfig
LN: platform/board to /home/swift/workspace/git/nuttxspace/apps/platform/dummy
LN: include/arch to arch/arm/include
LN: include/arch/board to /home/swift/workspace/git/nuttxspace/nuttx/boards/arm/stm32/stm32f4discovery/include
LN: drivers/platform to /home/swift/workspace/git/nuttxspace/nuttx/drivers/dummy
LN: include/arch/chip to /home/swift/workspace/git/nuttxspace/nuttx/arch/arm/include/stm32
LN: arch/arm/src/chip to /home/swift/workspace/git/nuttxspace/nuttx/arch/arm/src/stm32
LN: arch/arm/src/board to /home/swift/workspace/git/nuttxspace/nuttx/boards/arm/stm32/stm32f4discovery/../common
LN: arch/arm/src/board/board to /home/swift/workspace/git/nuttxspace/nuttx/boards/arm/stm32/stm32f4discovery/src
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/examples/mcuboot
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/examples
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/crypto
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/audioutils
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/gpsutils
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/logging
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/system
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/boot
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/fsutils
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/benchmarks
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/math
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/interpreters/luamodules
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/interpreters
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/testing
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/mlearning
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/graphics
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/netutils
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/sdr
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/canutils
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/wireless/ieee802154
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/wireless/bluetooth
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/wireless
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/games
mkkconfig in /home/swift/workspace/git/nuttxspace/apps/industry
mkkconfig in /home/swift/workspace/git/nuttxspace/apps
#
# configuration written to .config
#

 

 

메뉴에 들어가서 설정 변경사항이 있으면 수정한다. 

$ cd ..

$ make menuconfig

 

 

빌드하면 바이너리 파일이 생성된다.

$ make
Create version.h
LN: platform/board to /home/swift/workspace/git/nuttxspace/apps/platform/dummy
Register: hello
Register: nsh
Register: sh
CC:  chip/stm32_flash.c In file included from chip/stm32_flash.c:38:
chip/stm32f20xxf40xx_flash.c:51:4: warning: #warning "Default Flash Configuration Used - See Override Flash Size Designator" [-Wcpp]
   51 | #  warning "Default Flash Configuration Used - See Override Flash Size Designator"
      |    ^~~~~~~
CPP:  /home/swift/workspace/git/nuttxspace/nuttx/boards/arm/stm32/stm32f4discovery/scripts/ld.script-> /home/swift/workspace/git/nuttxspace/nuttx/boards/arm/stm32/stm32f4discovery/scripts/LD: nuttx
CP: nuttx.hex
CP: nuttx.bin

 

 

 

3. Flashing NuttX on Target Board

 

OpenOCD 바이너리 파일을 설치하고, J-link가 USB모듈로 인식되어 있는지 확인한다.

$ cd openocd/

$ cd contrib/

../openocd/contrib$ sudo cp 60-openocd.rules /etc/udev/rules.d/

$ sudo udevadm trigger

$ cd ../..

$ cd nuttx

$ sudo apt-get  install openocd

$ lsusb
Bus 002 Device 003: ID 8087:07da Intel Corp. 
Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 004: ID 064e:c334 Suyin Corp. 
Bus 001 Device 003: ID 138a:0018 Validity Sensors, Inc. Fingerprint scanner
Bus 001 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 009: ID 1366:0101 SEGGER J-Link PLUS
Bus 003 Device 008: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
Bus 003 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

 

 

 

OpenOCD 연결

  • J-Link 사용시에는 transport 방식을 JTAG가 아닌 SWD 방식으로 연결해야 한다.
$ openocd -f interface/jlink.cfg -c 'transport select swd' -f target/stm32f4x.cfg
Open On-Chip Debugger 0.12.0+dev-00078-gfc30feb51 (2023-03-18-21:50)
Licensed under GNU GPL v2
For bug reports, read
	http://openocd.org/doc/doxygen/bugs.html
swd
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : J-Link V9 compiled May  7 2021 16:26:12
Info : Hardware version: 9.20
Info : VTarget = 3.269 V
Info : clock speed 2000 kHz
Info : SWD DPIDR 0x2ba01477
Info : SWD DPIDR 0x2ba01477
Error: Failed to read memory and, additionally, failed to find out where
Warn : target stm32f4x.cpu examination failed
Info : starting gdb server for stm32f4x.cpu on 3333
Info : Listening on port 3333 for gdb connections

 

 

  • 터미널을 새로 열어서 telnet으로 연결한다.
  • OpenOCD 콘솔이 나타나면 명령을 수행할 수 있다. 
$ netstat -tulpn | grep openocd
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 127.0.0.1:4444          0.0.0.0:*               LISTEN      140811/openocd      
tcp        0      0 127.0.0.1:3333          0.0.0.0:*               LISTEN      140811/openocd      
tcp        0      0 127.0.0.1:6666          0.0.0.0:*               LISTEN      140811/openocd   


$ telnet localhost 4444
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Open On-Chip Debugger
>

 

 

결국, 플래시 명령 수행시 SWD로 reset 명령이 동작하지 않아, JLink의 JFlashExe를 실행하여 Program 하였다.

 

프로그래밍후 터미널에서 nsh 쉘을 확인하였다.

 

STM32F4 Discovery 타겟보드의 경우 USART2를 console로 사용하고 있기 때문에 PA2(TX)와 PA3(RX)를 각각 USB2TTL 모듈의 Rx, Tx에 교차로 연결해주었다.

 

 

 

 

 

 

 

참고문서

 

 

https://cwiki.apache.org/confluence/display/NUTTX/Porting+Guide 

 

Porting Guide - NUTTX - Apache Software Foundation

페이지 Documentation Porting Guide Brennan Ashton님이 작성, 12월 19, 2019에 최종 변경 NuttX RTOS Porting Guide Last Updated: April 7, 2020 Overview This document provides and overview of the NuttX build and configuration logic and provides hin

cwiki.apache.org

 

 

https://docs.px4.io/main/ko/hardware/porting_guide_nuttx.html

 

NuttX 보드 포팅 가이드 | PX4 오토파일럿 사용자 설명서

NuttX 보드 포팅 가이드 NuttX의 PX4를 포팅하려면, 하드웨어가 NuttX를 지원하여야 합니다. NuttX 프로젝트는 NuttX를 새로운 플랫폼으로 포팅하기 위한 포팅 가이드 (opens new window)를 제공합니다. 다음

docs.px4.io

 

 

STM32에 설치 가이드

 

https://hmchung.gitbooks.io/stm32-tutorials/content/nuttx-installation.html

 

 

 Nuttx 유투브 영상

https://www.youtube.com/@nuttxchannel/videos

 

NuttX Channel

This channel is about the NuttX RTOS

www.youtube.com

 

 

728x90

댓글