MCU 개발에 사용되는 소프트웨어 종류는 뭘까?
상태바
MCU 개발에 사용되는 소프트웨어 종류는 뭘까?
  • 신동윤 기자
  • 승인 2019.07.09 13:38
  • 댓글 0
이 기사를 공유합니다

마이크로 컨트롤러 유닛(Micro Controller Unit, MCU)는 전자제품, 전자기기의 필수 반도체인 만큼 사용되는 범위가 무궁무진하다. 마이크로컨트롤러는 마이크로프로세서와 메모리, 프로그램 가능한 입출력 모듈을 하나의 칩으로 만들어 정해진 기능을 수행하는 컴퓨터를 말한다.

일반적으로 MCU의 성능은 PC 컴퓨터의 CPU에 비해 낮고 저전력이 특징이다. 따라서 컴퓨터의 CPU가 일반적인 운영체제(Operating System, OS)를 사용하는 것과 달리 MCU는 실시간 운영체제(Real Time Operating System, RTOS)를 설치해 사용하거나 OS 없이 펌웨어만 사용해서 자동제어에 사용되는 경우가 많다. 이처럼 MCU를 구동시키기 위해서는 소프트웨어가 반드시 필요하며, 다양한 종류가 있다.
본 글에서는 MCU를 구동하기 위해 필요한 소프트웨어를 살펴보겠다. 이를 통해 MCU 개발에 필요한 소프트웨어의 종류와 기능에 대해 이해하는 것은 물론 필요와 환경에 맞는 소프트웨어를 선택하는데 도움이 될것으로 기대한다.
MCU 개발을 위해 사용하는 일반적인 소프트웨어 종류는 다음과 같다.

디바이스 드라이버
디바이스 드라이버는 특정 주변 장치를 제어하는 데 사용할 API(Application Programming interface)를 정의한다. 예를 들어, ST마이크로일렉트로닉스(이하 ST)가 생산하는 32비트 MCU 시리즈 STM32는 표준 주변 장치 라이브러리로 디바이스 드라이버를 제공하기 때문에, 각 제품에 대해 모든 주변 장치를 평가할 수 있다. 이런 지원으로 32비트 MCU를 처음 사용하는 사용자들도 쉽게 MCU 개발을 시작할 수 있다.

운영 체제
운영 체제(OS)는 애플리케이션 소프트웨어와 미들웨어가 디바이스에 상관없이 잘 사용될 수 있도록 하드웨어를 추상화하는 기본 소프트웨어다. 잘 알려진 PC용 OS로는 윈도우(Windows)와 리눅스(Linux)가 있으며 스마트폰용으로는 안드로이드(Android)와 애플의 iOS가 있다. MCU에서는 RTOS(Real Time OS)가 많이 사용되고 있는데, MCU의 메모리 용량에 한계가 있기 때문에 상대적으로 소프트웨어 크기가 작다고 볼 수 있다.

미들웨어
OS와 애플리케이션 소프트웨어 사이의 미들 레이어(Middle layer))에 위치한 소프트웨어를 통칭하여 ‘미들웨어’라고 한다. 예를 들어, 미들웨어는 USB와 이더넷 통신을 위한 프로토콜 스택과 파일 시스템, 코덱, 그래픽 라이브러리 등이 있다.

애플리케이션 소프트웨어
최상위 레이어에 있는 소프트웨어를 통칭해 애플리케이션 소프트웨어라고 하며, 애플리케이션 구동에만 쓰인다. 애플리케이션 소프트웨어는 세부 애플리케이션 규격을 실현하는데 없어서는 안된다.

소프트웨어 개념에 대한 이해를 돕기 위해 간단히 계층화된 소프트웨어 아키텍처의 일반적인 예를 살펴 보자. [그림 1]은 앞에 설명한 소프트웨어 종류를 포함하고 있는 계층화된 소프트웨어 아키텍처를 보여준다. 맨 아래가 하드웨어 계층(물리 계층)이며, 맨 위가 애플리케이션 계층이다. 중간은 편의상 중간 계층(Middle layers) 또는 미들 레이어라고 부른다.

[그림 1] 계층화된 소프트웨어 아키텍처
[그림 1] 계층화된 소프트웨어 아키텍처

먼저, 맨 아래 계층을 살펴 보자. 여기서 하드웨어 계층은 MCU를 나타낸다. MCU는 일반적으로 레지스터들을 이용해 동작을 조정하며, 바이너리 데이터가 이들 레지스터에 기록되고, 그 각각은 MCU 동작의 특정 목적을 달성하기 위해 지정된다. 하지만, 대부분의 32비트 MCU는 엄청난 수의 레지스터를 처리해야 하기 때문에 동작이 수행될 때마다 레지스터들의 지정된 비트들을 설정하기 전에 모든 레지스터 주소를 확인하는 것은 비현실적이다. 따라서 물리 계층 바로 위에 있는 계층인 디바이스 드라이버를 사용함으로써 이런 과제를 수행하는 부담을 경감시킨다.
디바이스 드라이버는 아주 유용한 소프트웨어다. 이것은 MCU의 주변 장치 설정에 따라 API를 정의한다. 예를 들어, SPI(Serial Peripheral Interface)를 초기화하기 위해서는 레지스터에 대해 신경 쓸 필요 없이 단순히 SPI 초기화 함수를 호출해 초기화 코드를 작성하면 된다.

[그림 2] 소프트웨어 아키텍처 예
[그림 2] 소프트웨어 아키텍처 예

상당수의 개발자들이 디바이스 드라이버를 사용해 애플리케이션 소프트웨어를 개발하고 있다. [그림 2-1]와 같이 개발자들은 하드웨어, 디바이스 드라이버, 애플리케이션 소프트웨어 등 3개의 계층으로 구성된 간단한 소프트웨어 구조를 사용한다.
일부는 제품에 OS를 적용하기도 하는데 이것은 모든 신제품의 OS 상에서 구동되는 애플리케이션 소프트웨어 데이터를 다시 활용하기 위해서이다. 이 경우 모든 신제품에 같은 OS를 인스톨하여 MCU가 기존 자산을 사용할 수 있고 기능을 변경하거나 추가할 수도 있다.
[그림 2-2]의 경우에는 하드웨어, 디바이스 드라이버, OS, 애플리케이션 소프트웨어 등 4개의 계층으로 구성된 소프트웨어 구조를 사용한다.
OS는 일반적으로 이더넷, USB, 파일 시스템과 같은 상대적으로 복잡한 통신 기능을 사용해야 하는 제품에 사용된다. 이런 경우에는 하드웨어, 디바이스 드라이버, OS, 미들웨어, 애플리케이션 소프트웨어 등 5계층 소프트웨어 구조를 형성하기 위해, [그림 2-3]에 나타낸 바와 같이 프로토콜 스택과 파일 시스템과 같은 미들웨어가 추가된다.
마지막으로, 애플리케이션 소프트웨어가 설치돼 MCU 소프트웨어 스택을 완성한다(모든 소프트웨어 구조가 애플리케이션 소프트웨어를 필요로 한다).
요약하면, 각기 다른 종류의 다양한 소프트웨어가 MCU에 사용되며 다수의 계층으로 구분할 수 있다. 이러한 소프트웨어 계층들을 이해함으로써 이런 종류의 소프트웨어들이 애플리케이션에서 수행하는 역할에 대해 이해하고 가장 효율적인 최선의 소프트웨어를 선택할 수 있다.
실제 애플리케이션 개발 관점에서, 소프트웨어 구조의 형태를 선택할 때 실현될 기능(즉 요구되는 규격)이 최우선 순위 기준이지만, 자산의 재사용 가능성(또는 레거시 지원), 개발 기간, 예산 등과 같은 요소들도 거의 동등한 중요도를 가진다. 개별 개발자들은 각기 다른 요구사항 하에서 작업을 하기 때문에, 개발자들은 다음과 같은 딜레마에 직면할 수 있다.
예컨대 써드-파티 소프트웨어를 사용하는 것이 요구되는 규격을 단기간 내에 충족시킬 수 있도록 보장할 수 있지만, 비용이 예산을 초과하게 되는 문제가 발생할 수 있다. 또 자체 소프트웨어를 개발하는 것이 비용을 절감할 수 있지만, 그렇게 할 경우 허용된 개발 기간보다 많은 시간이 필요하게 되는 문제 등이 따른다.

OS의 MCU 소프트웨어 지원 방법은?
MCU OS의 종류는 범용 OS(Universal OS)와 실시간 OS(Real-Time OS, RTOS) 등 크게 두 가지로 분류된다. 일반적으로 RTOS는 소형 OS 풋프린트가 요구되는 MCU에 설치되고, RTOS는 필요한 애플리케이션 소프트웨어를 구성하는 데 사용되는 특정 기본 기능들을 제공해야만 한다. MCU OS는 ‘실시간’이 무엇을 의미하는 지에 따라 선택이 고려돼야 한다.
실시간 컴퓨터와 비-실시간 컴퓨터를 예를 들어 ‘실시간’의 의미를 설명하겠다. 비-실시간 컴퓨터의 경우에 정확한 결과를 얻은 것을 기준으로 태스크를 성공적으로 완료한 것으로 간주한다. 반면 실시간 컴퓨터는 정확한 결과를 생성하는 것 외에도 계산을 제한 시간 내에 완료해야만 한다.
예를 들어 제한 시간이 1분이라면, 실시간 컴퓨터는 1분 이내에 계산을 완료해야만 태스크를 성공적으로 완료한 것으로 간주한다. 따라서 실시간 컴퓨터로 생각되는 컴퓨터는 제한 시간이 지정돼 있어야 하고, 이를 충족시켜야 한다[그림 3].

[그림 3] OS의 실시간 처리
[그림 3] OS의 실시간 처리

따라서 범용 OS는 엄격한 처리 시간이 부과돼 있지 않지만, RTOS는 지정된 시간 범위 내에서 처리를 완료해야 한다는 것을 의미한다.

범용 OS의 특징
일반적으로 범용 OS는 멀티 태스크를 병렬로 수행할 때 시간-분할(Time-sharing) 방식을 이용한다. 이 방식에서는 새로운 태스크 요청이 발생했는데 OS가 이미 다른 태스크를 수행하고 있었다면 지정된 시간이 될 때까지 새로운 태스크 처리에 착수하지 않는다[그림 4]. 라운드-로빈(Round-Robin) 방식이라고도 알려진 이 시간-분할 방식 하에서 OS는 특정 시간에만 하나의 태스크에서 다른 태스크로 전환한다.
예로, 윈도우와 리눅스와 같은 PC OS가 범용 OS에 속한다.

실시간 OS(RTOS)의 특징
복수의 태스크를 병렬로 처리하기 위해서 RTOS는 범용 OS의 시간-분할 방식이 아닌 사전 설정된 우선순위(Preset priorities)에 따라서 태스크를 처리해야 한다. 이를 통해 시스템은 지정된 제한 시간 내에 각각의 태스크를 끝낼 수 있다. [그림 4]에 나타낸 바와 같이 범용 OS와 RTOS가 동일한 3개의 태스크를 각기 다른 순서로 끝낼 수 있다. RTOS는 다른 태스크를 완료하기 전에 우선순위가 더 높은 태스크를 완료한다.

[그림 4] 범용 OS와 실시간 OS 비교
[그림 4] 범용 OS와 실시간 OS 비교

MCU의 경우 일반적으로 RTOS를 선택한다. 전형적인 RTOS의 예로는 uCOS-II나 embOS가 있다. 내장 플래시 메모리를 제공하는 MCU에 설치된 RTOS는 소형 OS 풋프린트(즉, 적은 용량의 ROM 및 RAM)를 지원해야만 한다

•병렬 처리 기능
[그림 4]는 3개의 태스크가 RTOS에 의해 처리되는 방법을 보여준다. 이들 3개의 태스크를 병렬로 동시에 처리하기 위해서, OS는 각 태스크의 상태를 결정하고 그에 맞춰 태스크 스위칭과 태스크 스케줄링을 수행해야 한다. 이런 프로세스를 수행하기 위한 RTOS 기능을 병렬처리 기능(또는 태스크제어 기능)이라고 한다. 다양한 태스크 상태로는 실행(Executing), 휴식(Resting), 준비(Ready), 대기(Waiting) 등이 있다.

•동기화 기능
동기화 기능은 다른 태스크의 처리가 시작되기 전에 하나의 태스크가 완료돼야 할 경우와 같이 상호 연관된 처리 시간을 갖는 서로 다른 태스크들을 동기화한다. 동기화 방법은 세마포어(Semaphore)와 이벤트 플래그 등이 있다.

•통신 기능
통신 기능은 동기화 기능과 다소 유사하지만, 처리 시간 정보뿐만 아니라 하나의 태스크에서 처리된 데이터가 다음 태스크에서 사용되는 경우와 같이 관련된 태스크에 대한 태스크 데이터들을 교환한다. 통신 방법은 데이터 큐와 메일박스가 있다.

•시간 제어 기능
RTOS는 시간 제어 기능을 사용해 태스크의 일시 중단, 주기적인 태스크 호출 등과 같은 시간 관련 동작을 수행한다. 이 기능은 시스템 클록을 설정하거나 참조할 뿐만 아니라 지연 태스크 처리, 타임-아웃 처리 등을 수행한다.

•인터럽트 제어 기능
인터럽트가 태스크들 사이에 생성될 때, RTOS는 현재 태스크의 처리를 일시적으로 중단하고 인터럽트에 해당하는 프로세스로 전환해야 한다. 이런 경우에 인터럽트 제어 기능이 실행 인터럽트 핸들러와 경로를 제어한다. 이 프로세스는 인터럽트 핸들러의 정의, 인터럽트 경로 생성과 제거, 인터럽트 경로 상태 참조, 인터럽트 허가 또는 금지, 인터럽트 마스킹 등이 있다.

•메모리 제어 기능
메모리는 제한된 자원이기 때문에, 이 기능은 동적으로 각 태스크의 메모리 사용을 관리한다. 제어 방법은 고정-길이 메모리 풀과 가변-길이 메모리 풀이 있다.


관련기사