본문으로 이동

C 마이크로프로세서 프로그래밍

위키책, 위키책

C 언어는 실무에서 마이크로프로세서에서 많이 사용 한다. 그러나 C언어의 이해를 할 때, 마이크로프로세서에서 어떻게 실행 되는지 알수 없다면 C언어로 개발된 프로그램과 시스템 설계에서 개발 시간에 한계가 있다. 따라서 단지 C언어 뿐만 아니라 마이크로프로세서와는 어떤 관계가 있는지 C언어 위주로 다루고자 한다.

C 언어와 마이크로프로세서와 관계

[+/-]

MCU를 포함한 임베디드 시스템의 프로그래밍은 주로 C언어를 사용한다. C언어를 컴파일하여 링크하면 해당 CPU의 기계어 코드가 생성되어 CPU에 의해 수행된다.

  1. 마이크로프로세서
  2. 메모리 액세스

ALU의 논리연산

[+/-]

C언어에서 사용한 연산자 중에 많은 경우 ALU을 통해 이루어진다. 마이크로프로세서의 응용 부분중에 MCU와 임베디드 응용분야에 사용하는 많은 마이크로프로세서는 정수형 ALU을 갖는다. 실수연산이 필요한 경우, 부동 소숫점에 의한 로직은 포함하지 않는 경우 여러 번의 정수형연산을 통해 실수형의 계산이 이루어진다.

레지스터와 변수

[+/-]

변수 선언을 하면 데이터를 조작하기 위해 메모리 등에 공간이 확보되고 이것은 데이터를 복사하거나 ALU 연산을 하기 위해 우선 레지스터로 데이터가 옮겨온다. 데이터의 전송을 위해 레지스터를 사용하여 중간 다리 역할을 하는 경우가 많다.

C언어의 수치 연산자 등을 사용하면 레지스터에 데이터를 가져오고, 레지스터는 다시 ALU 디지털회로에 연결되어 연산이 이루어진다. ALU 연산 결과는 다시 레지스터로 옮겨져 처리된다.

이런 과정을 통해 데이터가 처리되므로 레지스터의 비트수는 데이터 처리 단위이기도 하고 조작 단위이기도 하다. 따라서 레지스터와 ALU에 의해 한 번에 처리되는 단위는 변수와 밀접한 관계를 갖는다.

변수의 초기값과 어셈블리

[+/-]

자료형

[+/-]

정수형

[+/-]
  1. char
  2. int
  3. signed/unsigned/
  4. short/long

실수형

[+/-]
  1. Floatdouble

struct

[+/-]
  1. struct

포인터

[+/-]
  1. 포인터

연산자

[+/-]
  1. 사칙연산
  2. 논리연산
  3. 쉬프트

흐름 제어

[+/-]
  1. if ~ else
  2. switch

루프 제어

[+/-]
  1. for
  2. while와 do ~ while
  3. break와 continue

전처리기

[+/-]

함수

[+/-]

MCU 등에서 사용하는 함수는 개발도구에 따라 라이브러리 제공방식이나 한계가 존재한다. 여러가지 실시간 C 라이브러리에는 어떤 것이 존재하는지는 사용설명서를 참고하면 제공되는 범위를 알 수 있다.

스트링 조작

[+/-]

일반적인 C언어에서 제공되는 스트링 조작 함수들은 특정 하드웨어 인터페이스와 연관되지 않고 데이터가 존재하는 메모리상에서 이루어진다. 따라서 많은 개발도구에서 기본적으로 제공하는 라이브러리이다.

  • strlen, stecpy, strcat

입출력 인터페이스

[+/-]

C언어에서 많이 사용하는 scanf, printf 등은 하드웨어와 밀접한 관계가 있다. 따라서 해당 하드웨어와 어떻게 연결할 것인지를 개발도구에서 찾아 제공되는 함수를 추가해야 한다.

  • printf

이 함수는 하드웨어의 특정 출력 장치에 표시할 수 있다.

함수 내의 실행 구조는 우선 내부에서 메모리 변수에 하나의 스트링으로 만들고 한 문자씩 출력하는 방식이다. 따라서 내가 원하는 장치는 보통 putchar 함수에 의해 최종 출력된다. 따라서 개발도구에서 제공하는 이 함수를 어떻게 사용하는지 참고해서 사용하면 된다.

사용되는 함수의 형태는 컴파일러마다 조금씩 다르므로 해당 라이브러리의 API을 참고하면 된다.

컴파일러와 링커

[+/-]

메모리 맵

[+/-]

같이 보기

[+/-]