지난 글에서는 General Options의 설정에 대해 살펴보았습니다. 대부분의 코드가 C 또는 C++로 작성되어 있으므로 실행 코드를 생성하는데 중요한 C/C++ Compiler 옵션에 대해 살펴보도록 하겠습니다. 설명은 IAR Embedded Workbench for ARM(이하 EWARM) 제품으로 진행합니다.

그림1의 Language 1 탭에서는 C 언어 또는 C++ 언어를 사용할지를 선택합니다. 
Auto는 파일의 확장자(.c 또는 .cpp)에 따라 언어가 자동 선택 됩니다. 

언어에 대한 적합성 항목은 IAR에서 제공되는 확장 언어를 사용할 경우 Standard with IAR extensions를  선택 해야 확장 언어를 사용할 수 있습니다. Standard는 IAR 에서 제공되는 확장 언어는 사용하지 않지만, 그래도 약간의 유연성있는 기능을 사용할 수 있지만, Strict는 부가적인 확장 키워드 등을 사용할 수 없습니다.

[표 1] Language 1

C 언어를 선택한 경우 C89 또는 C99 언어 규격을 선택합니다. Allow VLA는 C99 variable length arrays를 사용하도록 합니다. 또한 C++ inline semantics는 표준 C 소스 코드 파일을 컴파일할 때 C++ inline semantics을 활성화합니다. Require prototypes는 컴파일러가 적절한 프로토타입이 선언되어 있는지를 검사합니다. 함수에 대한 선언(declaration)이 없거나 K&R방식인 경우 등 적절한 선언이 없는 경우 오류를 발생합니다.
다음은 Language 2탭의 내용을 알아봅니다. 일반적으로 컴파일러는 plain char을 unsigned char로 인식합니다. 
Plain char을 Signed로 설정하면, char을 signed char로 해석합니다. 

int add(char a, char b)
{
  return a+b;
}

위의 예제에서 Unsigned가 선택되어 있으면, add(1, 5)의 경우 6이라는 값이 정상적으로 리턴합니다. 그러나, add(1, -5)의 경우는 -4라는 값이 아닌 252라는 엉뚱한 결과 값으로 리턴합니다. 음수를 사용하는 경우 Signed를 선택하거나 페라미터의 char 형을 signed char로 변경해야 합니다.

부동소숫점에 대해 정밀도가 중요시되지 않는 경우 Relaxed(smaller and/or faster)를 선택하면 작고 빠른 코드를 사용할 수 있습니다. 
Enable multibyte support는 한글과 같은 멀티바이트 코드의 문자열을 사용하는 경우에는 선택합니다.

[표 2] Language 2

그림3의 Code 탭에서 Processor mode 설정 항목은 ARM7, ARM9등의 코어는 Arm 명령어와 
Thumb명령어의 두 가지 명령어를 지원합니다. 그래서 Arm 또는 Thumb 모드로의 변경이 필요했지만, Cortex-M 코어는 thumb/thumb2 명령어만을 지원하므로 모드 전환이 필요없습니다.

그래서 Cortex-M 디바이스를 사용하는 경우 Thumb모드만을 지원합니다. Generate interwork code항목을 선택하면 ARM 과 Thumb 코드를 혼용하여 사용하도록 합니다. Position-indepenence는 위치에 독립적인 코드 또는 데이터를 생성합니다. 

이때 생성되는 코드나 읽기 전용 데이터는 PC(program counter) 에 상대적인 어드레스의 구조를 가지게 됩니다. 또한 해당 코드/데이터를 사용하기 위해서는 사용자가 특정 위치로 코드/데이터를 배치하거나 실행시키기 위한 추가의 코드가 필요합니다.

No dynamic read/write initialization 항목을 선택하면, static C 변수의 런타임 초기화 작업을 비활성화 합니다. No data reads in code memory 항목은 ARMv6-M and ARMv7 코어에서만 사용이 가능하며, 특정 코드 메모리 영역에서 데이터를 읽는 것을 금지할 때 사용합니다.

[표 3] Code
[표 4] Optimization

동일한 C코드도 컴파일러에 따라 생성되는 실행 코드는 다르게 생성됩니다. 임베디드 시스템에 있어 실행 코드의 크기는 필요한 플래시 메모리 용량의 크기를 결정합니다. 

하나 더 큰 크기의 메모리가 필요하다면, 그 만큼 비용이 추가될 수 밖에 없습니다. 그래서 보다 작은 코드 크기의 생성은 중요한 의미를 갖습니다. 또한 빠른 실행 속도가 필요한 경우에는 크기보다는 속도에 중요도를 두게 됩니다. 

None, Low, Medium, High의 4단계로 지정할 수있으며, High인 경우 Speed, Size, Balanced로 용도에 맞게 선택합니다. None으로 설정하면 최적화 작업이 진행되지 않아 코드를 변형하지 않기 때문에 작성한 코드의 로직에 따라 실행 코드를 생성합니다. 이는 디버깅 작업을 용이하게 합니다.

참고로 가장 빠른 실행 코드를 생성하기 위해서는 High > Speed > No size constraints를 선택해야 합니다. 작은 코드 또는 빠른 실행 속도의 실행 코드를 생성하기 위해서는 소스 코드의 내용을 분석하고 동일한 결과를 가져올 수 있는 로직의 변경, 즉 코드의 변형이 있어야 가능합니다. Enabled transformations에서 명시된 변형 항목에 대해 세부 설정이 가능합니다.

[표 5] List
[표 6] Preprocessor

List 탭에서는 C 소스 코드와 어셈블러 코드를 함께 생성하는 리스트 파일을 생성할 수 있으며, 진단 정보 내용도 포함 할 수 있습니다. 최적화(optimization) 기능을 사용하는 경우에는 상황에 따라 코드가 생성되지 않는 경우가 발생합니다.

이는 컴파일러가 호출되지 않는 함수의 코드를 자동으로 삭제하거나 로직의 변형으로 해당 코드가 존재하지 않을 수 있습니다. 이렇듯 코드의 생성 여부도 확인 하실 수 있습니다.

또 Output assembler file은 해당 C 소스를 어셈블러 파일로 작성해 주는 기능입니다. 파일명은 C파일명과 같으며, 확장자는 .s 입니다. 어셈블러 코드로 어떤 처리를 해야 하는 상황이라면, 생성된 어셈블러 소스를 참조하여 작성하면 용이하게 작업할 수 있습니다.

Preprocessor 탭에서는 include 파일들이 위치한 디렉토리를 설정하는 것과 프로젝트 전체적으로 사용할 수 있는 심볼을 정의할 수 있다. 소스 코드에서 #include <xxx.h>로 파일을 포함하는 경우처럼 기본 툴에서 제공하는 헤더 파일을 제외하고 모든 include 파일들은 Additional include directories 항목에 명시되어야 합니다.

폴더가 명시되어 있지 않은 경우에는 해당 파일을 찾을 수 없다는 오류 메시지를 발생합니다. 
Ignore standard include directories 항목을 선택하면 표준 포함 디렉토리를 참조하지 않습니다. 칩 제조사에서 제공되는 드라이버 파일들은 하나의 디바이스만을 위해 작성되어 있지 않습니다. 

같은 계열을 하나의 파일로 작성하고 정의된 심볼에 따라 해당 디바이스에 대한 코드를 생성하는 구조입니다. 그러므로 예제 코드를 참조하여 작성하였으면 Defined symbols에 정의되어 있는 항목들은 동일하게 사용하는 것이 좋습니다.

[표 7] Diagnostics

Preinclude file은 설정된 파일을 C 소스 파일을 컴파일할 때 자동으로 첨부하여 사용합니다.
Preprocessor output to file은 전처리 과정의 내용을 파일로 저장하여 확인 할 수 있는 기능입니다.

Diagnostics 탭의 Enable remarks를 선택하면 remark를 사용할 수 있습니다. 기본적으로 remark는 발생되지 않으며, 가장 위험도가 낮은 진단 메시지입니다. Support these diagnostics 항목은 발생된 경고 메시지를 고의로 표시하지 않는 경우에 사용합니다. 

예를 들어 Warning[Pe111]: statement is unreachable 과 같은 경고 메시지가 빌드 과정에서 발생하였으나, 코드의 실행에 영향을 미치지 않다고 판단되면 해당 경고 코드 Pe111을 기입하여 해당 경고 메시지의 발생을 막을 수 있습니다. 

여러 개의 경고 메시지를 처리할 경우는 쉼표(,)를 이용하여 경고 코드를 나열합니다. 
참고로 치명적인 오류에 대해서는 오류 메시지를 감추거나 재정의 할 수 없는 점을 유의하십시오.

Treat these as remarks, warning, errors 항목들은 명시된 메시지 코드를 해당 진단 메시지로 간주합니다. Treat all warnings as errors 항목을 선택하면 모든 경고 메시지를 에러로 간주하여, 오브젝트 코드가 생성되지 않습니다.

[표 8] Extra Options

프로젝트 옵션에서 GUI를 통해 대부분의 내용들을 설정하여 사용할 수 있다. 
그러나 GUI에서 지원되지 않는 내용에 대해서는 Extra Options 탭을 이용하여 설정을 확장해 
좀 더 유연하게 사용할 수 있도록 지원하고 있습니다. Use command line options를 선택하고 command line options 항목에 컴파일러 옵션 명령어을 입력하여 사용하면 됩니다.  
컴파일러 옵션의 Extra Options에 대한 자세한 내용은 C/C++ Development Guide, 
Part 2. Compiler options 편을 참고하십시오.

맺음말 
EWARM에 대한 프로젝트 옵션 중 C/C++ Compiler에 대해 살펴 보았습니다.  응용프로그램의 소스 코드는 대부분이 C 또는 C++ 언어로 작성되므로 이와 관련된 설정은 코드의 생성에 중요한 영향을 미치게 됩니다. 다음 글에서는 Linker 옵션에 대해 살펴보도록 하겠습니다. 감사합니다.

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

회원가입 후 이용바랍니다.
개의 댓글
0 / 400
댓글 정렬
BEST댓글
BEST 댓글 답글과 추천수를 합산하여 자동으로 노출됩니다.
댓글삭제
삭제한 댓글은 다시 복구할 수 없습니다.
그래도 삭제하시겠습니까?
댓글수정
댓글 수정은 작성 후 1분내에만 가능합니다.
/ 400
내 댓글 모음
저작권자 © 테크월드뉴스 무단전재 및 재배포 금지