런타임에 RTOS 객체를 삭제하지 마세요!

RTOS는 애플리케이션에 많은 기능을 제공합니다. 가장 중요한 것은 태스크 관리이지만, 사용 중인 RTOS에 따라 세마포어 및 이벤트 플래그를 사용하여 다른 태스크에 신호를 보내고, 상호 배제 세마포어를 통해 리소스 관리를 제공하고, 메시지 대기열을 통해 메시지를 보내는 등의 작업을 수행하도록 허용함으로써 태스크와 ISR이 공존할 수 있는 기능을 제공합니다. 이러한 서비스는 그림 1과 같이 RTOS 객체로 알려진 데이터 구조에서 작동하는 API로 수행합니다. 사실, 그림 1에서 즉각적으로 드러나지는 않지만, 태스크는 항상 TCB(태스크 제어 블록)로 정의되기 때문에 RTOS 객체이기도 합니다.

Figure 1, RTOS Objects

일부 RTOS에서는 RTOS 객체에 대한 스토리지를 할당해야 하며, 애플리케이션이 이러한 객체를 조작하지 않도록 RTOS API를 통해 이러한 객체를 초기화(즉, 생성)해야 합니다.  다른 RTOS에서는 다시 API를 통해 스토리지를 할당하고 RTOS 객체를 초기화합니다. 두 방법 모두 장단점이 있지만 이에 대한 논의는 이 글의 범위를 벗어납니다. 예를 들어, uC/OS-III 세마포어 서비스를 사용하려면 다음 코드를 작성해야 합니다.

 

OS_SEM  MySem;             // Allocate storage for a semaphore


    :                      // Somewhere in your code …
    :
OSSemCreate(&MySem, …);    // Create (i.e. initialize) the semaphore
    :
    :

 

모든 RTOS객체는 RTOS객체에 작용하는 다른 RTOS 서비스를 호출하기 전에 생성되어야 합니다.

그림 2는 세마포어 RTOS 객체를 애플리케이션에서 사용하는 방법을 보여줍니다. 보이는 바와 같이 태스크 또는 ISR가 세마포어에 신호를 보낼 수 있지만 태스크만 세마포어가 신호를 받을 때까지 기다릴 수 있습니다. 이 예에서는 각각 고유한 목적을 가진 두 개의 분리된 세마포어를 보여줍니다.

 

Figure 2, Using semaphores

 

대부분의 RTOS는 RTOS 객체를 삭제하는 기능을 제공합니다. 객체를 삭제한다는 것은 단순히 객체를 초기화 해제하고 저장 공간을 확보하는 것을 의미합니다. 애플리케이션 코드에 관한 한, RTOS 객체를 더 이상 사용하거나 참조하지 않을 것이라는 데 이견이 없습니다.  그러나 RTOS 객체를 삭제하는 서비스가 제공되더라도 그렇게 하지 않는 것이 좋습니다. 사실, 안전에 중요한 시스템 인증을 받기 위한 많은 요구 사항 중 하나는 객체가 생성된 후에는 삭제가 허용되지 않는다는 것입니다.

"그렇다면 RTOS 개발자는 왜 이러한 API를 제공합니까?"라는 질문이 있을 수 있습니다. 여기에는 몇 가지 이유가 있습니다.

한 가지 이유는 일관성입니다. 객체를 만들 수 있다면 삭제할 수 있어야 합니다. 사실, 어떤 경우에는 애플리케이션이 단지 시스템을 불러올 목적으로 태스크를 생성할 수 있습니다. 일단 불러오면 태스크가 더 이상 필요하지 않으며 자체적으로 삭제됩니다. 그러나 일반적으로 이러한 태스크를 유지하고 가능하면 애플리케이션에서 시스템 모니터 태스크 등으로 사용하는 것이 좋습니다. 비록 시작 태스크의 경우 오버헤드가 거의 영향을 미치지 않을 수 있지만, RTOS 객체의 생성 및 삭제는 특히 태스크와 관련하여 종종 비용이 많이 듭니다 (CPU 사이클).

 

시스템이 MPU(메모리 보호 장치)를 사용하고 MPU가 스택 오버플로 또는 액세스 위반을 감지하면, 일부 하위 시스템을 중단하거나 어쩌면 전체를 중단하는 것 외에 다른 선택이 없을 수 있습니다. 이 경우 RTOS 객체를 삭제하고 재시작할 수 있는지 여부는 오류의 원인이 무엇인지 그리고 이러한 시스템이 재시작 가능한지 여부에 따라 다릅니다. 예를 들어 사용자 인터페이스, 통신, 기타 지원 기능은 재시작할 수 있지만, 제어 시스템에서 오류가 발생하면 재설정과 같은 과감한 작업을 수행하는 대신 ISR, 태스크 및 I/O가 안전한 상태에 있는 제어된 종료를 수행하는 것 외에 선택의 여지가 없을 수 있습니다.  종료 시퀀스에서 RTOS 객체는 장비 손상과 특히 인명 피해를 방지하기 위해 신중하게 설계된 순서로 삭제됩니다.

다른 모든 것과 마찬가지로 특히 RTOS 객체를 삭제하는 데 사용되는 서비스를 포함하여 RTOS 서비스 사용의 의미를 이해해야 합니다.

 

 

저자 소개

본 기사는 RTOS 개발 애플리케이션에 관한 시리즈의 일부입니다.

Jean Labrose는 높은 인지도를 가진 uC/OS-II와 uC/OS-III 커널의 저자이자 Micrium의 설립자로, 임베디드 소프트웨어의 uC/라인의 발전에 적극적으로 관여하고 있습니다.

Jean은 풍부한 경험과 임베디드 시스템 시장에 대한 깊은 이해를 바탕으로 Weston Embedded Solutions의 수석 조언자 및 컨설턴트로 재직하고 있으며, 현재 RTOS 제품의 향후 보다 발전된 제안을 마련하는데 기여하고 있습니다. Weston Embedded Solutions는 Micrium 코드베이스에서 파생된 매우 안정적인 Cesium RTOS 제품군의 지원 및 개발을 전문으로 합니다. 

[email protected].

jean_labrosse.jpg

죄송하지만, 당사 사이트에서는 Internet Explorer를 지원하지 않습니다.보다 편안한 사이트를 위해 Chrome, Edge, Firefox 등과 같은 최신 브라우저를 사용해 주시길 부탁드립니다.