본문 바로가기

Software/Embedded Linux

MCU(Micro Controller Unit) 그리고 FreeRTOS

 

 

History

마이크로 컨트롤러 유닛(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]계층화된 소프트웨어 아키텍처

먼저, 맨 아래 계층을 살펴 보자. 여기서 하드웨어 계층은 MCㅕ를 나타낸다. MCU는 일반적으로 레지스터들을 이용해 동작을 조정하며, 바이너리 데이터가 이들 레지스터에 기록되고, 그 각각은 MCU 동작을 특정 목적을 달성하기 위해 지정된다. 하지만, 대부분의 32비트 MCU는 엄청난 수의 레지스터를 처리해야 하기 때문에 동작이 수행될 때마다 레지스터들의 지정된 비트들을 설정하기 전에 모든 레지스터 주소를 확인하는 비현실적이다. 따라서 물리 계층 바로 위에 있는 계층인 디바이스 드라이버를 사용함으로써 이런 과제를 수행하는 부담을 경감시킨다.

디바이스 드라이버는 아주 유용한 소프트웨어다. 이것은 MCU의 주변 장치 설정에 따라 API를 정의한다. 예를 들어, SPI(Serial Peripheral Interface)를 초기화하기 위해서는 레지스터에 대해 신경 쓸 필요 없이 단순히 SPI 초기화 함수를 호출해 초기화 코드를 작성하면 된다.

[그림 2] 소프투에어 아키텍처 예

 

상당수의 개발자들이 디바이스 드라이버를 사용해 애플리케이션 소프트웨어를 개발하고 있다. [그림 2-1]와 같이 개발자들은 하드웨어, 디바이스 드라이버, 애플리케이션 소프트웨어 등 3개의 계층으로 구성된 간단한 소프트웨어 구조를 사용한다.

일부는 제품에 OS를 적용하기도 하는데 이것은 모든 신제품의 OS상에서 구동되는 애플리케이션 소프트웨어 데이터를 다시 활용하기 위해서이다. 이 경우 모든 신제품에 같은 OS를 인스톨하여 MCU가 기존 자산을 사용할 수 있고 기능을 변경하거나 추가할 수도 있다.

 

[그림 2-2]의 경우에는 하드웨어, 디바이스 드라이버, OS, 애플리케이션 소프트웨어 등 4개의 계층으로 구성된 소프트웨어 구조를 사용한다. OS는 일반적으로 이더넷, USB, 파일 시스템과 같은 상대적으로 복잡한 통신 기능을 사용해야 하는 제품에 사용된다. 이런 경우에는 하드웨어, 디바이스 드라이버, OS, 미들웨어, 애플리케이션 소프트웨어 등 5계층 소프트웨어 구조를 형성하기 위해, [그림 2-3]에 나타낸 바와 같이 프로토콜 스택과 파일 시스템과 같은 미들웨어가 추가된다.

 

마지막으로, 애플리케이션 소프트웨어가 설치돼 MCU 소프트웨어 스택을 완성한다(모든 소프트웨어 구조가 애플리케이션 소프트웨어를 필요로 한다).

 

요약하면, 각기 다른 종류의 다양한 소프트웨어가 MCU에 사용되며 다수의 계층으로 구분할 수 있다. 이러한 소프트웨어 계층들을 이해함으로써 이런 종류의 소프트웨어들이 애플리케이션에서 수행하는 역할에 대해 이해하고 가장 효율적인 최선의 소프트웨어를 선택할 수 있다.

실제 애플리케이션 개발 관점에서, 소프트웨어 구조의 형태를 선택할 때 실현된 기능(즉 요구되는 규격)이 최우선 순위 기준이지만, 자산의 재사용 가능성(또는 레거시 지원), 개발 기간, 예산 등과 같은 요소들도 거의 동등한 중요도를 가진다. 개별 개발자들은 각기 다른 요구사항 하엥서 작업을 하기 때문에, 개발자들은 다음과 같은 딜레마에 직면할 수 있다.

예컨대 Third-party 소프트웨어를 사용하는 것이 요구되는 규격을 단기간 내에 충족시킬 수 있도록 보장할 수 있지만, 비용이 예산을 초과하게 되는 문제가 발생할 수 있다. 또 자체 소프트웨어를 개발하는 것이 비용을 절감할 수 있지만, 그렇게 할 경우 허용된 개발 기간보다 많은 시간이 필료하게 되는 문제 등이 따른다.

 

OS의 MCU 소프트웨어 지원 방법은?

MCU OS의 종류는 범용 OS(Universal OS)와 실시간 OS(Real-Time OS, RTOS)등 크게 두 가지로 분류된다. 일반적으로 RTOS는 소형 OS 풋프린트가 요구되는 MCU에 설치되고, RTOS는 필요한 애플리케이션 소프트웨어를 구성하는 데 사용되는 특정 기본 기능들을 제공해야만 한다. MCU OS는 '실시간'이 무엇을 의미하는 지에 따라 선택이 고려돼야 한다.

실시간 컴퓨터와 비-실시간 컴퓨터를 예를 들어 '실시간을 설명하겠다. 비-실시간 컴퓨터의 경우에 정확한 결과를 얻은 것을 기준으로 태스크를 성공적으로 완료한 것으로 간주한다. 반면 실시간 컴퓨터는 정확한 결과를 생성하는 것 외에도 계싼을 제한 시간 내에 완료해야 한다.

예를 들어 제하신 시간이 1분이라면, 실시간 컴퓨터는 1분 이내에 계산을 완료해야만 태스크를 성공적으로 완료한 것으로 간주한다. 따라서 실시간 컴퓨터로 생각되는 컴퓨터는 제한 시간이 지정돼 있어야 하고, 이를 충족시켜야 한다[그림 3].

[그림 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 비교

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

 

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

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

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

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

  • 인터럽트 제어 기능
    인터럽트가 태스크들 사이에 생성될 때, RTOS는 현재 태스크의 처리를 일시적으로 중단하고 인터럽트에 해당하는 프로세스로 전환해야 한다. 이런 경우에 인터럽트 제어 기능이 실행 인터럽트 핸들러와 경로를 제어한다. 이 프로세스는 인터럽트 핸들러의 정의, 인터럽트 경로 생성과 제거, 인터럽트 경로 상태 참조, 인터럽트 허가 또는 금지, 인터럽트 마스킹 등이 있다.
  • 메모리 제어 기능
    메모리는 제한된 자원이기 때문에, 이 기능은 동적으로 각 태스크의 메모리 사용을 관리한다.
    제어 방법은 고정-길이 메모리 풀과 가변-길이 메모리 풀이 있다.

참고 : https://www.epnc.co.kr/news/articleView.html?idxno=91138


1. RTOS와 FreeRTOS

RTOS의 특징

  1. Real-time : 애플리케이션의 수행 마감 시간을 정확히 정할 수 있음
    - Soft real-time : Task를 가능한 한 빠르게 수행하지만, 반드시 정해진 수행 시간을 지킬 필요는 없음
    - Hard real-time : Task마다 정해진 수행시간을 반드시 만족해야 함
  2. Scalability : 환경설정을 통해 사용자가 원하는 기능을 추가/제거하여 크기를 조절할 수 있음
  3. Preemptive : 실행중인 Task보다 우선순위가 높은 Task가 나타날 경우, 선점을 허용함
  4. Multitasking : 여러 Task를 동시에 실행할 수 있음
  5. Robustness : RTOS는 CPU의 utilization을 극대화할 수 있는 수단임

 

FreeRTOS 소개

  • 2003년 Richard Barry가 만든 ANSI C 기반 RTOS임
  • 아마존 AWS IoT 서비스 확장을 위해 2017년 11월에 인수
  • 200개 이상의 폭넓은 MCU를 지원하며 포팅을 위한 다양한 컴파일러와 예제 제공
  • MIT 라이센스로 조건 없는 상업 목적 사용 가능
  • Priority based preemptive scheduling을 사용하며, round-robin도 함께 지원함
  • 환경설정에 따라 binary image는 4KB ~ 9KB를 가질 정도로 굉장히 light-weight이며 높은 신뢰성과 안정성을 가짐

2. 네이밍 규칙(Naming rules)

FreeRTOS의 코드는 다음과 같은 네이밍 규칙을 사용한다.

FreeRTOS에서 변수명을 결정할 때 접두어는 아래와 같이 사용한다.

  • c : char 타입을 의미
  • s : int16_t 타입(short)을 의미
  • i : int32_t 타입(int)을 의미
  • x : BaseType_t 타입을 의미. 상당히 자주 사용되는데, 구조체나 인스턴스 핸들 등 일반적인 타입을 제외하면 대부분 x임
  • u : unsigned를 의미
  • p : 포인터 변수를 의미

FreeRTOS에서 함수명을 결정할 때 접두어는 아래와 같이 결정한다.

  • v : void 반환값이 없는 함수를 의미
  • x : 변수명이 접두어인 x와 같은 의미, BaseType_t를 반환하는 함수
  • pv : void* 타입을 반환하는 함수
  • prv : private 함수를 의미. 대표적으로 아무런 Task도 실행되지 않을 때 실행되는 idle Task가 호출하는
    callback 함수 (hook)가 이 접두어를 사용하고 있다.

 

FreeRTOS에서 매크로명은 그 매크로가 선언된 소스파일의 이름을 따라 결정됨.

예를 들어 무한정 기다림을 의미하는 portMAX_DELAY는 portable.h라는 커널 소스에 선언되어 있다.

문서에 따르면 semaphore 관련 API는 거의 매크로로 구성되어 있지만, 함수명 네이밍 규칙을 따라간다고 명시되어 있다.


3. 태스크(Task)

 

FreeRTOS에서 하나의 task는 하나의 스레드(thread)를 의미한다.

 

Task의 특징과 생김새

  • 각 Task에는 우선순위를 할당하며, 숫자가 높을수록 큰 우선순위를 의미한다.
    • 우선순위는 0부터 configMAX_PRIORITIES 까지 할당 가능함
    • 우선순위가 높은 Task는 낮은 Task를 선점(Preemption)할 수 있고, 이때 context switching이 발생함
    • 동일한 우선순위 사이에서는 round robin을 사용함
  • Task는 일회용 Task와 주기적 Task 2가지 종류가 있음
    • 일회용 Task는 기능을 한 번 수행한 뒤, 마지막에 스스로 삭제한다.
    • 주기적 Task는 무한 loop가 존재한다. Delay 또는 suspend 함수 등으로 Task의 state가 blocked(waiting)로
      변하지 않는 이상 계속해서 기능을 빠르게 반복 실행함
  • 각 Task마다 local stack 공간이 할당된다. 이 공간은 메모리의 .bss 또는 .heap 영역에  존재한다.
    • Stack 메모리는 정적 또는 동적으로 할당이 가능함
    • Stack 메모리 할당은 5가지 방법으로 사용자가 환경설정 할 수 있으며,
      메모리 단편화(Framentation)를 최대한 막으며 메모리를 할당한다.
    • configSUPPORT_DYNAMIC_ALLOCATION과 configSUPPORT_STATIC_ALLOCATION 값을
      어떻게 설정하는지 그리고 Task 생성 함수를 xTaskCreate나 xTaskCreateStatic 중 어느 것을 사용하는지에 따라
      할당 방법이 달라진다
반응형

'Software > Embedded Linux' 카테고리의 다른 글

(중급) Embedded Linux System - 1일차  (0) 2016.10.17