[WizFi250심화과정 2] Setting up the Eclipse Environment for GCC ARM

0
2122

Eclipse 설정

CDT(C/C++ Development Tools) 설치

Eclipse에서 C/C++ Development Tool들을 설치 하기 위해서는 아래와 같은 과정을 진행 해야 한다.

[Help]-[Install New Software]-[Available Software Sites] 선택 후, CDT 경로 추가

20150313_144534    20150313_144535

20150313_144609

 

[Help]-[Install New Software]-[Work with]-[CDT – http://xxxxxx]를 선택

20150313_144636        20150313_144637

 

20150313_144712        20150313_144720

20150313_144953


Project를 새로 생성하는 경우

Project 생성

[New]-[C Project] 메뉴를 선택하고, Project Name과 Toolchain을 아래와 같이 설정한다.

20150313_145158        20150313_145313

20150313_145321

ARM용 Binary로 Cross Compile 하기 위한 Compiler의 경로와 compiler prefix를 기입한다.
– Cross compiler prefix : arm-none-eabi
– Cross compiler path : C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin
(앞에서 설치한 GCC ARM Toolchain의 경로를 입력)

20150313_145424

ST Standard Library Download

다운로드 받은 ST Standard Library를 아래 그림과 같이 Eclipse Workspace의 Project에 복사 한다.
– CMSIS & Library 복사
– 라이브러리 경로 : ==C:\다운로드 받은 경로\STM32F10x_StdPeriph_Lib_V3.5.0\Libraries==
– Project 경로 : ==C:\workspace\USART_Test==

  • LinkScript & stm32f10x_conf.h 복사
    • stm32f10x_conf.h 경로 : ==C:\다운로드 받은 경로\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\stm32f10x_conf.h==
    • LinkScript 경로 : ==C:\다운로드 받은 경로\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Template\TrueSTUDIO\STM3210C-EVAL\stm32_flash.ld==
    • Project 경로 : ==C:\workspace\USART_Test==

20150313_152746

Compile 환경 설정

위 과정을 완료 한 후, Eclipse Project에서 F5 Key를 누르면 아래 그림과 같이 복사된 폴더 및 파일 들을 볼 수 있다.
그 다음, [Resource Configurations]-[Exclude from Build..] 메뉴를 선택하여, 컴파일에 불필요한 파일들을 지정한다.
– 예를 들면, Keil,IAR 컴파일러를 위한 Startup Code 및 다른 density performance를 위한 Startup Code
– 본 프로젝트에서는 STM32F103C8T6 MCU를 사용하기 때문에 Medium-density를 제외하고는 프로젝트에서 제거 한다.
– ==주의: startup_stm32f10x_md.s 를 startup_stm32f10x_md.S ( 대문자 )로 변경해야 한다.==
– 소문자로 사용 시, Eclipse에서 인식을 못하는 증상 보임.

20150313_152831
20150313_152846
20150313_152930

  • stm32_flash.ld 파일 수정 ( STM32F103C8T6의 RAM Size와 Flash Size 적용 )

[code language=”cpp”]
/* Entry Point */
ENTRY(Reset_Handler)

/* Highest address of the user mode stack /
_estack = 0x20005000; / end of 20K RAM */

/* Generate a link error if heap and stack don’t fit into RAM /
_Min_Heap_Size = 0; / required amount of heap /
_Min_Stack_Size = 0x200; / required amount of stack */

/* Specify the memory areas */
MEMORY
{
FLASH (rx) : ORIGIN = 0x08000000, LENGTH = 64K
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 64K
MEMORY_B1 (rx) : ORIGIN = 0x60000000, LENGTH = 0K
}
[/code]

Project Name 선택 후, 마우스 오른쪽 버튼 클릭 -> [Properties]-[C/C++ Build]-[Setting]-[Tool Settings]-[Cross Settings]
– Prefix : arm-none-eabi
– Path : C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\bin

20150313_153107

다운로드 받은 Library는 범용 Library 이므로, STM32F103C8T6을 위한 Define을 설정 한다.
[Properties]-[C/C++ Build]-[Setting]-[Tool Settings]-[Cross GCC Compiler]-[Symbols]-[Defined symbols]
– Project Define 추가
– USE_STDPERIPH_DRIVER
– STM32F10X_MD

20150313_153154

사용되는 header 파일들의 Path를 지정한다.
– “${workspace_loc:/${ProjName}/CMSIS/CM3/CoreSupport}”
– “${workspace_loc:/${ProjName}/CMSIS/CM3/DeviceSupport/ST/STM32F10x}”
– “${workspace_loc:/${ProjName}/STM32F10x_StdPeriph_Driver/inc}”
– “${workspace_loc:/${ProjName}}”

20150313_153301

컴파일 옵션을 설정한다.
– -c -v -mthumb -mcpu=cortex-m3 -fmessage-length=0

20150313_153541

Link 옵션을 설정한다.
– Linker Flags :  -T “${ProjDirPath}\stm32_flash.ld” -mthumb -mcpu=cortex-m3 -Wl,-Map=linker.map -Wl,-cref -Wl,–gc-sections -specs=nosys.specs

20150313_153859

Assembler 옵션을 설정한다.
– [Cross GCC Assembler]-[Command:] : as
– [Cross GCC Assembler]-[General]-[Assembler flags] : -mthumb -mcpu=cortex-m3

20150313_153918

20150313_153952

[Properties]-[C/C++ Build]-[Settings]-[Build Steps]-[Post-build steps]
– Command : objcopy -O binary ${ProjName} ${ProjName}.bin

20150316_095529


기존 Project를 Import 하는 경우

기존프로젝트 다운로드 경로 : EX1_USART_Test
– View Raw 클릭하면 EX1_USART_Test.zip 파일을 다운로드 할 수 있음.

다운로드 한 프로젝트 파일을 Workspace에 복사
– Project Explorer에서 마우스 오른쪽 버튼 클릭 -> [Import]-[General]-[Existing Projects into Workspace]
– 기존 프로젝트 경로를 선택

20150316_111445
20150316_111459
20150316_111520

위 과정을 완료 한 후, Project Build(Ctrl + B)를 실행하면 아래 그림과 같이 컴파일이 되고 바이너리가 생성되는 것을 확인 할 수 있다.

20150316_111742

Appendix

Fix “registers may not be the same” ARM GCC error

GCC ARM Toolchain이 최신 버전인 경우, ST에서 제공한 Library와 호환성 문제가 발생하여 아래와 같은 에러를 볼 수도 있다.

20150313_161039

이런 경우, core_cm3.c의 __STREXB 함수와 __STREXH 함수를 아래와 같이 수정하면 해결 된다.

 

 

[code language=”cpp”]
uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;

//__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
__ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );
return(result);
}

uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;

//__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
__ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );

return(result);
}
[/code]

ELF 파일을 Bin 파일로 변경하는 방법

  • GCC Version
    • gcc version 4.9.3 20141119 (release) [ARM/embedded-4_9-branch revision 218278] (GNU Tools for ARM Embedded Processors)
  • C:\Program Files (x86)\GNU Tools ARM Embedded\4.9 2014q4\arm-none-eabi\bin 를 환경변수 PATH에 추가
    C:\workspace\USART_Test\Debug>objcopy -O binary USART_Test USART_Test.bin

NO COMMENTS