포스트

임베디드 스터디 - 크로스 개발 환경

임베디드 스터디 - 크로스 개발 환경

크로스 빌드용 컴파일러

  • 소스코드는 타겟 칩셋, 운용 환경에 따라 각기 다른 컴파일러로 빌드해야한다.
  • GCC 컴파일러의 명칭은 다음과 같다
1
2
3
4
5
6
arm-none-eabi-gcc

arm       : 타겟 아키텍처 (ARM)
none      : 타겟 OS 없음 (베어메탈)
eabi      : Embedded ABI (임베디드 호출규약)
gcc       : 컴파일러
  • 이 때, none자리의 타겟 OS는 Linux, Windows와 같은 OS를 별도로 확인해야하는 타겟이 지정된다.
1
2
3
베어메탈 / RTOS (FreeRTOS 등) → arm-none-eabi-gcc
임베디드 Linux                → arm-linux-gnueabihf-gcc

크로스 개발 툴체인

  • 타겟 칩셋에 소프트웨어를 개발하기 위해 일반적으로 다음과 같은 개발 환경을 구축한다.
1
2
3
4
5
6
7
8
9
10
[개발 PC]       [JTAG 어댑터(J-Link/ST-Link)]      [타겟 보드]
GDB ─ TCP/IP(3333) ─ OpenOCD ─ TCK/TMS/TDI/TDO ─ ARM 칩

소스코드 (.c)
    ↓ arm-none-eabi-gcc (크로스 컴파일)
firmware.elf
    ↓ OpenOCD + JTAG
타겟 Flash에 플래싱
    ↓ GDB + OpenOCD
원격 디버깅

GDB (GNU Debugger)

  • GNU에서 개발한 소프트웨어 디버거 프로그램
    • 디버깅 시 타겟 아키텍처에 맞는 GDB를 써야함
    • arm-none-eabi-gcc로 빌드했으면 arm-none-eabi-gdb로 디버깅하는 식으로 툴체인이 세트로 맞춰짐
  • arm-none-eabi-gcc를 설치하면 같은 패키지에 arm-none-eabi-gdb, arm-none-eabi-objdump, arm-none-eabi-nm 등의 묶음으로 툴체인(Toolchain)이 포함됨.
  • PC와 크로스 GDB는 차이점이 있다.
    • Flash에 구운 소프트웨어는 소프트웨어 브레이크포인트가 없다.
    • 하드웨어 브레이크포인트가 제한적이다.
    • PC는 로컬 환경에서 바로 실행할 수 있지만, 크로스는 OpenOCD같은 툴을 연결해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
GDB 실행 예시
target remote :3333      # OpenOCD에 연결
load firmware.elf        # 타겟에 펌웨어 플래싱

break main               # 브레이크포인트 설정
break uart.c:42          # 특정 파일 42번째 줄에 중단점

run                      # 실행
continue                 # 다음 브레이크포인트까지 계속
next                     # 한 줄 실행 (함수 안 안들어감)
step                     # 한 줄 실행 (함수 안 들어감)

print sensor_count       # 변수 값 출력
info registers           # 레지스터 값 전체 출력
x/4xw 0x20000000         # 메모리 주소 직접 덤프

JTAG 어댑터

  • J-Link, ST-Link와 같은 하드웨어 위에 OpenOCD를 사용하여 연결한다.
    • J-Link : 범용적인 어댑터
    • ST-Link : STM 칩 사면 같이 번들로 제공, STM32 전용 어댑터
  • OpenOCD(Open On-Chip Debugger) : 디버깅 하드웨어를 제어하는 소프트웨어
    • 설정파일 교체로 간단하게 여러 하드웨어 디버거랑 호환이 가능하다
1
2
3
openocd -f interface/jlink.cfg      # J-Link 쓸 때
openocd -f interface/stlink.cfg     # ST-Link로 바꿀 때
         -f target/stm32f4x.cfg     # 타겟은 동일
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.