임베디드 C 최적화 기법 snippets

임베디드 C 최적화 기법 snippets

2019, Oct 20    


C 관련 글 목차


목차


  • 임베디드 관련 기초 상식

  • 비트 연산 활용

  • 외부 요인에 의해 변하는 메모리를 위한 volatile 키워드


임베디드 관련 기초 상식


  • 임베디드는 PC와 상당히 많이 다른 환경을 가지고 있습니다. 개발 입장에서 가장 큰 차이점은 PC와 사용하는 프로세서 및 하드웨어가 다르고 개발 환경이 다르다는 것입니다.
  • 일반적으로 PC의 프로세서는 인텔 계열을 많이 사용하지만 임베디드에서는 다양한 프로세서를 사용하고 있으며 대표적으로는 ARM이 있습니다.
  • 임베디드에서 프로세서를 다양하게 사용하는 이유는 가격, 전력소모, 성능, 크기 등 PC에서 덜 고민할 수 있는 부분을 민감하게 고민해야 하기 때문입니다.
  • 개발 환경 측면에서의 차이점은 PC에서는 개발환경과 실행환경이 같은 네이티브 개발 환경인 반면에 임베디드 소프트웨어 개발 환경은 개발 환경과 실행 환경이 분리된 크로스 개발 환경인 차이점이 있습니다.
  • 즉, 개발은 PC에서 하되 실행은 임베디드 상에서 실행을 해야 한다는 뜻입니다.
  • 이 때, PC에서 컴파일 한 결과를 임베디드에 그대로 넣으면 실행되지 않습니다. 프로세서가 다르기 때문에 인식하지 못하는데 PC에서의 코드를 임베디드에서 실행할 수 있는 크로스 컴파일러를 통하여 컴파일을 해야 합니다. (예를 들어 ARM 계열에는 arm-linux-gcc 라는 크로스 컴파일러가 있습니다.)
  • 여기서 용어를 정리해 보면 개발 목적의 PC를 호스트 시스템 이라 하고 실행할 임베디드를 타겟 시스템이라고 합니다.


  • 일반 PC에서 코드를 실행할 때, 컴파일 및 링킹을 통하여 바이너리를 생성하고 이 바이너리를 실행시켜 코드를 실행하게 됩니다.
  • 크로스 컴파일 과정에서도 이와 유사한데 링킹 시 로케이터라는 작업이 필요합니다.
  • 로케이터는 타겟 시스템의 메모리 정보를 필요로 하며 이는 링커 스크립트 파일에 의해 제공됩니다.
  • 링커 스크립트 파일에는 롬의 시작 주소, 램의 시작 주소, 각 세션의 시작과 끝 등의 메모리 정보가 있습니다.


  • 프로그램을 PC에서 개발한 다음 임베디드인 타겟 시스템으로 옮길 때 주로 3가지 방법을 사용합니다.
  • 시리얼 케이블 : 시리얼 케이블은 UART(Universal Asynchronous Receive/Transmitter)로 직렬 장치를 이용한 통신입니다. 통신 내용은 시스템 콘솔을 사용해 확인할 수 있고 프로그램 모니터링 및 디버깅이 가능합니다.
  • JTAG 케이블 : 타겟 시스템에 프로그램을 다운로드하거나 플래쉬 메모리에 탑재할 수도 있습니다. 또는 레지스터의 값을 읽어올 수 있거나 프로그램을 스텝으로 작동시키는 디버깅도 가능합니다.
  • 이더넷/USB 케이블 : PC에서 주로 사용하는 이더넷이나 USB 케이블로 타겟 시스템에 프로그램을 전달할 수도 있으나 이 경우 추가 프로그램 설치가 필요한 단점이 있습니다.


  • 프로그램에서 하드웨어에 접근할 때에는 메모리에 값을 읽고 써서 하드웨어를 제어합니다.
  • 따라서 각 하드웨어 별로 사용하는 메모리 구간이 필요한데 메모리 맵 I/O 또는 I/O 맵 I/O 라는 2가지 방식을 통하여 메모리 구간을 설정합니다.
  • 메모리 맵 I/O : 입출력 장치들이 사용하는 메모리가 따로 정해져 있지 않아서 장치가 사용할 메모리를 개발자가 직접 사용하는 방식으로 ARM 계열 프로세서에서 사용되는 방식입니다.
  • I/O 맵 I/O : 입출력 장치들이 사용할 메모리가 미리 정해져 있어서 지정된 메모리만 사용하는 방식으로 주로 인텔 계열 프로세서에서 사용하는 방식입니다.


C 관련 글 목차