실시간 운영 체제(RTOS)는 멀티 스레드 애플리케이션을 실행하고 실시간 마감 기한을 맞출 수 있는 운영 체제(OS)(종종 가벼운 OS)입니다. 대부분의 RTOS에는 스케줄러, 리소스 관리, 디바이스 드라이버가 포함되어 있습니다. "deadline"에 대해 이야기할 때 반드시 "빠른"을 의미하는 것은 아닙니다. 대신, 마감 시간을 맞추는 것은 런타임 전에 특정 작업이 언제 실행될지 파악할 수 있는 결정론적 수준을 의미합니다. 어떤 정해진 순간에 작업을 끝마친다는 의미가 강합니다.
이 시리즈에서는 다양한 RTOS 개념을 다루고 ESP32와 Arduino IDE를 사용하여 이를 데모로 보여 드리겠습니다. 이 정보는 일련의 동영상에서 다룰 예정입니다. 대부분의 동영상은 도전 과제로 마무리됩니다. 이러한 과제에 대한 솔루션은 Maker.IO 페이지에서 확인할 수 있습니다.
관련 유튜브 영상 Introduction to RTOS Part 1 - What is a Real-Time Operating System (RTOS)? | Digi-Key Electronics
범용 운영 체제와 실시간 운영 체제 비교
흔히 '운영 체제'라고 하면 Windows, macOS, Linux 등을 떠올리게 됩니다. 이들은 범용 운영 체제(GPOS)의 예입니다. 대부분의 경우 이러한 운영 체제는 사용자 상호 작용을 위해 설계되었으며 명령줄 인터페이스(CLI)나 그래픽 사용자 인터페이스(GUI)와 같은 일종의 인터페이스를 제공합니다. 또한 멀티 스레딩을 통해 여러 애플리케이션을 실행하고 리소스/파일 관리 및 장치 드라이버와 같은 기타 이점을 제공하도록 설계되었습니다.
일반적으로 사용자 상호 작용이 GPOS 설계의 주요 초점이기 때문에 사용자가 긴 지연 시간을 느끼지 않는 한 약간의 지연 시간은 허용됩니다. 따라서 GPOS에서는 정확한 작업 기한을 예측하기가 어렵습니다(불가능하지는 않더라도).
이를 RTOS와 대조해 보십시오. 대부분의 RTOS는 마이크로컨트롤러에서 실행되도록 설계되었습니다. 따라서 사용자 입력을 처리할 필요 없이 한 번에 몇 가지 작업을 수행하기 위해 복잡한 사용자 인터페이스(예: 명령줄이나 GUI 없음)를 포기하는 경우가 많습니다. 또한 마이크로컨트롤러용으로 작성된 애플리케이션은 몇 밀리초마다 점화 플러그를 점화하거나, 의료 기기를 제어하여 사람의 생명을 유지하거나, 인공위성의 추진기를 정확한 시간에 발사하여 궤도를 유지해야 하는 등 엄격한 타이밍 기한을 지켜야 할 수도 있습니다.
또한 많은 RTOS에는 파일 읽기 및 쓰기 기능과 같은 리소스 관리 라이브러리와 WiFi 및 Bluetooth 스택, LCD 드라이버와 같은 로우레벨 디바이스 드라이버가 함께 제공됩니다. 마이크로컨트롤러는 일반적으로 그래픽 카드 제어와 같은 작업을 수행하지 않기 때문에 RTOS의 디바이스 드라이버는 일반적으로 GPOS의 디바이스 드라이버보다 훨씬 간단하다는 점에 유의하세요!
슈퍼 루프와 멀티 스레드 애플리케이션 비교
이전에 임베디드 애플리케이션을 작성해 본 적이 있다면(아두이노용 포함) 슈퍼 루프 아키텍처("베어메탈 프로그래밍"이라고도 함)에 익숙할 것입니다. 여기에는 운영 체제가 없으며 구조가 매우 간단합니다. main() 함수에서 변수, 드라이버, 라이브러리 등을 설정한 다음 while(true) 루프에서 하나 이상의 주기적 작업을 수행합니다. 아두이노에서는 setup() 및 loop() 함수(아두이노 라이브러리의 main() 함수에서 호출되는 함수)로 구현됩니다.
슈퍼 루프 애플리케이션에 잘못된 것은 없습니다. 실제로 구현하기 쉽고 디버깅하기 쉽기 때문에 여전히 마이크로컨트롤러를 프로그래밍하는 가장 인기 있는 방법 중 하나입니다. 타이머가 만료되거나 버튼이 눌리는 등의 외부 이벤트가 발생하면 프로그램을 중지하고 임의의 코드를 실행하는 인터럽트 서비스 루틴(ISR)을 사용하여 인터럽트를 추가할 수도 있습니다.
메인 루프 중에 수행해야 할 작업이 여러 개 있는 경우 일반적으로 라운드 로빈 방식으로 작업을 실행합니다. 문제는 너무 많은 작업을 추가하기 시작하여 일부 작업이 기한을 놓치거나 다른 기능이 작동하지 않는 경우입니다. 이때 RTOS가 도움이 될 수 있습니다. 모든 작업을 라운드 로빈 방식으로 실행하는 대신 기본적으로 모든 작업을 동시에 실행할 수 있습니다.
인터럽트를 통해 현재 실행 중인 모든 작업을 중단하여 ISR을 실행한 다음 다시 작업으로 실행을 되돌릴 수 있습니다.
여기에는 혼동될 수 있는 용어가 몇 가지 있습니다:
- 태스크는 메모리에 로드된 명령어 집합입니다. 또한 달성해야 하는 작업 단위 또는 목표를 의미할 수도 있습니다.
- 스레드는 자체 프로그램 카운터와 스택 메모리가 있는 중앙 프로세서(CPU) 사용 단위입니다.
- 프로세스는 컴퓨터 프로그램의 인스턴스입니다. 프로세스에는 여러 개의 스레드가 있을 수 있습니다. 대부분의 임베디드 프로그램은 단일 프로세스로 작성되지만 GPOS는 일반적으로 여러 프로세스가 동시에 실행됩니다.
FreeRTOS에서는 이러한 용어가 더 모호해질 수 있습니다. FreeRTOS에서는 "작업"이라는 용어를 "스레드"라는 의미로 사용합니다. 따라서 특히 FreeRTOS 설명서에서 이러한 용어가 같은 의미로 사용되는 것을 자주 볼 수 있습니다. 이 비디오 및 게시물 시리즈에서는 CPU 사용률 단위를 "작업"이라고 부르는 FreeRTOS 관행을 고수하겠지만, 다른 프레임워크(예: POSIX)에서는 "스레드"와 유사하다는 것을 알고 있습니다.
그렇다면 궁극적인 질문인 RTOS를 사용해야 할까요? 목표를 달성하기 위해 마이크로컨트롤러에서 여러 작업/스레드를 실행해야 한다면 대답은 "예"입니다. 실시간 마감 시간을 맞출 수 있는 기능은 필요에 따라 중요할 수도 있고 그렇지 않을 수도 있습니다. 멀티 스레딩이 필요하지 않은 경우 디버깅이 훨씬 쉬운 슈퍼 루프 아키텍처를 사용하는 것이 가장 좋습니다.
멀티 스레딩 지원이 필요한 경우 RTOS에는 몇 가지 다른 이점도 있습니다. 즉, 작업을 개별적으로 작성할 수 있으므로 코드를 더 쉽게 모듈화할 수 있습니다. 팀에서 작업하는 경우 개별 작업을 다른 팀원에게 할당하여 동시 개발이 가능하도록 할 수 있습니다. 모든 것이 올바르게 통합되었는지 확인하기 위해 마지막에 디버깅을 수행해야 한다는 점에 유의하세요.
RTOS 요구 사항
RTOS는 작업을 전환하기 위해 백그라운드 작업(스케줄러)을 정기적으로 실행해야 하므로 약간의 오버헤드가 필요합니다. 이는 메모리와 일부 CPU 사이클을 차지합니다. 따라서 많은 RTOS에는 최소 클럭 속도 및 메모리 요구 사항이 있습니다.
기술적으로는 Arduino UNO(ATmega 328p)에서 다양한 RTOS를 실행할 수 있지만, 스케줄러의 오버헤드가 너무 커서 자체 애플리케이션에 사용할 수 있는 리소스가 많이 남지 않습니다. 따라서 많은 8비트 및 16비트 마이크로컨트롤러는 더 간단한 슈퍼 루프(베어메탈) 아키텍처와 함께 사용하는 것이 가장 좋습니다.
더 빠른 클럭(예: 20MHz 이상)과 더 많은 메모리(예: 32kB RAM 이상)를 갖춘 더 강력한 32비트 마이크로컨트롤러를 사용하기 시작하면 RTOS를 실행하는 데 더 많은 리소스를 사용할 수 있습니다. 이는 어려운 요구 사항이 아니며 RTOS마다 필요한 리소스의 양이 다르다는 점에 유의하세요.
이 시리즈에서는 240MHz 클록, 512kB RAM, 2개의 코어를 갖춘 ESP32를 사용합니다. 사물 인터넷(IoT) 시스템으로 설계되었기 때문에 ESP32는 RTOS의 이점을 누릴 수 있습니다. 실제로 ESP32의 Arduino 버전은 FreeRTOS를 기본적으로 지원합니다(정확히 말하면 수정된 버전). WiFi 및 Bluetooth 스택만으로는 필요한 시간 내에 네트워크 요청에 응답할 수 있도록 사용자 애플리케이션과 동시에 실행되어야 하므로 RTOS가 필요합니다.
이클립스 재단의 2018년 설문 조사에 따르면, Linux는 여전히 IoT 디바이스에 가장 많이 사용되는 운영 체제였습니다. 그러나 Linux는 경량으로 사용되더라도 완전한 일반적 목적의 운영체제 GPOS라는 점에 유의하세요. 또한 일반적으로 실행하려면 마이크로컨트롤러가 아닌 전체 마이크로프로세서가 필요합니다.
Windows(또 다른 GPOS) 다음으로 가장 인기 있는 RTOS는 FreeRTOS였습니다. 그 뒤를 이어 베어메탈 프로그래밍(슈퍼 루프)이 뒤를 이었습니다. 나머지는 이 4가지의 인기와 비교되지 않는 것 같습니다. 그렇긴 하지만 제퍼 프로젝트는 RTOS 분야의 신생 프로젝트이며 리눅스 재단의 지원을 받고 있기 때문에 계속 주시하는 것이 좋습니다.
복잡한 임베디드 프로그램을 만들 때 RTOS는 강력한 도구가 될 수 있습니다. 작업을 분리하고 동시에 실행(또는 동시에 실행되는 것처럼 보이게)할 수 있는 기능을 제공합니다. 대부분의 RTOS에서 작업의 우선 순위 수준을 설정할 수 있으며, 이를 통해 일부 작업을 다른 작업보다 먼저 중단하고 실행할 수 있습니다. 이를 "선점"이라고 합니다.
동시성이 필요하거나 IoT 또는 머신 러닝과 같은 심층적인 임베디드 개념을 다루고 있다면 툴킷에 RTOS와 멀티스레드 프로그래밍을 추가하는 것이 좋습니다!
RTOS에 관심있다면 다음 기사를 추천합니다.
FreeRTOS book and reference manual:
RTOS:
기사참고 - RTOS란 무엇입니까? - RTOS 소개 영상 링크 참고
'개발자 > 라즈베리파이4' 카테고리의 다른 글
라즈베리파이4 스마트홈 가스센서 코드 3 (4) | 2023.05.10 |
---|---|
라즈베리파이4 스마트홈 불꽃 센서 코드 2 (1) | 2023.05.09 |
라즈베리파이4 스마트홈 제품 특징 1 (1) | 2023.05.09 |
Raspberry Pi 4 기구 도면 (0) | 2023.04.07 |
Raspberry Pi 베스트 프로젝트 Top 10 (0) | 2023.03.24 |
라즈베리파이 모든 데이터 시트와 문서 모음 (1) | 2023.03.03 |
Raspberry Pi Pico 시작하기, RP2040 마이크로컨트롤러 보드 (0) | 2023.02.24 |
아쿠아포닉스 온도 센서 EZO-RTD Micro PT-1000 온도 Probe 개요 1 (0) | 2023.02.15 |
더욱 좋은 정보를 제공하겠습니다.~ ^^