티스토리 뷰
실시간 동작을 보장하는 방법
시스템이 의도한 대로 작동하도록 보장하는 가장 쉬운 방법 중 하나는 요구사항을 충족하면서도 가능한 단순함을 유지하는 것입니다. 이것은 단순하게 할 수 있는 일을 복잡하게 처리하고 싶은 충동에 저항하는 것을 의미합니다. 토스터기로 빵 한 조각을 굽기 위한 것이라면, 그 위에 디스플레이 장치를 달거나 여러분에게 날씨 정보를 알려주도록 만들지는 마세요. 단지 빵을 굽기위해 적절한 시간동안 전열선을 켜도록 하세요. 이 간단한 작업은 수 년 동안 코드나 프로그래밍 가능한 장치 없이도 잘 수행되어 왔습니다.
프로그래머로서 문제에 마주치게 되면 우리는 바로 MCU의 소스 코드를 수정하려는 경향이 있습니다. 그러나 제품의 일부 기능(특히 전기 기계 구성품이 있는 제품의 경우)은 코드 없이도 잘 처리됩니다. 자동차 유리창을 움직이는 데에는 폴링 루프를 처리하고, 드라이버를 통한 모터를 조작하거나 언제 모터 동작을 멈춰야할지 피드백 받을 수 있는 센서를 감지하는 MCU가 필요하지 않습니다. 이 작업은 실제로 몇 개의 기계식 스위치와 다이오드로 처리할 수 있습니다. 창문이 걸려 움직이지 않는 에러 상황을 피드백 해주어야 하는 시스템의 경우 더 복잡한 솔루션을 사용할 수 밖에 없습니다. 그러나 엔지니어로서의 목표는 항상 동일해야 합니다. 즉, 복잡한 것을 추가하지 말고 문제를 최대한 간단하게 해결하라, 입니다.
하드웨어만으로 문제를 해결할 수 있는 경우라면, MCU 소스 코드를 분석하기 전에 먼저 해당 팀과 함께 하드웨어 문제의 가능성을 검토하십시오. 센서 상태에 대한 폴링을 수행하는 데 간단한 while 루프를 사용하여 문제를 처리할 수 있는 경우라면, 센서 상태를 폴링하기만 하면 됩니다. ISR(Interrupt Service Routine) 코딩을 시작할 필요가 없을 수 있습니다. MCU 기능을 단일 목적으로 사용한다면, 모든 기능을 갖춘 RTOS를 이용할 시 방해가 되는 경우가 많으니 RTOS를 사용하지 마십시오!
실시간 시스템 유형
실시간 동작을 구현하는 방법에는 여러 가지가 있습니다. 다음 섹션에서는 다양한 유형의 실시간 시스템에 대해 설명합니다. 또한 다음 시스템의 조합을 하위 시스템으로 함께 사용할 수도 있습니다. 이러한 서로 다른 서브시스템은 제품 레벨, 보드 레벨 또는 심지어 칩 레벨에서도 발생할 수 있습니다(이 접근방식은 16장 멀티프로세서 및 멀티 코어 시스템에서 다룹니다).
하드웨어
원래 실시간 시스템 하드웨어는 여전히 매우 엄격한 허용 오차 및 빠른 타이밍 요구 사항을 충족합니다. 이러한 하드웨어는 개별적인 디지털 논리회로 소자나 아날로그 소자 또는 프로그램 가능한 논리 소자 또는 ASIC으로 구현 할 수 있습니다. PLD(Programmable Logic Devices), CPLD(Complex Programmable Logic Devices), FPGA(Field Programmable Gate Arrays)는 프로그래밍 가능한 논리 장치 부분의 하드웨어 멤버입니다. 하드웨어 기반 실시간 시스템은 아날로그 필터, 폐쇄 루프 제어 및 간단한 상태 시스템에서부터 복잡한 비디오 코덱에 이르기까지 모든 것을 포함합니다. 절전을 염두에 두고 구현하면, ASIC을 이용하는 것이 MCU 기반 솔루션보다 더 적은 전력을 소비하도록 만들 수 있습니다. 병렬 처리라는 착각을 일으키는 싱글코어 MCU와는 달리 일반적으로 하드웨어는 병렬 처리와 (아주 단순하게 말해서)즉각적인 처리를 수행할 수 있는 장점이 있습니다.
실시간 하드웨어 개발의 단점은 일반적으로 다음과 같습니다.
-
프로그래밍 불가능한 하드웨어 부품의 경직성.
-
소프트웨어 또는 펌웨어 전문가보다 하드웨어 전문가가 많지 않다.
-
전체 기능을 갖춘 프로그램 가능한 하드웨어 장치(예: 대형 FPGA)의 비용.
-
주문 제작인 ASIC를 개발하는 데 드는 높은 비용.
베어메탈(Baremetal) 펌웨어
베어메탈 펌웨어는 기존 커널/스케줄러를 바탕으로 하지 않은 펌웨어입니다. 일부 엔지니어는 이 개념에서 한 걸음 더 나아가 진정한 베어메탈 펌웨어는 기존의 라이브러리(부품 업체가 제공하는 하드웨어 추상화 라이브러리 HAL)까지도 사용하지 않는 것이라 주장하며, 이러한 관점에도 몇 가지 장점이 있습니다. 베어메탈 구현 방식은 사용자 코드가 하드웨어의 모든 측면을 완전히 제어할 수 있다는 장점이 있습니다. 메인 루프 코드 실행이 중단되는 유일한 이유는 인터럽트가 작동되는 경우 뿐입니다. 이 경우 CPU를 제어할 수 있는 유일한 방법은 기존 ISR이 완료되거나 우선 순위가 더 높은 다른 인터럽트가 발생하는 것입니다.
베어메탈 펌웨어 솔루션은 비교적 간단하면서 소수의 작업들로만 이루어 졌거나 단일 작업일 때 탁월한 선택입니다. 펌웨어에 대한 관심을 유지하고 모범적인 예제를 따른다면, ISR 간의 상호 작용이 상대적으로 적기 때문에(일부 경우에는 ISR이 부족하기 때문에) 일반적으로 확정적 성능을 측정하고 보장하기가 쉽습니다. 극한의 과부하 상태인 MCU(또는 매우 제한적인 메모리 용량을 가진MCU)인 경우 베어메탈 펌웨어가 유일한 옵션입니다.
베어메탈 펌웨어는 이벤트를 비동기적으로 처리하면서 점점 정교해지기 때문에 RTOS에서 제공하는 기능과 중복되기 시작합니다. 명심해야 할 중요한 고려 사항은 개발자 본인의 스레드 세이프 시스템을 이용하는 대신, RTOS를 사용하면 RTOS 공급자가 입력한 모든 테스트의 혜택을 자동으로 누릴 수 있다는 것입니다. 또한, 현재 사용 가능한 모든 RTOS는 수 년 전부터 존재해 왔으며, 숨겨진 힘이 있는 코드를 사용할 수 있는 기회를 가지게 됩니다. RTOS를 개발한 사람들은 서로 다른 응용프로그램에 강력하고 유연한 기능을 제공하기 위해 많은 시간을 들여 기능을 조정하고 추가했습니다.
RTOS 기반 펌웨어
MCU에서 스케줄링 커널을 실행하는 펌웨어는 RTOS 기반 펌웨어입니다. 스케줄러와 일부 RTOS 프리미티브의 도입으로, 프로세서를 Task 스스로가 사용하는 것처럼 Task를 작동할 수 있습니다(2장 ‘RTOS Task 이해’에서 자세히 설명). RTOS를 사용하면 시스템이 백그라운드에서 다른 복잡한 작업을 수행하는 동안 가장 중요한 이벤트에 계속 응답할 수 있습니다.
이러한 모든 Task를 실행하는 데는 몇 가지 단점이 있습니다. 데이터를 공유하는 Task 간에 상호 종속성이 발생할 수 있으며, 제대로 처리되지 않으면 Task가 예기치 않게 차단됩니다. 이 문제를 처리하기 위한 조항이 있지만, 코드에 복잡성을 가중시킵니다. 일반적으로 인터럽트가 Task Signaling을 사용하여 인터럽트를 가능한 빨리 처리하고, 가능한 한 많은 프로세스를 Task에 할당합니다. 적절히 처리된다면 이 솔루션은 복잡한 상호 작용이 존재한다는 단점에도 불구하고 복잡한 시스템의 응답성을 유지하는 데 매우 적합합니다. 그러나 잘못 처리된다면, 이러한 설계 방식은 타이밍 지터가 많아지고 시스템의 명확성이 떨어지는 결과를 초래합니다.
RTOS 기반 소프트웨어
MMU(메모리 관리 장치 Memory Management Unit)와 CPU(중앙 처리 장치 Central Processing Unit)를 포함해서, OS에서 실행되는 소프트웨어는 RTOS 기반 소프트웨어로 간주됩니다. 이러한 접근 방식으로 구현되는 프로그램은 매우 복잡할 수 있으며, 다양한 내외부 시스템 간의 많은 상호 작용이 필요합니다. OS를 사용할 때의 이점은 OS와 함께 제공되는 모든 기능(하드웨어와 소프트웨어 모두를 포함하는)을 사용할 수 있다는 점입니다.
하드웨어 측면에서는, 더 많은 CPU 코어를 더 높은 클럭 속도로 실행할 수 있습니다. 사용 가능한 RAM과 메모리가 수 기가바이트에 이를 수 있습니다. 주변 장치 하드웨어를 추가하는 것은 (드라이버가 있는 경우) 카드를 추가하는 것만큼 간단합니다.
소프트웨어 측면에서는, 네트워킹 스택, UI 개발, 파일 처리 등을 위한 오픈 소스 및 업체에서 제공하는 솔루션이 많이 있습니다. 이러한 모든 기능과 옵션 밑바탕에서는 커널이 계속해서 실행되므로 중요한 작업이 무기한으로 차단되는 일은 없습니다(하지만 이는 기존 OS에서는 발생할 수 있습니다). 이 때문에 RTOS 기반 펌웨어와 마찬가지로 결정적인 성능을 얻을 수 있습니다.
'Digital Developer' 카테고리의 다른 글
[ECCS] 코드 길이 (0) | 2020.09.30 |
---|---|
[ECCS] C 언어 버전 (0) | 2020.09.30 |
Hands-On RTOS with Microcontrollers #005 (0) | 2020.09.22 |
Hands-On RTOS with Microcontrollers #004 (0) | 2020.09.20 |
[ECCS] Embedded C Coding Standard (0) | 2020.09.20 |