2013년 7월 6일 토요일

[작업중] 리눅스 시스템에서 Netduino plus 2의 STM32f4xx를 위한 개발 환경 만들기

1. 서론


리눅스 시스템, 좀 더 구체적으로 데비안 시스템에서

각종 CPU  코어를 위한 toolchain을 이미 제공한다.

http://www.emdebian.org/crosstools.html

위의 링크를 살펴 보면 /etc/apt/source.list에 해당 repository를 추가하면

apt-get 툴을 이용하여 arm-linux-gnueabi-gcc의 설치가 가능하다.

하지만, 해당 패키지와의 의존성이 있는 몇몇 패키지에 문제가 생겨 정상적인 사용이 불가능하다.

그리고 예전에 cortex-m3의 stm32 코어를 사용하였을 때 사용하였던 codesourcery lite 툴은

mentor graphic사에 넘어가서 컴파일러를 사용하려면 내 정보를 제공해야하는 것 같다.

그래서 비슷한 cpu를 사용하는 stm32f4-discovery의 환경 설정을 참고해 보았다.

http://www.st.com/web/en/catalog/tools/FM116/SC959/SS1532/PF252419

참고한 사이트는 다음과 같다.

https://forum.sparkfun.com/viewtopic.php?f11&t=31083

위에서 두, 세 번째 내용을 살펴보면,

https://github.com/texane/stlink/blob/master/doc/tutorial/tutorial.pdf?raw=true

다음의 링크에서 환경설정에 관한 내용을 살펴 볼 수 있다.

하지만, 이것도 오래된 버전이라. 다음 링크로 가보라고 안내해 주고 있다.

https://launchpad.net/gcc-arm-embedded

2. 사전 지식

자, 그럼 진짜로 stm32f4xx를 위한 toolchain을 설치해 보자.

안내서는 우분투 시스템을 상정하고 설명하였다.

나는 데비안 시스템이기 때문에 이건 넘어가고 직접 다운로드해서 사용하는 방법을 취해야 겠다.

https://launchpad.net/gcc-arm-embedded/+download

위의 사이트에서 버전 별로 직접 다운로드 할 수 있게 제공하고 있다.

3. 설치 하기

링크에 가보면 여러 가지의 파일이 존재한다.

현재의 최신 버전은 4.7-2013-q2이다. 계속적으로 업데이트가 진행 되기 때문에

apt-get을 통합 자동 업데이트가 불가능하다면 주기적으로 위의 홈페이지를 방문해야한다.

그럼 그 중에서 Linux installation tarball에 해당하는 파일을 다운로드하자.

참 고맙게도 윈도우, 리눅스, 맥 시스템에서 모두 사용할 수 있도록 제공한다.

우선은 임시적인 작업이기 때문에 작업 디렉토리에 압축을 해제하자.

> cp gcc-arm-none-eabi-4_7-2013q2-20130614-linux-tar.bz2 $(HOME)/workspace/arm_projects
> cd $(HOME)/workspace/arm_projects
> tar jxvf gcc-arm-none-eabi-4_7-2013q2-20130614-linux-tar.bz2

그리고 toolchain의 경로를 전역 변수에 등록하는 작업이 필요하다.

앞서서도 이야기 했지만 emdebian의 toolchain이 완성 되기 까지 임시적인 작업이기 때문에

전역 변수에 등록하는 작업을 $(HOME)/.bashrc에 등록하지는 않을 것이다.

그래서 다음과 같은 내용을 갖는 파일을 생성하자.


======================= toolchain.env ==============================
export PATH=$PATH:$(pwd)/gcc-arm-none-eabi-4_7-2013q2/bin
--------------------------------------------------------------------

그리고 위의 파일은 다음과 같이 실행하여 전역 변수에 toolchain의 경로를 등록한다.


> cd $(HOME)/workspace/arm_projects
> source toolchain.env

3. 개발 환경 갖추기

이제는 Makefile, Startup 파일, Linker script 파일을 만드는 작업이 필요하다.

이 작업을 처음부터 다 이해하고 작성한다는 것은 어려운 일이다.

참고가 될만한 것들을 가져다가 작업을 하도록 하였다.

참고문서는 위에서 언급한 stm32f4 discovery 의 펌웨어 소스코드에서 얻어다 쓰도록 하였다.

3.1. Makefile 설정


Makefile은 각종 소스파일의 컴파일 방법에 대해서 정의하고

오브젝트 파일을 어떻게 합성할 것인지에 대해서 정의한다.

일반적인 Makefile의 간단한 시나리오를 이야기 하자면 다음과 같다.

1. 컴파일러, 링커,  등등의 경로와 실행파일의 지정.

2. 컴파일 할때에 컴파일러에 넘겨주어야할 매개변수 CFLAGS의 정의

3. 소스파일을 컴파일한 오브젝트 파일의 합성 매개변수 LDFLAGS의 정의

4. 이미지 파일이 실제 메모리에 적재될때 각 센션별 특정 위치를 지정하는 링커 스크립트 지정

우선, Makefile의 내용을 일일이 살펴보기에는 너무 버겁다.

앞으로 더 살펴보아야 할 것들이 산적해 있기 때문에 심정적으로 더 힘들다.

그래서 필요한 부분만 살펴 보도록 하자.

앞에서 언급했지만 지금 부터 이야기할 Makefile의 내용은 거의 다 stm32f4 discovery 의 펌웨어

소스코드를 가져다 섰다.

그럼 stm32f4 discovery의 펌웨어 소스코드의 Makefile의 흐름을 먼저 파악해 보자.

3.1.1. 컴파일러와 각종 유틸리의 설정


컴파일러와 각종 유틸리티의 파일명과 첨두어에 대한 설정이 이루어 진다.

그 중에서도 다음사항은 가장 중요하다.

TCHAIN_PREFIX = arm-none-eabi

위의 사항은 컴파일러 달리 이야기 하면  arm을 위한 gcc 의 첨두어를 설정하는 부분이다.

이 사항은 설치된 컴파일러의 상황에 따라 바꾸어 주어야 한다.

그리고

CHIP = STM32F40x_1024k 와

BOARD = STM32F4DISCOVERY

에 해당하는 부분이다.

CHIP은 가지고 있는 보드에 달려 있는 cpu와 BOARD는 개발 보드의 모델명으로

상황에 따라 바꾸어 주어야 한다.

하지만, 아직은 소스코드에서 위의 두 가지 정의를 참조하진 않는다.

그냥 앞으로 생길 수 있는 펌웨어의 갈래를 나뉠 수 있는 가지를 제공하고자 하는 것 같다.

3.1.2. 실행 방식과 인터럽트 백터의 위치 지정


다음은 컴파일된 이미지가 램에 적재되어 실행될 것인지

플래시 메모리에 적재되어 실행 될 것인지를 지정한다.

그리고 인터럽트 벡터 모음집이 플래시 메모리에 있는 것을 사용할 것인지

램에 있는 것을 사용할 것인지 지정한다.

이와 같은 설정은 각각 다음 두 가지 정의문으로 지정한다.

RUN_MODE = FLASH_RUN
#RUN_MODE = RAM_RUN

그리고

VECTOR_TABLE_LOCATION = VECT_TAB_FLASH
#VECTOR_TABLE_LOCATION = VECT_TAB_RAM

이 설정들은 나중에 오브젝트 파일들을 적재할 때 참조가 되는 링커스크립트를

이미지가 적재되는 메모리의 형태에 맞게 선택한다.

여기서는 FLASH 메모리에 이미지가 적재되고 있는 인터럽트 벡터 모음집을 사용하기 때문에

나중에 링커 스크립터로 STM32F40x_1024k_flash.ld 를 사용하게 된다.

또한, RUN_MODE에 따라 오브젝트 파일들이 저장되는 위치가 바뀌게 된다.

그레서 컴파일을 수행하기 이전에 RUN_MODE에 따른 디렉토리를 수동으로 만들던지

> make createdirs

을 실행하여 RUN_MODE에 따른 디렉토리를 자동으로 생성해 주어야 한다.

마지막으로, 최종 결과물의 이름은 다음을 통하여 지정하다.

TARGET = project

위와 같이 지정하면 project.bin, project.elf, project.hex 와 같은 결과물이 생성된다.

3.1.3. 소스 코드의 지정




댓글 없음:

댓글 쓰기