728x90
반응형
맨 위로 올라가기

 

GNU는 “GNU’S Not Unix”의 약자로,

유닉스와 호환되는 완전히 자유로운 소프트웨어 시스템을 만들기 위한 프로젝트이다.

GNU 프로젝트의 목표는 사용자들이 자유롭게 소프트웨어를 실행, 복사, 배포, 연구, 변경 및 개선할 수 있는 환경을 제공하는 것이다.

이해를 돕기 위해,
GNU 프로젝트를 도서관에 비유해 볼 수 있다.
도서관에서는 누구나 책을 자유롭게 읽을 수 있으며, 때로는 그 내용을 복사하거나, 자신의 생각을 더해 새로운 책을 만들 수도 있다.

GNU프로젝트에서 제공하는 소프트웨어도 마찬가지로, 사용자는 그 소프트웨어으를 자유롭게 사용하고, 필요에 따라 수정하거나 개선할 수 있으며,

모든 것을 법적인 제약 없이 있다.

GNU
프로젝트는 많은 기본적인 소프트웨어 툴을 제공한다.
예를 들어, 컴파일러, 에디터, 등이 있다.
이러한 툴들은 다양한 컴퓨팅 작업을 수행하는 필요한 기본적인 구성 요소들이다.

 


그러니까 다시 정리해보자면,

 

GNU는 유닉스와 완전히 호환되는 Software Tool 들의 집합으로 구성된 프로젝트이다.
이 Tool 들은 개발자들이 소프트웨어를 개발, 컴파일, 디버그, 배포하는 데 필요한 다양한 기능을 제공한다.
각 Tool 은 특정 작업을 수행하는 데 최적화되어 있으며, GNU 프로젝트의 일환으로 자유롭게 사용할 수 있다.

 

GNU 프로젝트에서 제공하는 주요 도구들에 대한 간략한 설명은 다음과 같다.

 -컴파일러:
GCC(GNU Compiler Collection)이라고 하며,
C, C++, Objective-C, Fortran, Ada, Go, D 등 여러 프로그래밍 언어를 위한 컴파일러를 제공한다.

 

-링커:
GNU Binutils의 일부인 ‘ld’가 GNU에서 사용되는 링커이다.
이 링커는 다양한 오브젝트 파일들을 하나의 실행 파일이나 라이브러리로 결합하는 역할을 한다.

 

-어셈블러:
역시 GNU Binutlis에 포함된 ‘as’가 GNU 어셈블러이다.
어셈블러는 고급 프로그래밍 언어로 작성된 코드가 아니라, 어셈블리 언어로 작성된 코드를 기계어 변환하는 도구이다.

-에디터:

-셸:
GNU 프로젝트에서 제공하는 셸의 예로는 ‘Bash(Bourne Again SHell)’가 있다.
Bash는 명령어를 입력하어 컴퓨터에 명령을 내리는 텍스트 기반 인터페이스를 제공하며,
유닉스 쉘 스크립팅에 널리 사용된다.

 

이러한 도구들은 개발자들이 소프트웨어 개발의 다양한 단계를 수행할 있도록 지원한다.
GNU
툴체인을 사용함으로써 개발자들은 프로그램을 개발, 컴파일, 디버깅, 배포하는 필요한 강력하고 일관된 환경을 갖출 있다.

 

 

 

위와 같이 MCU Toolchain을 보면 Default Setting으로 해당하는 WS에서 GNU Tool 을 사용하는 것으로 되어있다.

또한 아래 MCU GCC Assembler, Compiler, Linker를 설정하는 옵션 또한 있다.

 

가만 보면 -mcpu=cortex-m4라는 옵션 외에도 어셈블러, 컴파일러, 링커 설정에서 겹치는 옵션이 있다.
이는 모두 타겟 아키텍처에 최적화된 코드를 생성하기 위해 해당 정보를 필요로 하기 때문이다.

어셈블러는 소스코드 내의 어셈블리 지시문을 CPU 아키텍처에 맞는 기계어 코드로 변환하는 역할

컴파일러는 고수준 언어로 작성된 코드를 해당 CPU 아키텍처를 위한 기계어 코드로 변환한다.
두 과정 모두 타겟 CPU의 특성을 고려해야 하므로 같은 타겟 지정 옵션이 필요하다.

GCC는 단순히 고수준 언어를 기계어로 번역하는 컴파일러 뿐만 아니라,
어셈블리 언어로 작성된 코드를 기계어로 변환하는 어셈블러 기능도 제공한다.
또한, 링커(LD)와 같은 다른 툴들과 함께 사용되어 프로그램의 최종 바이너리를 생성하는 데 필요한 전체 툴체인을 구성한다.

따라서 GCC는 단지 컴파일러의 집합이 아니라,
개발 과정 전방에 걸쳐 필요한 다양한 도구들을 제공하는 완전한 솔루션이다.
이러한 접근 방식은 개발자가 복잡한 빌드 시스템을 구성할 때 발생할 수 있는 호환성 문제를 줄여주고,
다양한 언어와 타겟 아키텍처에 대해 일관된 사용자 경험을 제공한다.

 

여기서 자세하게 들어가서 확인해 것이 있다.
각각의 Tool에서 설정된 Option들이 각각 어떠한 기능인지에 대해서이다.

 


  • MCU GCC Assembler:
    OPTION
    -mcpu=cortex-m4 -g3 -DDEBUG -c -x assembler-with-cpp --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb

    -mcpu=cortex-m4:
    컴파일 대상 CPU를 ARM Cortex-M4로 설정한다.
    이는 GCC에게 최적화할 특정 CPU 유형을 알려준다.

    -g3:
    디버깅 정보를 포함시키는 레벨을 설정한다.
    g3은 가능한 모든 디버깅 정보를 포함시키라는 의미로, 디버깅 시 최대한 많은 정보를 제공받을 수 있다.

    -DDEBUG:
    매크로 DEBUG를 정의한다.
    이는 보통 조건부 컴파일을 위해 사용되며, 디버깅 코드가 조건부로 포함되도록 할 때 유용하다.

    -c:
    컴파일만 수행하고 링킹은 수행하지 않는다. 이 옵션을 사용하면 오브젝트 파일(.o)이 생성된다.
    실행 가능파일이나 라이브러리 파일을 생성하지 않는다.

    -x assembler-with-cpp:
    입력파일을 어셈블리 언어로 처리하지만, C 전처리기(CPP)를 사용해야 함을 GCC에 알린다.
    이를 통해 어셈블리 코드 내에서 C 전처리기 지시문(#define, #ifdef 등: 매크로나 조건부 컴파일)을 사용할 수 있다.

    —specs=nano.specs:
    링커 스크립트를 지정한다. ‘nano.specs’는 더 작은 크기의 C 라이브러리를 사용하도록 GCC에 지시한다.
    라이브러리 및 스택 관리 등에서 메모리 사용량을 최소화하는 nano 버전의 라이브러리를 사용하겠다는 의미.
    이는 제한된 메모리를 가진 임베디드 시스템에서 최적화로서 유용하게 사용된다.

    —mfpu=fpv4-sp-d16:
    부동 소수점 유닛(FPU)을 사용하고, FPU의 버전을 FPv4-SP-D16으로 설정한다.
    이는 Cortex-M4가 지원하는 부동 소수점 명령어 세트를 활성화하여, 소프트웨어 대신 하드웨어에서 부동 소수점 연산을 수행하게 한다.

    -mflat-abi=hard:
    하드웨어 FPU를 사용하여 부동 소수점 연산산을 수행하도록 설정한다.
    이 옵션은 함수 호출 시 부동 소수점 인수를 전달하는 방법과 관련이 있으며, ‘hard’는 하드웨어 FPU를 사용함을 의미한다.

    -mthumb:
    Thumb 명령어 세트를 사용하도록 설정한다.
    Thumb는 ARM 아키텍처의 16비트 축약 명령어 세트로, 코드 밀도를 개선하여 메모리 사용량을 줄일 수 있다.

    ==
    이 GCC 어셈블러 옵션들은 ARM Cortex-M4 마이크로컨트롤러를 대상으로 하는 코드를 컴파일 하기 위한 설정으로,
    상세한 디버깅 정보를 포함시키고, ‘DEBUG’ 매크로를 정의하여 조건부 컴파일을 가능하게 한다.
    컴파일 과정에서만 작동하며 링킹은 수행하지 않고, C 전처리기를 거친 어셈블리 언어 파일을 입력으로 받는다.
    더 작은 C 라이브러리를 사용하여 메모리 사용을 최소화하는 ‘nano.specs’ 설정을 사용하고 하드웨어 FPU사용하여
    부동 소수점 연산을 수행한다. 마지막으로 코드 크기 줄이기 위해 Thumb 명령어 세트를 사용하여 공간 최적화를 한다.


  • MCU GCC Compielr:
    OPTION
    -mcpu=cortex-m4 -std=gnu11 -g3 -DDEBUG -DSTM32F401CCUx -DSTM32 -DSTM32F4 -c -I../Inc -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb

    -mcpu=cortex-m4:
    컴파일 대상 CPU Cortex-M4 지정한다.

    -std=gnu11:
    C 언어 표준을 GNU11 설정한다.
    이는 C11 표준에 GNU 확장을 추가한 것으로, 최신 C 언어 기능과 GNU 특정 확장을 사용할 있게 한다.

    -g3:
    디버깅 정보를 최대한 포함시키도록 지정한다.

    -DDEBUG, -DSTM32F401CCUx, -DSTM32, -DSTM32F4:
    이러한 -D옵션들은 매크로를 정의하여 소스 코드에서 조건부 컴파일을 가능하게 한다.

    - ...:
    생략

    - -I.../Inc:
    컴파일러에게 추가적인 Include 파일을 찾을 디렉토리를 지정한다.
    여기서는 상위 디렉토리 내의 Inc 폴더를 인클루드 경로에 추가한다.(나중에 경로 수정함)

    - Wall:
    모든 경고 메시지를 활성화하여, 잠재적인 코드 문제에 대해 컴파일러가 경고하도록 한다.

    - fcyclomatic-complexity:
    함수의 사이클로매틱 복잡도를 계산하고, 지정된 기준을 초과하는 경우 경고를 생성한다.
    코드의 복잡성을 관리하는 데 도움이 된다.

    - --specs=nano.specs:
    더 작은 크기의 C 라이브러리를 사용하도록 지정한다.
    메모리가 제한된 임베디드 시스템에서 유용하다.


  • MCU GCC Linker:
    OPTION
    -mcpu=cortex-m4 -T"/Users/chmnku/Developement/STM32_Project/stm32f401ccu6_default/STM32F401CCUX_FLASH.ld" --specs=nosys.specs -Wl,-Map="${BuildArtifactFileBaseName}.map" -Wl,--gc-sections -static --specs=nano.specs -mfpu=fpv4-sp-d16 -mfloat-abi=hard -mthumb -Wl,--start-group -lc -lm -Wl,--end-group

    - mcpu=cortex-m4:
    타겟 CPU를 Cortex-M4로 설정한다.
    링커도 타겟 아키텍처에 최적화된 코드 생성을 고려해야하므로 이 정보를 사용한다.

    - T"/Users/chmnku/Developement/STM32_Project/stm32f401ccu6_default/STM32F401CCUX_FLASH.ld":
    링커 스크립트 파일을 지정한다.
    이 스크립트는 메모리 레이아웃, 섹션 매핑, 기타 링킹 관련 설정을 포함하고 있어 프로그램이 어떻게 메모리에 배치될지를 정의한다.

    -specs=nosys.specs:
    시스템 호출을 구현하지 않는 시스템에서 실행될 프로그램을 링크할 때 사용되는 스펙을 지정한다.
    운영체제 없이 실행되는 시스템(베어메탈)에 적합하다.

    -Wl,-Map="${BuildArtifactFileBaseName}.map":
    링커가 생성할 맵 파일의 이름을 지정한다.
    맵 파일에는 변수, 함수의 주소 및 배치 정보 등 프로그램의 메모리 레이아웃에 대한 상세정보가 포함된다.

    -Wl,--gc-sections:
    사용되지 않는 섹션(코드나 데이터)를 제거하여 최종 바이너리의 크기를 줄인다.
    'Wl' 옵션은 링커에게 옵션을 전달할 때 사용된다.

    -static:
    정적 링킹을 수행하도록 지정한다.
    이는 모든 필요한 라이브러리를 최종 실행 파일에 직접 포함시킨다.

    -Wl,--start-group, -Wl,--end-group:
    이 옵션들 사이에 나열된 라이브러리들 C 표준라이브러리, 수학라이브러리 는 순환 의존성이 있을 경우 대비하여 그룹화된다.
    링커가 필요에 따라 이들 사이의 의존성을 올바르게 해결할 수 있도록 한다.

 

728x90
반응형

+ Recent posts