임베디드 리눅스 애플리케이션 개발을 시작하려고 합니다. 그런데 개발 환경을 어떻게 구성하면 좋을까요? 우리에겐 두 가지 선택지가 있습니다. 타깃 디바이스에서 직접 개발 하는 방법과 호스트 PC에서 개발하는 방법입니다. 보통 타깃 디바이스 성능이 일반 PC보다는 좋지 않으므로 별도로 개발용 PC를 두고 작업을 하시는 게 낫습니다. 반면 당장 호스트 PC를 사용할 수 없거나 아직 개발 환경이 준비되지 않았는데 빨리 검토해봐야 한다면 타깃 디바이스에서 직접 코드를 작성해서 테스트해볼 수 있습니다.
이 글에서는 먼저 타깃 디바이스에 직접 개발 환경을 만들어 "Hello World!"를 출력해보는 예제를 설명할 것입니다. 그리고 호스트 PC에서 크로스 컴파일 개발 환경을 준비하는 과정을 살펴봅니다. 호스트 PC에서 테스트 프로그램을 컴파일하고 타깃 디바이스에서 실행하는 방법까지 알아보도록 하겠습니다.
타깃 디바이스에서 개발
타깃 디바이스에서 개발하기 위해서는 당연히 모니터와 키보드, 마우스가 필요합니다. 그리고 인터넷이 연결되어 있어야 합니다.
컴파일러 설치하기
sudo apt install build-essential
"build-essential" 패키지를 설치하면 C/C++ 개발에 필요한 기본 도구들이 한 번에 설치됩니다. 설치되는 항목은 gcc, g++, make, C/C++ 표준 라이브러리 그리고 문서들입니다.
Hello World 빌드하기
우선 Hello World 코드를 아래처럼 작성합니다.
// 파일명: helloworld.c
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
다음은 빌드 과정입니다.
gcc -o helloworld helloworld.c
실행은 이렇게 합니다.
./helloworld
여기까지 문제없이 진행되었다면 터미널에 "Hello World!"라고 출력됩니다.
호스트 PC에서 개발
보통 타깃디바이스와 호스트 PC의 CPU 아키텍처는 다릅니다. 요즘 호스트 PC는 인텔이나 AMD의 64비트 CPU를 사용하는 것이 일반적입니다. 그리고 타깃 디바이스는 대부분 ARM을 사용할 테고요. 이렇게 서로 다른 CPU 아키텍처 환경에서 상대편 환경에 맞게 프로그램을 컴파일하는 것을 "크로스 컴파일"이라고 합니다.
여기서는 호스트 PC에서 ARM의 32비트, 64비트 아키텍처를 가진 타깃 디바이스를 대상으로 크로스 컴파일하는 방법을 다룹니다. gcc 컴파일러의 경우 선택할 수 있는 컴파일러는 총 3가지입니다. 첫 번째는 64비트 ARM, 두 번째는 하드웨어 FPU(Floating Point Unit)이 있는 32비트 ARM 그리고 세 번째는 FPU가 없는 32비트 ARM입니다.
컴파일러 설치하기
우선 CPU 아키텍처와 상관없이 "build-essential" 패키지를 설치합니다.
sudo apt install build-essential
다음은 아키텍처 환경에 맞는 컴파일러를 설치할 차례입니다. 64비트 환경이라면 이렇게 설치합니다.
sudo apt install gcc-aarch64-linux-gnu
sudo apt install g++-aarch64-linux-gnu
타깃 디바이스가 32비트라면 아래처럼 설치합니다.
// H/W FPU가 없을 때
sudo apt install gcc-arm-linux-gnueabi
sudo apt install g++-arm-linux-gnueabi
// H/W FPU가 있을 때
sudo apt install gcc-arm-linux-gnueabihf
sudo apt install g++-arm-linux-gnueabihf
Hello World 빌드하기
코드는 앞에서 작은 것과 다르지 않으니 생략합니다.
컴파일할 때는 타깃 디바이스에 맞는 컴파일러를 사용합니다. 주의할 점은 컴파일러를 설치할 때와 사용할 때 이름이 조금 다릅니다. 설치할 때는 gcc-{ABI 종류}
라는 양식이었는데, 사용할 때는 {ABI 종류}-gcc
라고 적습니다.
ABI는 Application Binary Interface의 약자로 바이너리 수준의 인터페이스 규약을 말합니다. 조금 더 자세한 내용은 ABI, EABI 그 의미를 이해하고 툴 체인 이름까지 해석하기를 참고하세요.
아래는 64비트 ARM 아키텍처를 위한 컴파일 명령 예시입니다.
aarch64-linux-gnu-gcc -o helloworld helloworld.c
이제 만들어진 실행 파일을 타깃 디바이스 시스템에 옮깁니다. 파일을 옮기는 방법은 USB를 이용하든 네트워크를 이용하든 가능한 방법을 사용합니다. 파일을 옮기고난 뒤 타깃 디바이스에서 파일을 실행하려고 하면 아마도 실행되지 않을 것입니다. 왜냐하면 파일의 실행 권한이 없어서입니다. 하지만 걱정하지 마세요. 우리는 chmod
명령으로 실행 권한을 바꿀 수 있습니다.
chmod 775 ./helloworld
이제 파일을 실행해보고 터미널에 "Hello World!"가 출력되는지 확인해봅니다.
./helloworld
'연구 노트 > Embedded' 카테고리의 다른 글
라즈베리파이에 Node.js 설치하기 (0) | 2022.10.05 |
---|---|
[ODROID] Linaro gcc? ARM 아키텍처를 위한 gcc! (0) | 2022.09.08 |
[ODROID] Vu8M 디스플레이 연결 설정하기 (0) | 2022.08.29 |
GNU 어셈블러와 링커 스크립트 매뉴얼 (0) | 2021.04.22 |
[STM32] 레지스터 직접 접근 방식으로 UART 통신 예제 구현하기 (2) | 2021.03.18 |