이번 글에서는 IAR Embedded Workbench for ARM(이하 EWARM)에서 바이너리 이미지에 대한 활용 방법에 대해 알아 보겠습니다. Bin, bmp, wav 등의 바이너리 형식의 데이터를 프로젝트에서 실행 코드와 함께 생성하는 방법 등 바이너리 파일의 추가, 생성 등에 대해 살펴 봅니다.

 

const char pointer를 이용한 바이너리 이미지 엑세스 
고정된 플레시 메모리에 문자열을 정의합니다. 예를 들어 0x08004000 번지로 가정합니다.
#pragma location=0x08004000
char string[100]; // no assigned value

그러나 배열의 값이 지정되어 있지 않습니다. ILINK를 이용하여 바이너리 파일에 있는 데이터로 문자열의 값을 0x08004000 번지로 설정합니다. 
소스 코드에서 데이터를 엑세스할 때는 다음과 같은 형식으로 고정된 주소의 데이터를 읽어 올 수 있습니다. 
*(uint32_t *)0x08004000

위의 예제처럼 절대 번지로 데이터를 엑세스하게 됩니다. 그러면 배열 변수로 데이터를 엑서스하려면 어떻게 해야 할까요? 다음 내용을 참조하여 해당 사항을 설정하면 변수로 이미지 데이터를 엑세스 할 수 있습니다.

1. 바이너리 파일을 생성합니다. (예를 들어 test.bin 이라는 바이너리 파일이니다.)
2. 프로젝트 옵션의 Linker 카테고리에서 Input 탭에 아래와 같이 항목들을 설정합니다.
Raw binary image file    (test.bin)
Symbol                    (test_bin_symbol)
Section                   (test_bin_section)
Align                     (1)

▲ 그림 1. Linker의 Input탭.

3. Linker configuration file에서 바이너리 이미지의 위치를 지정합니다.
place at address mem:0x08004000 { readonly section test_bin_section };

4. 빌드를 한 후 map파일에서 할당된 번지를 확인합니다.
test_bin_section  const  0x08004000  0x64  test.bin [1]
test_bin_symbol          0x08004000  0x64  Data  Gb  test.bin [1]

5. C 소스 코드에서 const char 포인터로 바이너리 이미지를 엑세스 합니다.
extern const char * test_bin_symbol;
   int main()
   {
     return test_bin_symbol[0];
   }

 

여러 개의 바이너리 이미지 파일 추가  
앞에서 살펴 본 내용은 하나의 바이너리 이미지 파일을 추가하는 경우이며 여러개의 이미지를 추가하는 경우는 다음과 같이 - - image_input 명령어를 이용합니다. 페라미터 값들은 앞서 살펴본 항목과 같이 binary image file, Symbol, Section, Alignment입니다. Linker의 Extra Options의 Use command line options를 선택하고 다음과 같이 입력하여 사용합니다.

--image_input $PROJ_DIR$DebugExeProg0.bin,prog0_bin,prog0_section,8
--keep prog0_bin
--image_input $PROJ_DIR$DebugExeProg1.bin,prog1_bin,prog1_section,8
--keep prog1_bin

▲ 그림 2. Extra Options.

바이너리 형식의 실행 코드 생성  
기본적으로 EWARM에서는 .out 확장자를 가진 ELF/DWARF 형식의 실행 파일을 생성합니다. 

.out파일과 더불어 바이너리 형식의 실행 코드도 함께 생성할 수 있습니다. 프로젝트 옵션에서 Output Convert 카테고리를 선택합니다. 다음의 화면처럼 Generate additional output을 선택 하십시오. 그러면 Output format 항목이 활성화되어 파일의 형식을 지정할 수 있습니다. binary뿐만이 아니라 intel extended, Motorola, TI-TXT등의 형식도 지원합니다.

▲ 그림 3. Output Converter.

바이너리 실행 이미지만 있는 경우 이미지를 플래시 메모리에 쓰기  
바이너리 이미지의 실행 파일만 있는 경우 EWARM을 이용하여 플래시 메모리에 쓰는 방법에 대해 살펴봅니다.

일반적으로 프로젝트를 생성하여 실행 코드를 생성하고, 이 실행 이미지를 플래시로더 프로그램을 이용하여 플래시 메모리에 쓰게됩니다. 이렇듯 프로젝트 파일이 없이 실행 이미지 파일만 있는 경우는 간단하게 프로젝트를 생성하고 사용하는 디바이스 종류, 사용하는 디버그 프로브 등의 정보를 설정하여 이미지 파일을 플래시 메모리에 쓸수 있습니다.

File > New > Workspace를 선택한 후 Project > Create New project를 실행하고 C > main을 선택합니다.

▲ 그림 4. 프로젝트 생성.

프로젝트 이름과 저장될 위치를 설정하는 대화 창이 표시됩니다. 프로젝트 이름(demo)을 지정하고 Save버튼을 누릅니다. (폴더는 미리 생성하신 후 해당 위치를 지정하여 사용합니다.)

▲ 그림 5. 프로젝트 저장.

워크스페이스 창에서 프로젝트를 선택한 후 마우스 오른쪽 버튼을 눌러 컨텍스트 메뉴를 호출합니다. Option을 선택하고 General Options에서 device를 사용하시는 제품으로 선택합니다.

▲ 그림 6. 디바이스 지정.

General Options에서 Library Configuration 탭으로 이동하여 아래와 같이 Library를 None으로, Library low level interface 도 None으로 설정하여 필요하지 않은 라이브러리를 추가하지 않습니다.

▲ 그림 7. 라이브러리 설정.

Linker Options에서 Linker Configuration file에서 override default에 체크하고 해당 icf를 선택합니다. $PROJ_DIR$ 환경변수(.ewp 프로젝트 파일이 있는 폴더)를 사용하여 PATH를 수정하십시오.

▲ 그림 8. icf파일 설정.

Linker Options에서 Input 탭에 Keep symbol에 SYMBIN을 입력하여 Linker에서 삭제하는 것을 방지합니다. 
Raw binary image에서 파일명과 심볼, 섹션, alignment값(4)을 입력합니다.

▲ 그림 9. 바이너리 이미지 추가.

Linker Options에서 List 탭에 Generate linker map file을 체크하여 빌드 시 map파일을 생성합니다.

▲ 그림 10. map파일 설정.

Debugger option > Setup탭에서 사용 중인 debug probe driver를 선택합니다.

▲ 그림 11. 디버그 프로브 설정.

Download 탭에서 Use flash loader(s)를 선택합니다.  Verify download를 선택하시면 확인 작업도 함께 진행합니다. 선택하신 디바이스에 맞는 flash loader 프로그램을 이용하여 플래시 메모리에 쓸 수 있습니다. 

▲ 그림 12. 플래시로더 설정.

빌드를 정상적으로 마친 경우 <그림 13>과 같이 bin 파일이 플래시 처음 부분에 위치된 것을 .map파일을 통해 확인 할 수 있습니다.  

이 후 “Download and Debug”버튼을 클릭하면, 타켓보드의 플래시 메모리에 실행 코드를 쓰고, C-SPY 디버그 프로그램으로 전환하게 됩니다. 

▲ 그림 13. 바이너리 이미지가 할당된 어드레스.

Linker configuration file(.icf)에서는 앞에서 사용한 Section에 대한 정의를 선언해야 합니다.


place at address mem:ROM_START { section MYSEC };

place명령을 이용하여 MYSEC 영역을 ROM_START 번지, 즉 0x08000000으로 지정하고 있습니다.

 

ICF file (STM32F4xx_FLASH.icf)
/**********************************************************/
define symbol ROM_START = 0x08000000;
define symbol ROM_END =   0x080FFFFF;
define symbol RAM_START = 0x20000000;
define symbol RAM_END =   0x2001FFFF;
define memory mem with size = 4G;
define region ROM_region = MEM:[from ROM_START to ROM_END];
define region RAM_region = MEM:[from RAM_START to RAM_END];
place at address mem:ROM_START { section MYSEC };
/**********************************************************/
}

 

맺음말  
IAR EWARM에서 바이너리 파일을 이용하는 방법에 대해 알아 보았습니다. 앞에서 살펴본 기능들을 활용하여 다양한 형식의 데이터를 보다 효율적으로 관리하고 구축하여 개발 작업에 도움이 되기를 바랍니다.

 

고성용 이사 / IAR 시스템즈
Sung-Yong.Ko@iar.com

이 기사를 공유합니다
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지