[에이콘][요약] 임베디드 시스템 아키텍처 사물인터넷을 위한 임베디드 시스템의 기초 Chapter 2 - 작업환경과 워크플로 최적화

Embedded June·2021년 8월 8일
0

Chapter 2. 작업환경과 워크플로 최적화

이번 chapter에서는 특정 타겟을 위한 펌웨어 이미지를 생성하는 툴체인(toolchain)에 대해 배운다.

2.1. Compiler

  • C 컴파일러는 GNU/리눅스 배포판의 GCC가 대표적이며 .c 소스코드를 .o 오브젝트 파일로 만든다.
    • 컴파일을 수행한 host와 타겟 디바이스의 아키텍처가 동일하면 그냥 ‘컴파일러’
    • 컴파일을 수행한 host와 타겟 디바이스의 아키텍처가 다르면 ‘크로스 컴파일러’라고 부른다.
  • 프로그램에는 여러 모듈이 필요하고, 이 모듈 하나하나가 오브젝트 파일로 구성된다.

2.2. Linker

  • 링커는 오브젝트 파일들의 집합인 모듈들의 심볼 의존성을 모두 처리해 실행파일로 만드는 역할을 한다.

  • 결과물인 .elf 실행파일은 프로그램 코드와 데이터를 포함하는 등 다양한 section으로 구성된다.

    • .text section: 프로그램 코드를 포함하며 읽기 전용이다.
    • .rodata section: 런타임에 수정되지 않는 const 상수를 저장하기 위한 읽기 전용 공간이다.
    • .data section: 초기화 된 변수static같은 전역 변수들이 저장되는 공간이다. 읽기/쓰기 가능하다.
    • .bss section: 초기화 되지 않은 변수들이 저장되는 공간이다. 읽기/쓰기 가능하다. 프로그램의 초기화 코드는 main() 함수 실행 이전에 이 영역의 변수들이 모두 0으로 초기화되는 것을 보장해야 한다.
  • 링커 스크립트는 타겟의 메모리 섹션을 서술한 파일이다. 여기에는 프로그램이 실행되기 전에 꼭 필요한 정보들이 포함되며 코드 내 모든 심볼에 대한 정보가 저장돼있다. 즉, 메모리에 매핑되는 각 section에 대한 설명과 타겟의 flash & RAM에 프로그램을 올릴 때 필요한 정보가 저장된 .ld 파일이다.

    • 가장 간단한 링커 스크팁트는 적어도 RAM과 FLASH에 대한 정보를 담은 MEMORY section을 갖고 있다.

      MEMORY {
          FLASH(rx) : ORIGIN = 0x00000000, LENGTH = 256K
          RAM(rwx) : ORIGIN = 0x20000000, LENGTH = 64K
      }
    • 앞서 .text.rodata는 읽기 전용이라고 했다. 따라서 flash에 저장돼야 한다.
      반면 .data.bss는 RAM에 매핑되며 수정이 가능하다.

2.3. Make

  • Make는 binary 이미지 파일 생성을 자동화할 수 있는 표준 유닉스/POSIX 도구다.

  • 사용자가 직접 레시피나 규칙을 적용해 입맛에 맞는 출력 파일을 자동으로 생성해줄 수 있는 강력한 도구다.

  • 별도의 문법을 가지며 구조는 아래와 같다.

    target: [prerequisites]
    	recipe1
        recipe2
        ...

2.4. Debugger

  • 가장 유명한 디버거는 GCC Debugger인 GDB이다.
    임베디드 sw 개발은 보통 host와 타겟 플랫폼이 다르기 때문에 원격 디버그 세션을 만들어야 디버깅이 가능하다.
  • 디버거는 CPU register와 memory의 현재 상태를 직접 살펴보면서 런타임 속 오류를 잡아낼 수 있도록 돕는다.
  • ※ 개발 중 원활한 디버깅을 위해 컴파일러의 최적화 기능은 사용하지 않는 것이 좋다. 컴파일러가 코드의 실행 순서를 변경하고, 몇몇 변수는 숨겨버릴 수 있어서, 최적화된 코드 흐림이 디버깅 시 추적을 더 어렵게 만든다.

2.5. GCC Toolchain

  • GCC는 ARM 임베디드 툴체인을 배포하고 있다. arm-none-eabi라는 접두어로 시작한다.
  • 내부에는 크로스 컴파일러와 디버거를 포함한다.

2.6. 타겟과의 상호작용

  • 개발할 때 보통 우리는 타겟 보드와 JTAG 또는 SWD 인터페이스를 통해 flash에 펌웨어를 업로드하고 디버깅한다.
  • 타겟의 JTAG/SWD 기능에 접근할 수 있는 강력한 오픈소스 도구로 로컬 소켓을 생성하는 OpenOCD (On-Chip Debugger)가 있다.
  • 몇몇 개발 보드는 host와 통신하기 위한 추가 인터페이스가 부착된 경우도 있다. STMicrolectronics는 Cortex-M을 위한 ST-Link라는 인터페이스가 부착돼있다. 이를 통해 직접적인 디버깅 접근과 flash 업로드 기능을 지원한다.

2.7. 에뮬레이터

  • Host PC에서 전체 타겟 플랫폼을 qemu로 에뮬레이션하면 위험성을 줄이고 이식성 요구 없이 타겟 머신에 특화된 코드를 실행하고 디버깅할 수 있다.
  • Qemu가 ARM의 하드웨어와 특수기능을 상당히 정확히 구현하고 있지만, 실제 하드웨어와 시스템 레이아웃이 완전 일치하지는 않기 때문에 분명히 한계를 가진다. 그렇지만, Qemu는 Cortex-M의 기능을 숙지하는 가장 빠른 방법이라 장담한다.
profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글