2016년 8월 9일 화요일

mbed CLI로 프로그램 컴파일하기 (Compile code using mbed CLI)

mbed OS 5가 나오면서 스레드 지원이 native로 되어 main()  스레드에 진입하기 전에 RTOS가 먼저 초기화 되게 되었다. 또한 CLI 툴을 지원해 이제 온라인 컴파일러 없이 command line에서 빌드가 가능해졌다.

임베디드 보드에서의 hello world인 LED blink를 CLI를 통해 빌드하는걸 보도록 하겠다.

코드는 다음과 같다.


#include "mbed.h"
#include "rtos.h"

DigitalOut led1(LED1);

// main() runs in its own thread in the OS
// (note the calls to Thread::wait below for delays)
int main() {
    while (true) {
        led1 = !led1;
        Thread::wait(500);
    }
}


mbed CLI 와 툴체인 설치하기

 
mbed CLI는 오프라인 툴이기 때문에 작업을 시작하기 전에 먼저 설치해 줘야만 한다. 또한 툴체인도 설치해 줘야 한다. 
mbed CLI는 맥, 윈도우, 리눅스에서 모두 사용할 수 있다. CLI를  설치하기 위해서는 몇가지 먼저 설치해 줘야 하는 프로그램들이 있다.
Requirements

* Python - mbed CLI는 파이선 스크립트이기 때문에 파이선이 설치되어 있어야만 한다. mbed CLI는 파이선 버젼 2.7에서 테스트 되었다.
* Git and Mercurial - mbed CLI는 Git과 Mercurial을 모두 지원한다. 그러므로 둘 다 설치할 필요가 있다.
* 컴파일러와 툴체인 - 컴파일러를 포함한 툴체인을 설치해 줘야 한다. mbed OS 5는 GCC ARM toolchain, ARM Compiler 5, IAR 컴파일러를 모두 지원한다. 이 세가지 중에 하나를 골라 설치해 주면 된다.

Installing mbed CLI


mbed CLI는 pip를 사용해 설치할 수 있다. 
 
$ pip install mbed-cli

Creating and importing programs


mbed CLI는 프로그램을 만들거나 mbed OS 2 또는 mbed OS 5 기반의 프로그램을 import 할 수 있다.

Creating a new program for mbed OS 5

새 프로그램을 만들 때 mbed CLI 는 자동으로 최신 mbed OS 릴리즈를 import 한다. 각 릴리즈는 code, build tool, desktop IDE project generator 같은 모든 컴포넌트를 포함한다.

이제 'mbed-os-program' 이라는 새 프로그램을 만들어 보겠다. 

$ mbed new mbed-os-program
[mbed] Creating new program "mbed-os-program" (git)
[mbed] Adding library "mbed-os" from "https://github.com/ARMmbed/mbed-os" at latest revision in the current branch
[mbed] Updating reference "mbed-os" -> "https://github.com/ARMmbed/mbed-os/#89962277c20729504d1d6c95250fbd36ea5f4a2d"
 

'mbed-os-program'이라는 새 폴더를 만들어 새 repository를 초기화하고 최신 리비젼의 mbed-os dependency를 프로그램 트리에 import한다.

mbed ls 명령으로 프로그램에 import된 모든 라이브러리를 볼 수 있다.
 

$ cd mbed-os-program$ mbed ls -a
mbed-os-program (mbed-os-program)
`- mbed-os (https://github.com/ARMmbed/mbed-os#9962277c207)

Adding libraries


코드를 작성하는 동안 어플리케이션에 다른 라이브러리를 추가할 필요가 있을수 있다. mbed add 명령으로 라이브러리를 추가할 수 있다.  

$ mbed add https://developer.mbed.org/users/wim/code/TextLCD/

URL#hash 포맷으로 라이브러리의 특정 리비젼을 추가할 수 있다. 
 
$ mbed add https://developer.mbed.org/users/wim/code/TextLCD/#e5a0dcb43ecc 
 

Specifying a destination directory


라이브러리를 특정 디렉토리에 추가하고 싶으면 add 명령 뒤쪽에 디렉토리 이름을 추가 파라미터로 넘겨줄 수 있다.  

$ mbed add https://developer.mbed.org/users/wim/code/TextLCD/ text-lcd

mbed CLI에서 이 기능을 지원하기는 하지만 가능하면 쓰지 않기를 권장한다. 소스 리포지토리와 다른 이름의 디렉토리에 라이브러리를 추가하는건 혼란을 불러 일으킬 수 있다.
 

Compiling code


먼저 mbed CLI에 컴파일러와 툴체인의 위치를 알려줘야 한다. 여기서는 GCC ARM 을 사용하겠다. 
 
$ mbed config --global GCC_ARM_PATH /usr/local/gcc-arm-none-eabi/bin
 
위에서 빨간색 부분은 자신의 환경에 맞게 바꿔줘야 한다. arm-none-eabi-gcc 실행파일이 들어있는 디렉토리 이름을 써 주면 된다.
이 명령은 최초에 한번만 해 주면 된다.

mbed config --list 명령으로 현재 설정된 내용을 확인해 볼 수 있다.
 
$ mbed config --list
[mbed] Global config:
No global configuration is set

[mbed] Local config (/Users/****/tmp/mbed/mbed-os-program):
GCC_ARM_PATH=/usr/local/gcc-arm-none-eabi/bin
TOOLCHAIN=GCC_ARM
TARGET=K64F
$
  
 

Compiling your program


이제 mbed compile 명령으로 코드를 컴파일 할 수 있다.

물론 위에서 mbed new 명령으로 프로그램 폴더가 만들어 졌지만 아직 자신의 코드는 하나도 들어있지 않다. 그러므로 mbed-os-program 디렉토리에 main.cpp 파일을 만들어 맨 위쪽의 코드를 넣고 저장해 준다.
그리고 난 후 mbed compile 명령을 내리면 빌드가 끝나 보드에 넣어줄 수 있는 .bin 파일이 생성된다.
   

$ vi main.cpp

프로그램 코드를 입력한 후 저장하고 종료

$ mbed compile -t GCC_ARM -m K64F
Building project mbed-os-pgm (K64F, GCC_ARM)
Scan: .
Scan: FEATURE_BLE
...
Link: mbed-os-program

Elf2Bin: mbed-os-program

 +---------------------+-------+-------+------+
| Module              | .text | .data | .bss |
+---------------------+-------+-------+------+
| Fill                |   164 |     4 | 2313 |
| Misc                | 37733 |  2224 |  120 |
| features/frameworks |  3288 |    52 |  328 |
| hal/common          |  2435 |     4 |  269 |
| hal/targets         | 12108 |    12 |  200 |
| rtos/rtos           |    22 |     4 |    0 |
| rtos/rtx            |  5713 |    20 | 2682 |
| Subtotals           | 61463 |  2320 | 5912 |
+---------------------+-------+-------+------+
Allocated Heap: 65536 bytes
Allocated Stack: 32768 bytes
Total Static RAM memory (data + bss): 8232 bytes
Total RAM memory (data + bss + heap + stack): 106536 bytes
Total Flash memory (text + data + misc): 64823 bytes
Image: ./.build/K64F/GCC_ARM/mbed-os-program.bin

$
 
위의 명령에서 -m 옵션은 타겟 시스템을 지정하는 것이고 -t 옵션은 컴파일러와 툴체인을 지정하는 것인데 여기서는 GCC ARM을 사용하기 때문에 GCC_ARM 을 써 줬다.  

$ cd .build/K64F/GCC_ARM/
$ ls
total 2840
  16 main.d       128 mbed-os-program.bin*      8 mbed-os-program_map.csv    16 test_env.d
   8 main.o      400 mbed-os-program.elf*      8 mbed-os-program_map.json   16 test_env.o
   0 mbed-os/     2232 mbed-os-program.map       8 mbed_config.h
$
 
위에서 볼 수 있는것처럼 컴파일 된 바이너리와 elf image등은 .build 디렉토리 아래에 들어있다. 즉 저기서 mbed-os-program.bin 파일을 보드에 넣어주면 되는 것이다.

댓글 없음:

댓글 쓰기