윈도우 환경에서 stm32 nucleo 보드에 nuttx OS를 설치하기 위해 개발 환경을 구축하고 빌드하는 방법
stm32 nucleo 보드에 nuttx 설치하기
nucleo-l432kc 보드에 nuttx OS를 설치하기 위한 방법을 정리한 글 입니다. 필자의 환경은 윈도우 10 빌드 2004 amd64입니다.
개발 환경 구축
cygwin을 설치하고 cygwin 터미널을 실행합니다. 이때, Select Package
화면에서 다음 패키지들이 설치되는지 꼭 확인하고 설치를 진행해야합니다. (모르고 설치를 진행했을경우 설치 파일을 다시 시작해 패키지 설치만 진행할 수 있습니다.) Category에서 Devel 항목을 모두 선택하고 아래 *표시 된 항목을 검색해서 추가하면 편합니다.
make bison libmpc-devel*
gcc-core byacc automake-1.15
gcc-g++ gperf libncurses-devel*
flex gdb libmpfr-devel*
git unzip* zlib-devel*
wget libusb-1.0* libusb-1.0-devel*
이후 윈도우 호스트에서 GNU ARM gcc를 설치합니다. 설치 파일을 실행하고 PATH에 bin 폴더를 등록시킵니다. 이후 cygwin에서 arm-none-eabi-gcc -v
입력해서 올바르게 버전이 표시되면 성공입니다.
nuttx 빌드
개발환경 설정이 끝났다면 nuttx 다운로드 페이지에서 원하는 버전의 nuttx OS와 APP 압축 파일을 두 압축 파일을 임의의 같은 디렉터리안에 풀고 cygwin 쉘에서 그 경로로 들어갑니다.
somedir
├--- nuttx (앞으로 이 디렉터리는 "OS 경로"로 칭하겠습니다.)
└--- apps (앞으로 이 디렉터리는 "APP 경로"로 칭하겠습니다.)
이제 kconfig 도구를 빌드해야합니다. cygwin 환경에서 문제없이 빌드할 수 있는 3.12.0.0 버전의 소스를 받고 gperf 3.0.4 이후 버전(아마 대부분 해당됩니다.)에서 컴파일 오류가 발생하는 문제를 해결하기 위해 패치를 적용하고 빌드하고 설치합니다. 아래와 같이 입력하면 됩니다.
cd nuttx/tools
wget https://bitbucket.org/nuttx/tools/downloads/kconfig-frontends-3.12.0.0.tar.bz2
tar -xjf kconfig-frontends-3*
cd kconfig-frontends-3.12.0.0
./configure --enable-mconf --disable-nconf --disable-gconf --disable-qconf
wget https://gist.githubusercontent.com/KamilSzczygiel/d16a5d88075939578f7bd8fadd0907aa/raw/1928495cfb6a6141365d545a23d66203222d28c0/kconfig-frontends.patch
patch -p1 -i kconfig-frontends.patch
autoreconf -fi
make
make install
이제 다시 OS 경로로 빠져나와서 아래와 같은 명령어를 실행하면 nuttx가 지원하는 구성을 열거할 수 있습니다.
cd nuttx
./tools/configure.sh -L | less
저는 제 보드의 구성을 검색하기 위해 아래와 같이 입력했습니다.
./tools/configure.sh -L | grep l432kc
nucleo-l432kc:nsh
nucleo-l432kc:spwm
nsh는 nuttX shell, spwm는 정현파 PWM입니다. nsh를 선택하겠습니다. 공식홈페이지에선 nsh 구성이 일반적으로 모든 보드에서 지원되며 상호작용 가능한 명령 줄(nsh)을 지원하므로 처음 사용자용으로 권장하고 있습니다.
이제 개발환경과 원하는 구성을 설정하겠습니다. ./tools/configure.sh -h
명령을 사용하여 가능한 개발환경 매개변수를 확인할 수 있습니다. 저는 cygwin 환경에 nucleo-l432kc:nsh
구성을 사용하기 위해 아래와 같이 입력하겠습니다. 구성을 변경하려면 make distclean
을 실행하고 다시 입력하면 됩니다.
./tools/configure.sh -c nucleo-l432kc:nsh
마지막으로 빌드하기 전에, 포함된 기능과 빌드 설정등을 세부적으로 조정하고 싶다면, 아래와 같은 명령을 통해 편집할 수 있습니다.
make menuconfig
이제 설정작업은 끝났고 make -j4
명령을 실행하면 빌드는 성공입니다. 멀티코어 환경이면 -jN
플래그를 사용해주세요. 저는 4 스레드 환경이라 -j4
를 입력했습니다. 빌드 출력물은 OS 디렉터리 최상위에 nuttx.bin
, nuttx.hex
, nuttx.elf (또는 nuttx.exe)
으로 출력됩니다. 빌드 결과물을 정리(=삭제)하려면 make clean
명령을 실행하면 됩니다.
오류와 해결법
이때 아래와 같은 오류가 표시되면서 실패하면 arch/arm/Kconfig
파일의 936번 줄의 source arch/arm/src/imxrt/Kconfig
를 지워주세요. i.mx 칩셋의 kconfig 관련 오류인걸로 보이는데 저희는 stm32 칩셋이라 연관이 없으므로 그냥 날립니다.
arch/arm/src/imxrt/Kconfig:1114: syntax error
arch/arm/src/imxrt/Kconfig:1113: invalid option
make: *** [tools/Makefile.unix:484: olddefconfig] Error 1
ERROR: failed to refresh
또한 arm-none-eabi-ar.exe: libboard.a: Permission denied
오류가 발생할 경우 chmod 777 -R *
을 실행하고 윈도우 호스트에서 OS의 폴더 권한을 Everyone
사용자에게 모든 권한을 허용하고 하위 항목에도 적용되게 편집하면 됩니다.
보드에 바이너리 플래싱
일단 플래싱을 위한 도구인 openocd를 설치합시다. 직접 빌드하거나 제가 미리 빌드한 결과물을 사용하는 방법이 있습니다.
직접 빌드하기
임의의 경로에 들어가서 아래 명령을 실행해 openocd를 빌드하겠습니다. 이때 <설치 경로>
에는 <적당한 임의 경로> + /installdir/
과 같이 절대 경로를 입력하면 됩니다. (installdir 말고 install은 동일명을 가진 파일이 있어서 안될겁니다.) 예를 들어 자신의 <적당한 임의 경로>
가 /cygdrive/e/openocd
(pwd
명령으로 확인 가능)라면 <설치 경로>
는 /cygdrive/e/openocd/installdir/
입니다.
cd <적당한 임의 경로>
git clone git://git.code.sf.net/p/openocd/code openocd
cd openocd
./bootstrap
./configure --prefix=<설치 경로>
make install
이러면 <설치 경로>
에 빌드 결과물이 생성되어 있을겁니다.
미리 빌드한 결과물 사용하기
openocd 0.11.0 빌드 바이너리를 다운받아 적당한 경로에 압축을 풀면 끝입니다.
바이너리 플래시하기
이제 openocd를 쉘에서 사용하기 편하게 <OS 경로>/tools/openocd
에 폴더를 생성해주시고 <openocd 결과물>/bin/openocd.exe
파일과 <openocd 결과물>/share/openocd/scripts/
하위의 모든 항목을 <OS 경로>/tools/openocd
로 복사하고 다음과 같은 명령을 실행하면 빌드한 바이너리가 보드로 플래시됩니다.
cd tools/openocd
./openocd -f interface/stlink-v2.cfg -f target/stm32l4x.cfg -c 'init' -c 'program ../../nuttx.hex verify reset' -c 'shutdown'
이때 Error: open failed
오류는 장치가 연결되지 않았거나 인식되지 않으면 표출됩니다. nuttx.bin
파일을 플래시할수도 있으나 제 경우에서는 주소 검증 오류가 발생해서 hex 파일로 진행했습니다.
장치에 연결하기
이제 적당한 시리얼 모니터를 열고 nucleo 보드의 COM 포트를 열어줍니다. 열자마자 또는 엔터키를 한번 누르면 nsh>
가 표출되며 Nuttx shell을 사용할 수 있습니다.