KR101694305B1 - Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치 - Google Patents

Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치 Download PDF

Info

Publication number
KR101694305B1
KR101694305B1 KR1020120039710A KR20120039710A KR101694305B1 KR 101694305 B1 KR101694305 B1 KR 101694305B1 KR 1020120039710 A KR1020120039710 A KR 1020120039710A KR 20120039710 A KR20120039710 A KR 20120039710A KR 101694305 B1 KR101694305 B1 KR 101694305B1
Authority
KR
South Korea
Prior art keywords
partition
arinc
print
source code
port
Prior art date
Application number
KR1020120039710A
Other languages
English (en)
Other versions
KR20130117049A (ko
Inventor
박사천
이화영
김병호
Original Assignee
한국전자통신연구원
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by 한국전자통신연구원 filed Critical 한국전자통신연구원
Priority to KR1020120039710A priority Critical patent/KR101694305B1/ko
Priority to US13/765,891 priority patent/US9032366B2/en
Publication of KR20130117049A publication Critical patent/KR20130117049A/ko
Application granted granted Critical
Publication of KR101694305B1 publication Critical patent/KR101694305B1/ko

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/35Creation or generation of source code model driven
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation or generation of source code
    • G06F8/34Graphical or visual programming

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)
  • Human Computer Interaction (AREA)
  • Aviation & Aerospace Engineering (AREA)

Abstract

본 발명은 항공기 응용 프로그램을 ARINC 653 표준에 따라 작성하는 경우, ARINC 653 설정을 용이하게 하는 설정 방법 및 장치에 관한 것으로, 사용자 인터페이스를 디스플레이하여, ARINC 653 설정 사항을 입력 받고, 상기 입력된 설정 사항에 기초하여 소스 코드의 중간 모델을 생성하고, 상기 생성된 중간 모델에 대한 XML 변환을 통하여 XML 문서를 생성하고, 상기 생성된 XML 문서를 변환하여 ARINC 653 소스 코드 파일을 생성함으로써, ARINC 653 설정을 쉽고 빠르게 이루어 지도록 하여, 소프트웨어 품질을 향상시키고 개발자에게 단순 노동의 업무를 줄여주어 개발 효율을 높일 수 있도록 하는 발명이다.

Description

ARINC 653 규격에 따른 항공 시스템 설정 방법 및 장치{METHOD AND APPRATUS FOR SETTING AERONAUTIC SYSTEM COMPATIBLE WITH THE ARINC 653 STANDARD}
본 발명은 항공기 응용 프로그램을 ARINC 653 표준에 따라 작성하는 경우, ARINC 653 설정을 용이하게 하는 항공 시스템 설정 방법 및 장치에 관한 것으로, 더욱 상세하게는, ARINC 653 설정을 위한 사용자 인터페이스를 통하여 설정 사항을 입력 받는 방법, 설정된 정보가 최종 변환될 소스코드 탬플릿을 참조하는 방법, 그리고 설정 정보로부터 소스코드를 생성하는 방법 및 장치를 통하여 항공 시스템 설정을 용이하게 하는 발명이다.
항공, 원자력 등 높은 안전성이 요구되는 산업 분야에서는 기존의 시스템 아키텍처를 고수하는 경향이 있다. 다만, 이러한 경향은 시스템 관리를 고비용 저효율 구조로 이끌기 때문에, 고성능 프로세서를 사용하는 아키텍처로의 전환이 요구된다. 즉, 고성능 프로세서는 여러 응용 프로그램들이 하나의 프로세서 위에서 동작할 수 있도록 하지만, 이런 환경에서 안전성을 보장하는 것은 매우 어려우므로, 플랫폼 수준에서 안전성을 원천적으로 제공해야 한다.
따라서, 항공 시스템을 운영함에 있어서, ARINC(Aeronautical Radio INC.)는 항공 운항에 있어서 안전성 향상 및 호환성 유지를 위하여, 항공전자 표준을 제정하였다.
특히, ARINC 653은, 실시간 운영체제와 상기 실시간 운영체제 상에서 동작하는 응용 프로그램 간의 인터페이스를 규정한다. 즉, ARINC 653은 항공용 소프트웨어 개발을 위한 규격으로써, 통합 모듈형 항공전자 시스템(Integrated Modular Avionics)에 필요한 실시간 운영체제 API 표준으로, 운영체제와 그 위에서 동작하는 응용 프로그램 간의 인터페이스인 APEX(APplication EXecutive)를 규정한다.
따라서, 표준 API를 통하여, 항공용 소프트웨어 개발에 있어서 개발용 하드웨어에 대한 의존성을 줄이고, 다른 시스템으로 이식성을 확장시킬 수 있으며, 항공용 시스템의 어플리케이션 동시 개발성을 향상시킬 수 있다.
ARINC 653은 통합 모듈 항공전자(IMA, Integrated Modular Avionics)라는 개념과 함께 사용되는데, 이는 기존 연합 시스템(Federated System)이 여러 개의 프로세서를 사용해서 응용 소프트웨어를 동작시켰던 것을 하나의 고성능의 프로세서로 대체하는 플랫폼 개념이다. 연합시스템은 각 기능들이 모두 나뉘어 하나 이상의 프로세서에서 동작하고, 소프트웨어의 재사용이 낮으며, 이식성이 떨어지고, 모듈성이 약하다는 것이 단점이다. IMA는 여러 기능이 하나의 프로세서에서 동작되며, 소프트웨어의 재사용성, 이식성, 모듈성이 높다는 장점이 있다.
다만, ARINC 653 시스템 설정은, 항공용 응용 소프트웨어의 이식성을 높이는 결정적인 역할을 하면서 동시에 잘못된 설정 값은 치명적인 결함으로 이어질 수 있게 되는 위험성이 있게 되는 문제점이 존재한다.
이에 따라서, 본 발명은 상기와 같은 문제점을 해결하기 위하여 제안된 것으로, ARINC 653 설정을 용이하게 하는 설정 방법 및 장치를 제공하는 것을 목적으로 한다.
즉, 본 발명은, ARINC 653 표준을 따라 개발을 수행하는 경우, 시스템 설정을 돕는 설정 사용자 인터페이스, 코드 템플릿, 및 코드를 생성 규칙을 제공하는 설정 방법 및 장치를 제공함으로써, 사용자의 ARINC 653 설정에 있어서 편의성 및 정확성을 향상시킬 수 있도록 하는 ARINC 653 설정 방법 및 장치를 제공하는 것을 목적으로 한다
본 발명의 목적을 달성하기 위하여, 본 발명의 실시 예에 따른 항공 시스템설정 방법은, 사용자 인터페이스를 디스플레이하여, ARINC 653 규격에 따른 설정 사항을 입력 받는 단계, 상기 입력된 설정 사항에 기초하여 소스 코드의 중간 모델을 생성하는 단계, 상기 생성된 중간 모델에 대한 XML 변환을 통하여 XML 문서를 생성하는 단계, 및 상기 생성된 XML 문서를 변환하여 ARINC 653 규격에 따른 소스 코드 파일을 생성하는 단계를 포함한다.
또한, 본 발명의 다른 실시 예에 따른 항공 시스템 설정 장치는, ARINC 653 규격에 따른 설정 사항을 입력 받기 위한 사용자 인터페이스를 디스플레이하는 디스플레이부, 상기 사용자 인터페이스를 통하여 입력된 설정 사항에 기초하여 소스 코드의 중간 모델을 생성하는 중간 모델 생성부, 상기 생성된 상기 생성된 중간 모델에 대한 XML 변환을 통하여 XML 문서를 생성하는 XML 변환부, 및 상기 생성된 XML 문서를 변환하여 ARINC 653 규격에 따른 소스 코드 파일을 생성하는 트랜스레이터를 포함한다.
본 발명에 따른 ARINC 653 규격에 따른 항공 시스템 설정 방법 및 장치를 이용하면, ARINC 653 설정을 쉽고 빠르게 할 수 있으므로, 소프트웨어 품질을 향상시키고 개발자에게 단순 노동의 업무를 줄여주어 개발 효율을 높일 수 있다.
도 1은 본 발명의 실시 예에 따른 ARINC 653 설정 코드 생성에 대한 개념도이다.
도 2는 본 발명의 실시 예에 따른 ARINC 653 설정 코드 생성 방법을 도시한 순서도이다.
도 3은 본 발명의 실시 예에 따른 ARINC 653 XML 스키마 확장 규칙을 도시한 도면이다.
도 4는 본 발명의 실시 예에 따른 추가 요소의 속성 및 타입 정보를 포함하는 표를 도시한 도면이다.
도 5는 본 발명의 실시 예에 따른 모듈 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
도 6은 본 발명의 실시 예에 따른 파티션 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
도 7은 본 발명의 실시 예에 따른 채널 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
도 8은 본 발명의 실시 예에 따른 헬스 모니터 테이블 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
도 9는 본 발명의 실시 예에 따른 ARINC 653 설정 장치의 구성을 도시한 도면이다.
이하에서는 첨부된 도면을 참조하여 본 발명의 여러 가지 실시 예들을 보다 상세히 설명하도록 하겠다. 나아가, 이하의 설명에서 사용되는 구성요소에 대한 접미사 "장치" 및 "모듈"은 단순히 본 명세서 작성의 용이함을 고려하여 부여되는 것으로서, 상기 "장치" 및 "모듈"은 서로 혼용되어 사용될 수 있으며, 하드웨어 또는 소프트웨어로 설계 가능하다.
나아가, 이하 첨부 도면들 및 첨부 도면들에 기재된 내용들을 참조하여 본 발명의 실시 예를 상세하게 설명하지만, 본 발명이 실시 예들에 의해 제한되거나 한정되는 것은 아니다.
본 발명은 실시 예로써, ARINC 653 설정을 위한 사용자 인터페이스, 설정 소스코드 템플릿, 그리고 사용자 인터페이스로부터 소스코드를 얻어내는 코드-생성 규칙을 포함한다.
도 1은 본 발명의 실시 예에 따른 ARINC 653 설정 코드 생성에 대한 개념도이고, 도 2는 상기 ARINC 653 설정 코드 생성의 순서를 도시한 순서도이다.
실시 예에 따라, 설정 사용자 인터페이스(101)를 통하여 ARINC 653 설정 값들에 대한 정보를 입력 받으면(S101), 우선 중간 모델(102)을 생성하여 메모리에 저장한다(S102). 다음으로, ARINC 653 XML-Schema 표준에 기초하여 XML 변환을 수행한 후, XML 문서(103)를 생성한다(S103). 다음으로, 트랜스레이터(104)를 통하여, 상기 XML 파일로부터 소스코드들(105, 106, 107,…)을 생성할 수 있다(S104).
도 3은 본 발명의 실시 예에 따른 ARINC 653 XML-스키마(Schema) 확장 규칙을 도시한 도면이다.
실시 예에 따라, 본 발명에서는 항공용 소프트웨어 작성시 공유된 입출력(Shared_IO) 기능 설정을 가능하게 하기 위해서 도 2에 도시된 바와 같이 ARINC 653 XML-Schema 표준을 확장할 수 있다. ShareIO_List 요소는 한 개 이상의 SharedIO 요소를 가지며, SharedIO는 자신의 이름(Name)과 물리적 주소(PhysicalAddress) 및 크기(Size)를 속성으로 갖는다. 또한 파티션 아이디(PartitionID)와 접근(Access)을 속성으로 갖는 한 개 이상의 권한(Authorities) 요소를 포함한다.
도 4는 본 발명의 실시 예에 따른 추가 요소(401)의 속성(402) 및 타입(403) 정보를 포함하는 표를 도시한 도면이다. 즉, 도 4는, 스키마 확장을 위해 추가된 요소들이 갖는 속성들에 대한 타입을 정의한 것이다.
도 2의 제1 코드 문단(301) 및 제2 코드 문단(302)가 본 발명의 실시 예에 따라 기존의 ARINC 653 XML-Schema 표준에 대하여 새롭게 정의되어 확장되는 부분이고, 이외의 부분은 상기 확장된 코드의 삽입 위치를 나타내기 한 원본 ARINC 653 XML-Schema 표준의 코드에 해당한다.
이하 도 5 내지 도 8은, 본 발명의 실시 예에 따른 ARINC 653 설정을 위한 사용자 인터페이스를 도시한 도면이다. 상기 사용자 인터페이스들은, 기존의 ARINC 653 표준과 함께 확장된 공유된 입출력(SharedIO) 요소에 대한 정보도 입력 받을 수 있다. 또한, 상기 사용자 인터페이스들은 마스터-슬레이브(Master-Slave) 개념을 기반으로 한다.
도 5는 본 발명의 실시 예에 따른 모듈 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
실시 예에 따라, 설정 메뉴에서, 사용자가 모듈 설정 항목(501)을 선택하면, 모듈 특성 정보를 입력 받을 수 있는 메뉴 항목(502), 모듈 스케줄링 정보를 입력 받을 수 있는 메뉴 항목(503), 및 모듈의 공유된 입출력 요소에 대한 정보를 입력 받을 수 있는 메뉴 항목(504)을 포함하는 설정 사용자 인터페이스가 디스플레이될 수 있다.
상기 모듈 특성 정보를 입력 받을 수 있는 메뉴 항목(502)은, 모듈의 이름, 모듈의 버전, 및 모듈의 아이디에 대한 정보를 입력 받을 수 있다.
또한, 상기 모듈 스케줄링 정보를 입력 받을 수 있는 메뉴 항목(503)은, 주요 프레임에 대한 정보를 입력 받을 수 있고, 상기 모듈의 공유된 입출력 요소에 대한 정보를 입력 받을 수 있는 메뉴 항목(504)은, 각 공유된 입출력 요소의 이름, 물리 주소, 사이즈 정보를 입력 받을 수 있다.
도 6은 본 발명의 실시 예에 따른 파티션 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
실시 예에 따라, 설정 메뉴에서, 사용자가 파티션 설정 항목(601)을 선택하면, 파티션 특성 정보를 입력 받을 수 있는 메뉴 항목(602), 샘플링 포트(Sampling Port) 정보를 입력 받을 수 있는 메뉴 항목(603), 큐잉 포트(Queuing Port) 정보를 입력 받을 수 있는 메뉴 항목(604), 메모리 요구(Memory Requirement) 정보를 입력 받을 수 있는 메뉴 항목(605), 프로세스(Process) 정보를 입력 받을 수 있는 메뉴 항목(606), 스케줄링 정보를 입력 받을 수 있는 메뉴 항목(607), 및 공유된 입출력 요소에 대한 정보를 입력 받을 수 있는 메뉴 항목(608)을 포함하는 설정 사용자 인터페이스가 디스플레이될 수 있다.
또한, 실시 예에 따라, 파티션 특성 정보를 입력 받을 수 있는 메뉴 항목(602)은 파티션의 아이디(id), 이름(Name) 임계(Critical), 시스파티션(SysPartition), 엔트리포인트(EntryPoint)에 대한 정보를 입력 받을 수 있다.
샘플링 포트(Sampling Port) 정보를 입력 받을 수 있는 메뉴 항목(603)은, 이름(Name), 최대 메시지 사이즈(MaxMessageSize), 디렉션(Direction), 및 리프레시 레이트 시간(RefreshRateSecond)에 대한 정보를 입력 받을 수 있다.
큐잉 포트(Queuing Port) 정보를 입력 받을 수 있는 메뉴 항목(604)은, 이름(Name), 최대 메시지 사이즈(MaxMessageSize), 디렉션(Direction), 최대 메시지 개수(MaxNbMessage)에 대한 정보를 입력 받을 수 있다.
메모리 요구(Memory Requirement) 정보를 입력 받을 수 있는 메뉴 항목(605)은, 이름(Name), 타입(Type), 디렉션(Direction), 사이즈(Size), 물리주소(PhysicalAddress), 및 액세스(Access)에 대한 정보를 입력 받을 수 있다.
프로세스(Process) 정보를 입력 받을 수 있는 메뉴 항목(606)은, 이름(Name), 및 스택 사이즈(StackSize)에 대한 정보를 입력 받을 수 있다.
스케줄링 정보를 입력 받을 수 있는 메뉴 항목(607)은, 아이디(ID), 윈도우 스타트(Window Start), 윈도우 지속(Window Duration), 및 파티션 시작(Part.PreiodStart)에 대한 정보를 입력 받을 수 있다.
공유된 입출력 요소에 대한 정보를 입력 받을 수 있는 메뉴 항목(608)은, 이름(Name) 및 액세스(Access)에 대한 정보를 입력 받을 수 있다.
도 7은 본 발명의 실시 예에 따른 채널 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
실시 예에 따라, 설정 메뉴에서, 사용자가 채널 설정 항목(701)을 선택하면, 채널 특성 정보를 입력 받을 수 있는 메뉴 항목(702), 소스(Source) 정보를 입력 받을 수 있는 메뉴 항목(703), 및 데스티네이션(Destination)에 대한 정보를 입력 받을 수 있는 메뉴 항목(704)을 포함하는 설정 사용자 인터페이스가 디스플레이될 수 있다.
또한, 실시 예에 따라, 상기 채널 특성 정보를 입력 받을 수 있는 메뉴 항목(702)은, 채널의 아이디 및 채널의 이름에 대한 정보를 입력 받을 수 있다.
또한, 상기 소스 정보를 입력 받을 수 있는 메뉴 항목(703)은, 스탠다드 파티션(Standard Partition)인지, 수도 파티션(Pseudo Partition)인지 여부를 선택 받을 수 있는 선택항목, 포트 이름(PortName), 파티션 아이디(PartitionID), 파티션 이름(PartitionName), 물리주소(PhysicalAddress), 이름(Name), 및 프로시져(Procedure)에 대한 정보를 입력 받을 수 있다.
또한, 데스티네이션(Destination)에 대한 정보를 입력 받을 수 있는 메뉴 항목(704)은, 스탠다드 파티션(Standard Partition)인지, 수도 파티션(Pseudo Partition)인지 여부를 선택 받을 수 있는 선택항목, 포트 이름(PortName), 파티션 아이디(PartitionID), 파티션 이름(PartitionName), 물리주소(PhysicalAddress), 이름(Name), 및 프로시져(Procedure)에 대한 정보를 입력 받을 수 있다.
도 8은 본 발명의 실시 예에 따른 헬스 모니터 테이블 설정 정보를 입력 받는 사용자 인터페이스를 도시한 도면이다.
실시 예에 따라, 설정 메뉴에서, 사용자가 헬스 모니터 설정 항목(801)을 선택하면, 시스템 헬스 모니터 설정 페이지(802), 모듈 헬스 모니터 설정 페이지(803), 및 파티션 헬스 모니터 설정 페이지(804)를 포함하는 설정 사용자 인터페이스가 디스플레이될 수 있다.
각 페이지들은, 헬스 모니터 설정 사항을 입력 받기 위한 메뉴를 포함할 수 있다.
도 9는 본 발명의 실시 예에 따른 ARINC 653 설정 장치의 구성을 도시한 도면이다.
실시 예에 따라, ARINC 653 설정 장치는, 입력 인터페이스부(902)를 통하여 ARINC 653 설정 사항을 입력 받기 위한 사용자 인터페이스를 디스플레이하는 디스플레이부(901), 상기 사용자 인터페이스를 통하여 입력된 설정 사항에 기초하여 소스 코드의 중간 모델을 생성하는 중간 모델 생성부(903), 상기 생성된 상기 생성된 중간 모델에 대한 XML 변환을 통하여 XML 문서를 생성하는 XML 변환부(904), 및 상기 생성된 XML 문서를 변환하여 ARINC 653 소스 코드 파일을 생성하는 트랜스레이터(905)를 포함할 수 있다. 또한 상기 각 부들은 제어부(906)를 통하여 제어될 수 있다.
또한, 디스플레이부(901)는, 모듈 설정 정보, 파티션 설정 정보, 채널 설정 정보, 및 헬스 모니터 테이블 설정 정보 중 적어도 하나 이상의 설정 정보를 입력 받기 위한 메뉴를 포함하는 사용자 인터페이스를 디스플레이할 수 있다.
또한, XML 변환부(904)는, 공유된 입출력(Shared IO) 기능 설정을 가능하게 하기 위한 확장된 ARINC 653 XML-스키마(Schema)표준을 이용할 수 있다.
또한, 트랜스레이터(905)는, 기 설정된 소스 코드 템플릿에 대응되는 형식으로 상기 ARINC 653 소스 코드 파일을 생성할 수 있고, 기 설정된 소스 코드 변환 규칙에 기초하여, 상기 기 설정된 소스 코드 템플릿에 대응되는 형식으로 상기 ARINC 653 소스 코드 파일을 생성할 수 있다.
상기 본 발명의 실시 예에 따른, 소스코드 템플릿 및 코드-생성 규칙은 이하에서 상세히 설명한다.
즉, 이하에서는, 소스코드 템플릿을 간단한 설명과 함께 정의하고, 설정 값을 저장한 XML 파일로부터 템플릿에 맞는 소스코드로 변환하는 규칙을 설명한다. 각 규칙들은 XML 파일이 주어졌다는 가정하에 설명한다.
또한, 이하에서 <> 기호는 XML 태그를 나타내는 기호이고, 여기서의 의미는 입력된 XML 파일에서 해당 태그들의 집합을 나타낸다.
즉, 다음 규칙 설명에서 사용된 <Partition>은 입력된 XML 파일에서 선언된 모든 Partition 태그들의 집합을 뜻한다. 만일 p ∈ <Partition> 이라고 했으면, p는 Partition 태그 중 하나를 의미한다. 그리고 p.PartitionIdentifier 이라하면, 태그 p 에 속한 PartitionIdentifier 속성의 값을 의미한다. 그리고 ||는 집합의 수를 나타내는 기호로 사용한다. 즉, |<Partition>|이라고 쓰면, 주어진 XML 파일에 존재하는 모든 <Partition> 태그의 수를 의미한다. 또한 p.<Process> 라고 쓰면, p 파티션에 속한 프로세스 태그들의 집합을 나타낸다. 앞에 접두사 없이 <Process>라고 쓰면 XML 파일에 있는 모든 Process 태그들의 집합을 의미하게 된다. 변환 규칙을 정의할 때는 print, if 등의 일반 고급언어에서 쓰이는 예약어 및 배열 등의 데이터형을 사용했다. 특히for each는 집합의 모든 원소에 대해서 적용하는 것을 의미하고, some은 집합의 임의의 원소에 대해서 적용하는 것을 의미한다. 따라서 원소가 하나인 집합에 some구문을 적용하면 해당 원소를 지칭하게 된다. 즉, for each p ∈ <Partition> {…} 라고 작성했으면, Partition 태그 집합의 각 원소 p에 대해서 {}안의 처리 과정을 적용한다는 뜻이고, some s ∈ <Source>{…} 라고 쓰면, Source 태그의 임의의 원소 s에 대해서 {}안의 처리 과정을 적용한다는 뜻이다. 여기서 <Source>는 각 Channel 태그 당 오직 한번만 나타나기 때문에 s는 유일한 값이 된다. print문에 사용된 콤마(,)는 스트링 결합을 의미한다. 함수를 정의하기 위해서 func function_name (par1, …, parN){…} 의 형태를 사용한다. 일반적인 고급 언어와 같이 return 구문으로 리턴 값 반환을 정의한다. -- 기호는 주석을 의미한다.
첫째로, Kernel_Conf.h파일에 포함된 구성들에 대하여 설명하면, 이하와 같다.
(1) NEEDS_PARTITIONS
파티셔닝 서비스가 필요하다는 것을 식별하는 매크로이며, 파티셔닝 서비스를 위한 설정 매크로와 변수를 정의한다는 의미이다.
[변환규칙]
print “#define NEEDS_PARTITIONS 1”
(2) NEEDS_SCHED
스케줄러가 필요하다는 매크로이다.
[변환규칙]
print “#define NEEDS_SCHED 1”
(3) NEEDS_IO
입출력 서비스가 반드시 활성화 되어야 하고, 그래서 몇몇 파티션들이 i/o를 수행하도록 할 것이라는 매크로이다.
[변환규칙]
#define NEEDS_IO 1
(4) NEEDS_PROTS_SAMPLING
파티션 간 통신을 위한 샘플링 포트 서비스가 포함됨을 의미한다.
[변환규칙]
if (|<Sampling_Port>| > 0){
print “#define NEEDS_PROTS_SAMPLING 1”
}
(5) NEEDS_PROTS_QUEUEING
파티션 간 통신을 위한 큐잉 포트 서비스가 포함됨을 의미한다.
[변환규칙]
if (|<Queueing_Port>| > 0){
print “#define NEEDS_PROTS_QUEUEING 1”
}
(6) CONFIG_NB_THREADS
시스템의 스레드(thread) 수를 명세한다. 커널(Kernel)에서 얼마나 많은 스레드들이 처리될 수 있는지 나타낸다. 또한, 상기 스레드 수는, 반드시 시스템 스레드 수에 '2'를 더한 값으로 계산된다. 또한, 본 매크로에서는 커널 스레드와 유휴(idle) 스레드, 두 개의 스레드가 추가된다. 여기서 스레드는 ARINC653 파티션의 프로세스를 의미한다.
[변환규칙]
print “#define CONFIG_NB_THREADS ”, |<Process>| + 2
(7) CONFIG_NB_PARTITIONS
커널에 의해서 다루어지는 파티션 수를 명세 하는 매크로를 의미한다.
[변환규칙]
print “#define CONFIG_NB_PARTITIONS ”, |<Partition>|
(8) CONFIG_PARTITIONS_NTHREADS
얼마나 많은 수의 스레드들이 파티션들에 상주할 것인지 명세하는 매크로를 의미한다. 본 매크로는, 배열로써 배열의 인덱스는 각각의 파티션을 의미하고 각 값은 해당 파티션의 스레드의 수를 의미한다. 이하의 실시 예는 각각 2,2,2,4개의 스레드를 가지는 4개의 파티션을 나타내는 코드이다.
#define CONFIG_PARTITIONS_NTHREADS {2, 2, 2, 4}
[변환규칙]
print “#define CONFIG_PARTITIONS_NTHREADS {”
count = 0
for each p ∈ <Partition> {
print |<Process>|
count = count + 1
if (count < |<Partition>|) { print “, ” }
}
print “}”
(9) CONFIG_SCHEDULERING_MAJOR_FRAME
주 프레임(major frame)을 명세 한다. 주 프레임은 파티션 간의 포트들이 출력(flush)될 때의 시간이다. 이것은 스케줄링 사이클의 마침에 해당한다. 이하 스케줄링 설정 예는 500ms의 슬롯이 4개 선언되었다. 첫 번째 슬롯에는 첫 번째 파티션, 두 번째는 두 번째, 이런 식으로 순서대로 할당된다. 주 프레임은 2s이다.
#define CONFIG_PARTITIONS_NTHREADS {2, 2, 2, 4}
[변환규칙]
for each ms ∈ <Module_Schedule>{
mfs = ms.MajorFrameSeconds
print “#define CONFIG_SCHEDULERING_MAJOR_FRAME ”, mfs
}
(10) CONFIG_SCHEDULERING_NBSLOTS
파티션들의 실행을 위해 할당된 시간 프레임의 수를 명세할 수 있다.
#define CONFIG_SCHEDULERING_NBSLOTS 4
[변환규칙]
number = |<Window_Schedule>|
print “#define CONFIG_SCHEDULERING_NBSLOTS ”, number
(11) CONFIG_SCHEDULERING_SLOTS
[설명] 각 슬롯들의 크기를 명세(milliseconds)할 수 있다.
#define CONFIG_SCHEDULERING_SLOTS {500, 500, 500, 500}
[변환규칙]
print “#define CONFIG_SCHEDULERING_SLOTS {”
count = 0
for each w ∈ <Window_Schedule> {
print w.WindowDurationSecond * 1000
count = count + 1
if (count < |<Window_Schedule>|) { print “, ” }
}
print “}”
(12) CONFIG_SCHEDULERING_SLOTS_ALLOCATION
어떤 슬롯에 어떤 파티션이 할당되었는지 명세하는 매크로이며, 배열로 선언될 수 있다. 상기 배열의 인덱스는 파티션을, 값은 슬롯을 나타낼 수 있다.
#define CONFIG_SCHEDULERING_SLOTS_ALLOCATION {0, 1, 2, 3}
[변환규칙]
print “#define CONFIG_SCHEDULERING_SLOTS_ALLOCATION {”
count = 0
for each ps ∈ <Partition_Schedule> {
for each ps.<Window_Schedule> {
print ps.PartitionIdentifier
count = count + 1
if (count < |<Window_Schedule>|) { print “, ” }
}
}
print “}”
(13) CONFIG_PARTITIONS_SIZE
각 파티션의 크기를 바이트 단위의 배열로 명세 하는 매크로를 의미한다. 상기 배열의 인덱스는 파티션을 나타내고 값은 파티션의 크기를 나타낼 수 있다. 아래의 예는 4개의 파티션 중에 앞의 세 개는 80000 바이트의 크기를 갖고, 마지막 파티션은 85000 바이트의 크기를 갖는 것을 의미한다.
#define CONFIG_PARTITIONS_SIZE {80000,80000,80000,85000}
[변환규칙]
print “#define CONFIG_PARTITIONS_SIZE {”
count = 0
for each p ∈ <Partition> {
size = 0
for each pm ∈ <Partition_Memory> {
if(p.PartitionName == pm.PartitionName){
for each mr ∈ pm.<Memory_Requirement> {
size = size + mr.SizeBytes
}
}
print size
count = count + 1
if (count < |<Partition>|) { print “, ” }
}
print “}”
(14) CONFIG_LOCAL_NODE
현재 노드의 식별자를 명세 하는 매크로를 의미한다.
[변환규칙]
print “#define CONFIG_LOCAL_NODE 0”
(15) CONFIG_NB_GLOBAL_PORTS
분산 시스템에서의 전역 포트 수를 명세 하는 매크로를 의미한다.
[변환규칙]
number = |<Queueing_Port>| + |<Sampling_Port>|
print “#define CONFIG_NB_GLOBAL_PORTS”, number
(16) CONFIG_NB_PORTS
현재 노드의 지역 포트의 수를 명세 하는 매크로를 의미한다.
[변환규칙]
number = |<Queueing_Port>| + |<Sampling_Port>|
print “#define CONFIG_NB_PORTS”, number
(17) port_local_identifier_t
지역 포트들의 식별자를 나타내는 'enum'으로 선언된 타입을 의미한다. 상기 타입에는 항상 'invalid_identifier'라는 invalid식별자를 추가해야 한다. 이 'enum' 선언은 현재 노드의 지역 포트들을 명세하고 결국 각 노드의 통신 요구사항에 의존한다
typedef enum { node1_partition_secret_outgoing = 0, node1_partition_topsecret_outgoing = 1, node1_partition_unclassified_outgoing = 2, invalid_local_port = 3} port_local_indentitier_t;
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
pID = -1
print “typedef enum {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
pID = pID + 1
print “p”, p.PartitionIdentifier,”_”, qp.PortName,“ = ”, pID, “, ”
}
for each sp ∈ p.<Sampling_Port> {
pID = pID + 1
print “p”, p.PartitionIdentifier,”_”, sp.PortName,“ = ”, pID, “, ”
}
}
pID = pID + 1;
print “invalid_local_port = ”, pID
print “} port_local_identifier_t;”
} else {
ERROR! --에러발생 (포트 없음)
}
(18) port_identifier_t
전역 포트 식별자는 'enum' 타입으로 명세 된다. 상기 enum 선언은 반드시 모든 노드에서 동일해야 한다.
typedef enum { node1_partition_secret_outgoing_global = 0, node1_partition_topsecret_outgoing_global = 1, node1_partition_unclassified_outgoing_global = 2, node2_partition_secret_incoming_global = 3, node2_partition_topsecret_incoming_global = 4, node2_partition_unclassified_incoming_global = 5,} port_indentitier_t;
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
pID = -1
print “typedef enum {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
pID = pID + 1
print “p”, p.PartitionIdentifier,”_”, qp.PortName,“_global = ”, pID
if (max > pID+1){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
pID = pID + 1
print “p”, p.PartitionIdentifier,”_”, sp.PortName,“_global = ”, pID
if (max > pID+1){ print “, ” }
}
}
print “} port_identifier_t;”
} else {
ERROR! --에러발생 (포트 없음)
}
(19) node_identifier_t
노드 식별자를 명세하는 타입을 의미한다. 상기 타입은 각 노드의 값을 포함한다. 'CONFIG_LOCAL_NODE'의 값은 반드시 이 타입 내에 존재하여야 한다. 이 enum 선언은 모든 노드에서 동일하다. 그에 대한 예는 이하와 같다.
typedef enum { node1 = 0, node2 = 1} node_indentitier_t;
[변환규칙]
print “typedef enum {”
print “ node1 = 0”
print “} node_identifier_t;”
(20) CONFIG_NB_SHARED_IO
공유된 입출력(SharedIO)의 개수를 의미하는 매크로이다. 커널 소스 파일에는 설정된 SharedIO의 정보가 표현된다.
[변환규칙]
number = <SharedIO> 태그의 수
print “#define CONFIG_NB_SHARED_IO ”, number
(21) table_t 선언
[변환규칙]
print “table_t system_hm_table;”
print “table_t module_hm_table;”
print “table_t partition_hm_table[CONFIG_NB_PARTITIONS];”
둘째로, Kernel_Conf.c파일에 포함된 구성들에 대하여 설명하면, 이하와 같다.
(1) ports_identifiers
각 지역 포트에 대한 전역 포트을 명세 하는 배열이다. 이하 실시 예에서 현재 노드에 대한 첫 번째 지역 포트는 'node1_partition_secret_outgoing' 전역 포트이다
unit8_t ports_identifiers[CONFIG_NB_PORTS] = { node1_partition_secret_outgoing, node1_partition_topsecret_outgoing, node1_partition_unclassified_outgoing};
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
count = 0
print “unit8_t ports_identifiers[CONFIG_NB_PORTS] = {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
count = count + 1
print “p”, p.PartitionIdentifier, ”_”, qp.PortName
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
count = count + 1
print “p”, p.PartitionIdentifier,”_”, sp.PortName
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(2) prots_nb_destinations
각 지역 포트에 대한 목적지의 수를 명세 하는 배열이다. 하나의 송신 포트에 대해서 여러 개의 수신이 가능하기 때문에, 얼마나 많은 포트가 데이터를 받아야 하는지 명세 한다.
[변환규칙]
func getDestNumber(pName){
for each c ∈ <Channel> {
some s ∈ c.<Source>{
if(|s.<Standard_Partition>| != 0){
some spa ∈ s.<Standard_Partition>{
if(pName == spa.PortName ){
return |c.<Destination>|
}
}
}
}
}
return -1
}
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
print “unit8_t ports_nb_destinations[CONFIG_NB_PORTS] = {”
count = 0
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
if (qp.Direction == “DESTINATION”) {
print 0
}else{
number_ds = getDestNumber(qp.PortName)
if(number_ds < 1) {
ERROR! -- 포트 및 채널 정의 오류
}else{
print number_ds
}
}
count = count + 1
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
if (sp.Direction == “DESTINATION”) {
print 0
}else{
number_ds = getDestNumber(sp.PortName)
if(number_ds < 1) {
ERROR! -- 포트 및 채널 정의 오류
}else{
print number_ds
}
}
count = count + 1
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(3) ports_destinations
지역 포트의 라우팅 정책을 명세 하는 배열이다. 이 배열의 값들은 다른 배열을 가리키는 포인터인데, 포인터에 의해 연결된 배열은 수신하는 전역 포트의 값들을 포함한다. 아래의 예제를 보면, 첫 번째 지역 포트는 하나의 수신자를 갖는다. 그 수신자 리스트는 'ports_destinations' 배열의 첫 번째 원소로 명세 된다. 그 원소는 'node1_partition_secret_outgoing_deployment_destinations' 배열이다. 이런 방식으로 수신 포트 식별자가 'node2_partition_secert_incoming_ global'인 것을 알 수 있다.
uint8_t node1_partition_secret_outgoing_deployment_destinations[1] = {node2_partition_secret_incoming_global};
uint8_t node1_partition_topsecret_outgoing_deployment_destinations[1] =
{node2_partition_topsecret_incoming_global};
uint8_t node1_partition_unclassified_outgoing_deployment_destinations[1] ={node2_partition_unclassified_incoming_global};
uint8_t ports_nb_destinations[CONFIG_NB_PORTS] = {1,1,1};
uint8_t* ports_destinations[CONFIG_NB_PORTS] ={node1_partition_secret_outgoing_deployment_destinations,node1_partition_topsecret_outgoing_deployment_destinations,node1_partition_unclassified_outgoing_deployment_destinations};
[변환규칙]
-- 배열 포인터 ports_destinations 생성
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
print “uint8_t* ports_destinations[CONFIG_NB_PORTS] = {”
count = 0
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
if (qp.Direction == “DESTINATION”) {
print “NULL”
}else{
print “p”, p.PartitionIdentifier, “_”, qp.PortName, “_destinations”
}
count = count + 1
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
if (sp.Direction == “DESTINATION”) {
print “NULL”
}else{
print “p”, p.PartitionIdentifier, “_”, sp.PortName, “_destinations”
}
count = count + 1
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
func findDestination(pName){
for each c ∈ <Channel> {
some s ∈ c.<Source>{
if(|s.<Standard_Partition>| != 0){
some spa ∈ s.<Standard_Partition>{
if(pName == spa.PortName ){
return c.<Destination>
}
}
}
}
}
return {}
}
-- ports_destinations에 속한 배열 생성
if (max > 0){
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
flag = 0
if (qp.Direction == “SOURCE”) {
print “unit8_t p”, p.PartitionIdentifier, “_”, qp.PortName, “_destinations[”, getDestNumber(qp.PortName), “] = {”
foreach dest ∈ findDestination(qp.PortName) {
foreach spa ∈ dest.<Standard_Partition> {
if(flag = 1) { print “, ”}
print “p”, p.PartitionIdentifier, “_”, spa.PortName
flag = 1
}
}
print “};”
}
}
for each sp ∈ p.<Sampling_Port> {
flag = 0
if (sp.Direction == “SOURCE”) {
print “unit8_t p”, p.PartitionIdentifier, “_”, sp.PortName, “_destinations[”, getDestNumber(sp.PortName), “] = {”
foreach dest ∈ findDestination(sp.PortName) {
foreach spa ∈ dest.<Standard_Partition> {
if(flag = 1) { print “, ” }
print “p”, p.PartitionIdentifier, “_”, spa.PortName
flag = 1
}
}
print “};”
}
}
}
} else {
ERROR! --에러발생 (포트 없음)
}
(4) local_ports_to_global_ports
각 지역과 전역 포트 간의 연결(변환)이 수행되는 배열이다. 각각의 지역 포트 식별자에 대해서 연관된 전역 포트 값이 명세 된다. 아래의 예제에서 첫 번째 지역 포트는 전역 포트 식별자 'node1_partition_secret_outgoing _global' 에 해당한다.
uint8_t local_ports_to_global_ports[CONFIG_NB_PORTS] ={node1_partition_secret_outgoing_global, node1_partition_topsecret_outgoing_global, node1_partition_unclassified_outgoing_global};
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
count = 0
print “uint8_t global_ports_to_local_ports[CONFIG_NB_PORTS] = {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
count = count + 1
print “p”, p.PartitionIdentifier, ”_”, qp.PortName, “_global”
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
count = count + 1
print “p”, p.PartitionIdentifier, ”_”, sp.PortName, “_global”
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(5) global_ports_to_local_ports
전역포트 값을 지역포트로 변환할 필요가 있는 경우, 모든 노드 상에서 이 배열의 정의는 각각 상이하므로, 만일 전역 포트가 현재 노드에 위치하지 않는다면, invalid_port 값을 명세 한다. 이하 실시 예에서 마지막 세 개의 포트들이 현재 노드에 위치하지 않았음을 알 수 있다.
uint8_t global_ports_to_local_ports[CONFIG_NB_GLOBAL_PORTS] = {node1_partition_secret_outgoing, node1_partition_topsecret_outgoing,node1_partition_unclassified_outgoing, invalid_local_port, invalid_local_port, invalid_local_port};
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
count = 0
print “uint8_t local_ports_to_global_ports[CONFIG_NB_PORTS] = {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
count = count + 1
print “p”, p.PartitionIdentifier, ”_”, qp.PortName
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
count = count + 1
print “p”, p.PartitionIdentifier, ”_”, sp.PortName
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(6) ports_nodes
각 전역 포트의 위치는 본 배열로 명세 된다. 본 배열은 각 포트에 대해서 노드 식별자를 연결시킨다. 아래의 예에서 세 개의 전역 포트가 노드 0에 위치하고 나머지 세 개의 전역 포트가 노드 1에 위치함을 알 수 있다.
uint8_t ports_nodes[CONFIG_NB_GLOBAL_PORTS] = {0,0,0,1,1,1};
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
count = 0
print “uint8_t ports_nodes[CONFIG_NB_PORTS] = {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
count = count + 1
print 0
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
count = count + 1
print 0
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(7) ports_kind
커널은 반드시 각 포트의 종류(queuing of sampling)를 알고 있어야 한다. 'pok_ports_kind' 배열을 통해서 그 요구사항을 기술한다. 아래의 예는 세 개의 지역 포트가 모두 샘플링 포트 타입으로 명세된 것이다.
port_kind_t ports_kind[CONFIG_NB_PORTS] = {PORT_KIND_SAMPLING, PORT_KIND_SAMPLING, PORT_KIND_SAMPLING};
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
count = 0
print “uint8_t ports_kind[CONFIG_NB_PORTS] = {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
count = count + 1
print “PORT_KIND_QUEUEING”
if (max > count) { print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
count = count + 1
print “PORT_KIND_SAMPLING”
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(8) ports_names
개발자가 포트 개체화를 호출하면, 포트 이름을 명세 할 수 있다. 이러한 이유로 커널은 반드시 각 포트에 대한 이름을 알고 있어야 한다. 이러한 정보는 porots_names 선언에 의해 제공된다. 본 배열은 각 지역 포트들의 이름을 포함한다. 아래의 예는 포트의 이름을 명세한 예이다.
port_kind_t ports_names[CONFIG_NB_PORTS] = {“node1_partition_secret_outgoing”,“node1_partition_topsecret_outgoing”,“node1_partition_unclassified_outgoing”};
[변환규칙]
max = |<Queueing_Port>| + |<Sampling_Port>|
if (max > 0){
count = 0
print “char* ports_names[CONFIG_NB_PORTS] = {”
for each p ∈ <Partition> {
for each qp ∈ p.<Queueing_Port> {
count = count + 1
print “‘”’p”, p.PartitionIdentifier, ”_”, qp.PortName, “‘”’”
if (max > count){ print “, ” }
}
for each sp ∈ p.<Sampling_Port> {
count = count + 1
print “‘”’p”, p.PartitionIdentifier, ”_”, sp.PortName, “‘”’”
if (max > count){ print “, ” }
}
}
print “};”
} else {
ERROR! --에러발생 (포트 없음)
}
(9) ports_nb_ports_by_partition
파티션 간 통신에 사용되는 포트들은 파티션 전용으로 사용된다. 결국, 어떤 파티션이 어떤 포트를 읽기/쓰기 할 수 있는지 명세해야 한다. 두 개의 배열이 필요하다. 이 변수는 각 파티션에 대해서 할당된 포트 수를 식별하는 배열이다.
[변환규칙]
-- 파티션 별 포트 수
print “uint8_t ports_nb_ports_by_partition[CONFIG_NB_PARTITIONS] = {”
count = 0;
for each p ∈ <Partition> {
count = count + 1
print |p.<Queueing_Port>| + |p.<Sampling_Port>|
if (|<Partition>| > count) { print “, ” }
}
print “};”
-- 파티션 별 포트 이름
for each p ∈ <Partition> {
partNum = |p.<Queueing_Port>| + |p.<Sampling_Port>|
print “uint8_t p”, p.PartitionIdentifier, “_partport[”, partNum, “] = {”
flag = 0
for each qp ∈ p.<Queueing_Port> {
if(flag == 1) { print “, ” }
print “p”, p.PartitionIdentifier, ”_”, qp.PortName
flag = 1
}
flag = 0
for each sp ∈ p.<Sampling_Port> {
if(flag == 1) { print “, ” }
print “p”, p.PartitionIdentifier, ”_”, sp.PortName
flag = 1
}
print “};”
}
(10) ports_by_partition
본 변수는 해당 파티션에 허용된 전역 포트 식별자를 포함하는 배열이다. 아래의 예에서 첫 번째 파티션은 식별자가 node1_partition_secret_outgoing인 하나의 포트를 가진다. 파티션의 개수는 3개이고, 각각 하나씩의 전역 포트를 갖는 형상이다.
uint8_t node1_partition_secret_partport[1] = {node1_partition_secret_outgoing};
uint8_t node1_partition_topsecret_partport[1] = {node1_partition_topsecret_outgoing};
uint8_t node1_partition_unclassified_partport[1] = {node1_partition_unclassified_outgoing};
uint8_t ports_nb_ports_by_partition[CONFIG_NB_PARTITIONS] = {1,1,1};
uint8_t* ports_by_partition[CONFIG_NB_PARTITIONS] ={node1_partition_secret_partport,node1_partition_topsecret_partport,node1_partition_unclassified_partport};
[변환규칙]
print “uint8_t* ports_by_partition[CONFIG_NB_PARTITIONS] = {”
count = 0;
for each p ∈ <Partition> {
count = count + 1
print “p”, p.PartitionIdentifier, “_partport”
if (|<Partition>| > count) {, print “, ” }
}
print “};”
(11) shared_io
공유된 입출력(SharedIO)을 정의하기 위해서는 먼저 이하 헤더파일 sharedio.h이 정의되어야 한다. 이 헤더파일은 설정 값을 저장할 구조체를 정의한다.
(11-1) sharedio.h
#define NAME_LENGTH 30
typedef struct
{
SHARED_IO_ACCESS_TYPE shared_io_auth[CONFIG_NB_PARTITIONS]
char name[NAME_LENGTH];
void * addr;
UINT32 size;
} shared_io_t;
typedef enum {
NONE,
READ_ONLY,
WRITE_ONLY,
READ_WRITE
} SHARED_IO_ACCESS_TYPE;
(11-2) Kernel-conf.c 소스코드는 이하와 같이 작성될 수 있다.
또한, Kernel-conf.c 소스코드는 공유된 입출력(SharedIO)의 정보를 나타낸다. 또한, 헤더 파일에서 정의된 SharedIO의 개수만큼 shared_io_t 타입의 값 즉, 각 SharedIO에 대한 파티션들의 접근권한과 SharedIO 자체 속성들이 하나의 배열로 기술된다.
shared_io_t shared_io[CONFIG_NB_SHARED_IO] = {
{
sharedIO1_authorities,
sharedIO1, 0x001c0030, 40},
{
sharedIO2_authorities,
sharedIO2, 0x0ff00000, 100},
}
SHARED_IO_ACCESS_TYPE sharedIO1_authorities[3] ={
NONE, READ_ONLY, WRITE_ONLY}
SHARED_IO_ACCESS_TYPE sharedIO2_authorities[3] ={
NONE, NONE, WRITE_ONLY}

[변환규칙]
-- 공유 IO별 접근 권한 배열 생성
for each sio ∈ <SahredIO> {
print “SHARED_IO_ACCESS_TYPE “, sio.Name, “_Authorities[”, CONFIG_NB_PARTITIONS, “] = {”
count = 0
for each p ∈ <Partition> {
flag = 0;
for each a ∈ sio.<Authorities> {
if(p.PartitionIdentifier == a.PartitionID){
print a.Access
flag = 1
}
}
if(flag == 0) { print “NONE” }
count = count + 1
if (|<Partition>| > count) { print “, ” }
}
print “};”
}
-- 공유 IO 배열 생성
count = 0
print “shared_io_t shared_io[CONFIG_NB_SHARED_IO] = {”
for each sio ∈ <SahredIO> {
count = count + 1
print “{“, sio.Name, “_Authorities, ”, sio.PhysicalAddress, “, ”, sio.Size
if (|<SahredIO>| > count) { print “}, ”} else { print “}”}
}
print “};”
(12) hm_table_init
헬스모니터(HM)에 대한 설정 값을 표현하기 위해서 헤더파일 'error.h'에 다음과 같은 타입들을 미리 정의해야 한다.
(12-1) 시스템의 상태와 시스템에서 발생될 수 있는 에러를 나타내는 타입들에 대한 코드
#define NB_SYSTEM_STATE 5
typedef enum
{
MODULE_INIT, PARTITION_SWITCHING, PARTITION_INIT,
PROCESS_EXECUTION, OS_EXECUTION
} system_state_t;
#define NB_ERROR_ID 19
typedef enum
{
DIVIDE_ERROR, DEBUG, NMI, BREAKPOINT, OVERFLOW,
BOUND_RANGE, INVALID_OPCODE, NOMATH_COPROC, DOUBLE_FAULT,
COPSEG_OVERRUN, INVALID_TSS, SEGMENT_NOT_PRESENT,
STACK_SEG_FAULT, GENERAL_PROTECTION, PAGEFAULT, FPU_FAULT,
ALIGNEMENT_CHECK, MACHINE_CHECK, SIMD_FAULT
} error_id_t;
(12-2) 시스템 HM 테이블에서 사용될 에러 수준과 모듈 HM 테이블과 파티션 HM 테이블에서 사용할 에러 액션을 나타내는 타입들에 대한 코드
typedef enum
{
NONE, MODULE_LEVEL, PARTITION_LEVEL, DEADLINE_MISSED,
APPLICATION_ERROR, NUMERIC_ERROR, ILLEGAL_REQUEST,
POWER_FAIL, MEMORY_VIOLATION, HARDWARE_FAULT, STACK_OVERFLOW
} error_level_t;
typedef enum
{
M_NONE, M_RESET, M_SHUTDOWN, M_IGNORE
} module_action_t;
typedef enum
{
P_NONE, P_IDLE, P_WARM_START, P_COLD_START, P_IGNORE
} partition_action_t;
(12-3) HM 테이블의 구조를 나타내는 'struct' 타입을 정의하는 코드
typedef struct {
union{
error_level_t system[NB_ERROR_ID][NB_SYSTEM_STATE];
module_action_t module[NB_ERROR_ID] [NB_SYSTEM_STATE];
partition_action_t partition[NB_ERROR_ID][NB_SYSTEM_STATE];
} table;
void (*callback)(uint32_t);
} table_t;
또한, 상기 코드에서 사용된 'NB_ERROR_ID'와 'NB_SYSTEM_STATE'는 각각 타입 'system_state_t'와 'error_id_t'의 원소 수를 나타낸다. 'callback'은 사용자 정의 콜백 함수를 의미한다. 이렇게 'error.h' 헤더 파일이 선언되면, 'Kernel-conf.h' 헤더 파일에는 아래와 같은 파티션 테이블 정보들을 선언하게 된다.
(12-4) 파티션 테이블 정보 선언
table_t system_hm_table;
table_t module_hm_table;
table_t partition_hm_table[CONFIG_NB_PARTITIONS];
그리고 Kernel-conf.c에는 다음과 같은 HM 테이블 초기화 함수가 작성된다. 하기 초기화 함수는 HM 테이블들의 모든 값들을 NONE으로 초기화 한다.
(12-5) HM 테이블 초기화 함수
void hm_table_init()
{
int i, j, k;
for (i = 0; i < CONFIG_NB_ERROR_ID; i++ )
{
for ( j = 0; j < CONFIG_NB_SYSTEM_STATE; j++ )
{
system_hm_table.table.system[i][j] = NONE;
module_hm_table.table.module[i][j] = M_NONE;
for ( k = 0; k < CONFIG_NB_PARTITIONS; k++ )
partition_hm_table[k].table.partition[i][j] = P_NONE;
}
}
}
마지막으로 HM 테이블에 설정된 값에 따라서 아래와 같은 코드를 Kernel-conf.c에 작성하게 된다.
(12-6) HM 테이블에 설정된 값에 따른 코드
system_hm_table.table.system[OVERFLOW][MODULE_INIT] = MODULE_LEVEL;
module_hm_table.table.module[OVERFLOW][MODULE_INIT] = M_RESET;
system_hm_table.table.system[OVERFLOW][PARTITION_INIT] = PARTITION_LEVEL;
module_hm_table.table.module[OVERFLOW][PARTITION_INIT] = P_COLD_START
[변환규칙]
print “void hm_table_init() {”
print “ int i, j, k;”
print “ for (i = 0; i < NB_ERROR_ID; i++ ){“
print “ for ( j = 0; j < NB_SYSTEM_STATE; j++ ) {“
print “ system_hm_table.table.system[i][j] = NONE;”
print “ module_hm_table.table.module[i][j] = M_NONE;”
print “ for ( k = 0; k < CONFIG_NB_PARTITIONS; k++ ){“
print “ partition_hm_table[k].table.partition[i][j] = P_NONE;”
print “ }”
print “ }”
print “ }”
print “}”
(13) system_hm_table
[변환규칙]
some s_hm ∈ <System_HM_Table> {
for each state ∈ s_hm.<System_State_Enrty> {
for each e ∈ state.<Error_ID_Level> {
print “system_hm_table.table.system[”, e.ErrorIdentifier, “][”,
state.SystemState, “] = ”, e.ErrorLevel, “;”
}
}
}
(14) module_hm_table
[변환규칙]
some m_hm ∈ <Module_HM_Table> {
for each state ∈ m_hm.<System_State_Enrty> {
for each e ∈ state.<Error_ID_Action> {
print “module_hm_table.table.module[”, e.ErrorIdentifier, “][”,
state.SystemState, “] = ”, e.Action, “;”
}
}
}
셋째로, PartN_Conf.c 파일에 포함된 구성들에 대하여 설명하면, 이하와 같다.
(1) partition_hm_table
파티션 HM 테이블은 파티션의 수만큼 생성된다. 따라서 각 파티션 디렉토리에는 아래와 같은 형태의 배정문을 갖는 소스 파일이 생성되어야 한다.
(1-1) 배정문
partition_hm_table[0].table.partition[OVERFLOW][MODULE_INIT] = P_NONE;
[변환규칙]
index = 0
for each p_hm ∈ <Partition_HM_Table> {
for each s ∈ p_hm.<System_State_Enrty> {
for each e ∈ state.<Error_ID_Action> {
print “module_hm_table[”, index, “].table.partition[”,
e.ErrorIdentifier, “][”, s.SystemState, “] = ”, e.Action, “;”
}
}
index = index + 1
}
또한, 이상에서는 본 발명의 바람직한 실시 예에 대하여 도시하고 설명하였지만, 본 발명은 상술한 특정의 실시 예에 한정되지 아니하며, 청구범위에서 청구하는 본 발명의 요지를 벗어남이 없이 당해 발명이 속하는 기술분야에서 통상의 지식을 가진 자에 의해 다양한 변형실시가 가능한 것은 물론이고, 이러한 변형실시들은 본 발명의 기술적 사상이나 전망으로부터 개별적으로 이해돼서는 안 될 것이다.
101: 설정 사용자 인터페이스
102: 중간 모델
103: XML 파일
104: 트랜스레이터
105, 106, 107: 소스코드 파일

Claims (10)

  1. 항공 시스템에서, 소스 코드 파일 생성을 통하여 ARINC 653 규격에 따른 항공 시스템 설정을 수행하는 방법에 있어서,
    사용자 인터페이스를 디스플레이하여, ARINC 653 규격에 따른 설정 사항을 입력 받는 단계;
    상기 입력된 설정 사항에 기초하여 소스 코드의 중간 모델을 생성하는 단계;
    공유된 입출력(Shared IO) 기능 설정을 가능하게 하기 위한 확장된 ARINC 653 XML-스키마(Schema)표준을 이용하여, 상기 생성된 중간 모델에 대한 XML 변환을 수행하고, 상기 XML 변환을 통하여 XML 문서를 생성하는 단계; 및
    상기 생성된 XML 문서를 변환하여 ARINC 653 규격에 따른 소스 코드 파일을 생성하는 단계
    를 포함하며,
    상기 확장된 ARINC 653 XML-스키마(Schema)표준과 함께 확장된 상기 공유된 입출력의 속성은,
    상기 공유된 입출력 요소의 이름, 물리적 주소 및 크기 중 적어도 어느 하나를 포함하는 것을 특징으로 하는 항공 시스템 설정 방법.
  2. 청구항 1에 있어서,
    상기 사용자 인터페이스는,
    모듈 설정 정보, 파티션 설정 정보, 채널 설정 정보, 및 헬스 모니터 테이블 설정 정보 중 적어도 하나 이상의 설정 정보를 입력 받기 위한 메뉴를 포함하는 것을 특징으로 하는 항공 시스템 설정 방법.
  3. 삭제
  4. 청구항 1에 있어서,
    상기 소스 코드 파일은, 기 설정된 소스 코드 템플릿에 대응되는 형식으로 생성되는 것을 특징으로 하는 항공 시스템 설정 방법.
  5. 청구항 4에 있어서,
    상기 소스 코드 파일은, 기 설정된 소스 코드 변환 규칙에 기초하여, 상기 기 설정된 소스 코드 템플릿에 대응되는 형식으로 생성되는 것을 특징으로 하는 항공 시스템 설정 방법.
  6. ARINC 653 규격에 따른 항공 시스템 설정 사항을 입력 받기 위한 사용자 인터페이스를 디스플레이하는 디스플레이부;
    상기 사용자 인터페이스를 통하여 입력된 설정 사항에 기초하여 소스 코드의 중간 모델을 생성하는 중간 모델 생성부;
    공유된 입출력(Shared IO) 기능 설정을 가능하게 하기 위한 확장된 ARINC 653 XML-스키마(Schema)표준을 이용하여, 상기 생성된 상기 생성된 중간 모델에 대한 XML 변환을 수행하고, 상기 XML 변환을 통하여 XML 문서를 생성하는 XML 변환부; 및
    상기 생성된 XML 문서를 변환하여 ARINC 653 규격에 따른 소스 코드 파일을 생성하는 트랜스레이터를 포함하며,
    상기 확장된 ARINC 653 XML-스키마(Schema)표준과 함께 확장된 상기 공유된 입출력의 속성은,
    상기 공유된 입출력 요소의 이름, 물리적 주소 및 크기 중 적어도 어느 하나를 포함하는 것을 특징으로 하는 항공 시스템 설정 장치.
  7. 청구항 6에 있어서,
    상기 사용자 인터페이스는,
    모듈 설정 정보, 파티션 설정 정보, 채널 설정 정보, 및 헬스 모니터 테이블 설정 정보 중 적어도 하나 이상의 설정 정보를 입력 받기 위한 메뉴를 포함하는 것을 특징으로 하는 항공 시스템 설정 장치.
  8. 삭제
  9. 청구항 6에 있어서,
    상기 트랜스레이터는,
    기 설정된 소스 코드 템플릿에 대응되는 형식으로 상기 소스 코드 파일을 생성하는 것을 특징으로 하는 항공 시스템 설정 장치.
  10. 청구항 9에 있어서,
    상기 트랜스레이터는,
    기 설정된 소스 코드 변환 규칙에 기초하여, 상기 기 설정된 소스 코드 템플릿에 대응되는 형식으로 상기 소스 코드 파일을 생성하는 것을 특징으로 하는 항공 시스템 설정 장치.
KR1020120039710A 2012-04-17 2012-04-17 Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치 KR101694305B1 (ko)

Priority Applications (2)

Application Number Priority Date Filing Date Title
KR1020120039710A KR101694305B1 (ko) 2012-04-17 2012-04-17 Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치
US13/765,891 US9032366B2 (en) 2012-04-17 2013-02-13 Method and apparatus for performing configuration of aeronautical system in compliance with the ARINC 653 standard

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
KR1020120039710A KR101694305B1 (ko) 2012-04-17 2012-04-17 Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치

Publications (2)

Publication Number Publication Date
KR20130117049A KR20130117049A (ko) 2013-10-25
KR101694305B1 true KR101694305B1 (ko) 2017-01-09

Family

ID=49326257

Family Applications (1)

Application Number Title Priority Date Filing Date
KR1020120039710A KR101694305B1 (ko) 2012-04-17 2012-04-17 Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치

Country Status (2)

Country Link
US (1) US9032366B2 (ko)
KR (1) KR101694305B1 (ko)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20220087247A (ko) 2020-12-17 2022-06-24 경상국립대학교산학협력단 항공기 소프트웨어에서 순서위배의 자율적 수리를 위한 건전성 관리 시스템 및 방법

Families Citing this family (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7657871B2 (en) 2005-07-22 2010-02-02 Sbc Knowledge Ventures, L.P. Method and system of managing configuration profiles of a plurality of deployed network elements
FR2998073B1 (fr) * 2012-11-14 2016-01-08 Thales Sa Systeme electronique, plateforme d'execution modulaire embarquee et procede assurant le cloisonnement de regles decisionnelles parametrables
US10951540B1 (en) * 2014-12-22 2021-03-16 Amazon Technologies, Inc. Capture and execution of provider network tasks
US9405515B1 (en) * 2015-02-04 2016-08-02 Rockwell Collins, Inc. Computing systems utilizing controlled dynamic libraries and isolated execution spaces
US9983902B2 (en) 2015-05-14 2018-05-29 General Electric Company System and method for multi-level real-time scheduling analyses
US10503230B2 (en) 2015-11-25 2019-12-10 Electronics And Telecommunications Research Institute Method and apparatus for power scheduling
US11192662B2 (en) * 2018-11-13 2021-12-07 Kidde Technologies, Inc. Aircraft integrated modular avionics inter-partition communications simulation modeling language extension
CN112905262B (zh) * 2021-03-09 2024-06-04 中国人民解放军63920部队 一种航天测控系统配置方法及装置
KR102630359B1 (ko) * 2021-12-02 2024-01-29 주식회사 알티스트 차량용 플랫폼을 위한 arinc 기반 운영체제 적용 방법

Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110296379A1 (en) * 2010-05-26 2011-12-01 Honeywell International Inc. Automated method for decoupling avionics application software in an ima system

Family Cites Families (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR100739748B1 (ko) * 2005-10-31 2007-07-13 삼성전자주식회사 Xml 문서를 이용한 디바이스 제어 방법 및 그 시스템
FR2960668A1 (fr) * 2010-05-27 2011-12-02 Airbus Operations Sas Procede et dispositif de configuration incrementale de modules de type ima
WO2012005637A1 (en) * 2010-07-05 2012-01-12 Saab Ab Method for configuring a distributed avionics control system
EP2591419B1 (en) * 2010-07-06 2018-10-31 Saab AB Simulating and testing avionics

Patent Citations (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20110296379A1 (en) * 2010-05-26 2011-12-01 Honeywell International Inc. Automated method for decoupling avionics application software in an ima system

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR20220087247A (ko) 2020-12-17 2022-06-24 경상국립대학교산학협력단 항공기 소프트웨어에서 순서위배의 자율적 수리를 위한 건전성 관리 시스템 및 방법

Also Published As

Publication number Publication date
KR20130117049A (ko) 2013-10-25
US9032366B2 (en) 2015-05-12
US20130275940A1 (en) 2013-10-17

Similar Documents

Publication Publication Date Title
KR101694305B1 (ko) Arinc 653 규격에 따른 항공 시스템 설정 방법 및 장치
US8930881B1 (en) Dual programming interface
Parkinson et al. Safety-critical software development for integrated modular avionics
CN113467972A (zh) 通信接口构造方法、装置以及计算机设备、存储介质
EP2743830A1 (en) Flexible data communication among partitions in integrated modular avionics
Mkaouar et al. From AADL model to LNT specification
Pagano et al. A model based safety critical flow for the aurix multi-core platform
Barba et al. A comprehensive integration infrastructure for embedded system design
US20170131980A1 (en) Model driven architecture for network management and configuration
Perez et al. Handling heterogeneous partitioned systems through ARINC-653 and DDS
王飞 et al. Approach for generating AADL model based on restricted natural language requirement template
US9811335B1 (en) Assigning operational codes to lists of values of control signals selected from a processor design based on end-user software
US8276165B2 (en) Continuation-based runtime callback invocation
US20130061126A1 (en) Secure document creation from potentially unsecure source templates
CN114757124B (zh) 一种基于xml的cfd工作流建模方法、装置、计算机及存储介质
CN115509668A (zh) 前端页面解析型框架的构建方法、装置、设备及存储介质
CN112667202B (zh) Mda与bpmn相结合的软件设计方法和装置
Tejera et al. RMI-HRT: remote method invocation-hard real time
CN113761871A (zh) 富文本渲染方法、装置、电子设备以及存储介质
CN106598708A (zh) 一种时间触发的嵌入式任务通讯装置与方法
Vidal et al. IP reuse in an MDA MPSoPC co-design approach
Wang et al. Formal verification method for configuration of integrated modular avionics system using MARTE
Lee et al. A configurable, extensible implementation of inter-partition communication for integrated modular avionics
Saldaña et al. Using partial reconfiguration in an embedded message-passing system
Wang et al. Automatic RT-Java code generation from AADL models for ARINC653-based avionics software

Legal Events

Date Code Title Description
A201 Request for examination
E902 Notification of reason for refusal
E701 Decision to grant or registration of patent right
GRNT Written decision to grant