AUTOSAR Mode 실습#
0. 목차#
- Project 생성
- Autosar 파일 생성
- SW component / Interface / Data Type / Data Mapping Set 생성
- SW Component 설정 (Data Mapping / Port 생성 / Runnable 생성)
- Composition 설정 (SWC 연결)
- 실제 하드웨어 포트 추가 (SW05)
- Harmonize
- Os Task 추가 & Os Task Mapping
- Service I/O 연결
- C coding
- Build
1. Project 생성#
우선 Project Import 과정부터 진행한다. File → Import를 클릭한다.

그 후, General → Existing Projects into Workspace를 선택한 후, Next를 클릭한다.

Base Project를 browse 버튼을 통해 가져온 뒤, 아래의 Copy projects into workspace를 선택한다. 모든 설정을 마쳤다면 Finish 버튼을 통해 마무리 한다.

2. Autosar 파일 생성#
AUTOSAR file을 추가한다. Configuration → System → Swcd_App을 우클릭하여 New → AUTOSAR File을 클릭하여 새로운 AUTOSAR File을 생성한다.

File name을 App_ModeTest.arxml로 설정한 후 Finish를 눌러준다.

3. SW component / Interface / Data Type / Data Mapping Set 생성#
새로운 SW Component Type을 2개 생성한다.

첫 번째 Software Component의 이름을 SWC_ModeTest로 설정하고 Supports Multiple Instantiatiom을 False로 설정한다.

두 번째 Software Component의 이름을 SWC_ModeManager로 설정하고 Supports Multiple Instantiatiom을 False로 설정한다.

Sender-Receiver Interface를 생성한다.

인터페이스 이름을 If_ModeRequest로 입력해 준다.

Mode Switch Interface를 생성한다.

인터페이스 이름을 If_ModeUse로 입력해 준다.

Application Primitive Data Type을 새로 생성한다.

데이터 타입 이름을 ADT_ModeTest로 입력하고, Category를 Value로 설정한다.

데이터 타입과 내부 상태 값을 매핑하기 위한 Compu Method를 생성해야 한다.

Compu Method를 새로 생성한다.

이름을 CM_ModeTest로 입력하고, Category를 TEXTTABLE로 설정한다.

Compu Direction 항목에서 Internal To Phys를 선택한 뒤, New 버튼을 세 번 클릭하여 MODE_READY, MODE_A, MODE_B 라벨을 각각 추가해 준다.

Compu Method 설정이 완료되었으므로, 다시 ADT_ModeTest 화면으로 돌아와 생성한 CM을 지정해 준다.

이전 단계에서 생성한 CM_ModeTest를 선택하고 OK를 눌러 적용한다.

If_ModeRequest 인터페이스 설정 화면으로 이동하여, 인터페이스에 적용할 데이터 요소를 추가하기 위해 New를 클릭한다.

Short Name에 ModeTest를 입력하고, Type 필드 옆의 ... 버튼을 클릭한다.

방금 전 생성한 ADT_ModeTest 타입을 찾아서 선택한 뒤 OK를 누른다.

If_ModeUse 인터페이스를 사용하기 위해서는 Mode Declaration Group Prototype이 정의되어 있어야 한다.

따라서 새로운 Mode Declaration Group을 생성한다.

Short Name에 MDG_ModeTest를 입력하고, Category를 EXPLICIT_ORDER로 설정해 준다.

해당 그룹 안에 선언될 Mode Declaration(상태 목록)들을 정의한다.

+ 버튼을 눌러 모드를 추가하고 각각 Short Name은 MODE_READY, MODE_A, MODE_B로, Value는 0, 1, 2로 지정해 준다.

처음 화면으로 돌아와, Initial Mode(초기 모드) 항목을 지정하기 위해 Browse 버튼을 클릭한다.

초기 모드로 사용할 MODE_READY를 선택하고 OK를 클릭한다.

모드 전환 시의 기본값(On Transition Value)을 10으로 설정해 준다.

If_ModeUse 인터페이스로 돌아온 뒤, Mode Declaration Group Prototype 탭을 선택한다.

Short Name을 MDGP_ModeTest로 설정하고 Type을 지정해 주기 위해 ... 버튼을 클릭한다.

앞서 정의해 놓은 MDG_ModeTest 타입을 선택하고 OK를 눌러 적용한다.

인터페이스에 데이터 타입을 연결하는 것뿐만 아니라, 해당 데이터 타입이 실제로 어떤 하드웨어 및 기본 데이터 타입(uint 등)과 매핑되는지 설정하기 위해 Data Type Mapping Set을 생성한다.

Short Name을 DTMS_ModeTest로 지정한 후, Data Type Maps 영역에서 New를 클릭하고 Application Data Type의 ... 버튼을 클릭한다.

ADT_ModeTest를 선택하고 OK를 누른다.

Implementation Data Type ... 버튼을 클릭한다.

검색 창에 uint를 입력하여 uint8 타입을 선택하고 OK를 누른다.

Mode Request Type Maps 탭에서 New를 클릭한 후, Mode Group ...을 클릭한다.

MDG_ModeTest를 선택하고 OK를 누른다.

Implementation Data Type ... 버튼을 클릭한다.

검색 창에 uint를 검색하여 uint32를 선택하고 OK를 눌러 설정을 마무리한다.

생성한 Data Type과 Mode Group이 각각 uint8, uint32와 같이 실제 하드웨어 데이터 타입으로 정상적으로 매핑되었는지 최종 확인한다.

4. SW Component 설정 (Data Mapping / Port 생성 / Runnable 생성)#
SWC_ModeTest#
이제 작성 중인 각각의 SW Component(SWC)에 데이터 타입 매핑과 모드 선언 그룹 세트를 적용해 주어야 한다.

SWC_ModeTest 컴포넌트 설정 화면에서 Data Type Mapping 항목을 클릭한다.

Data Type ... 버튼을 클릭한다.

이전 장에서 생성해 두었던 DTMS_ModeTest를 선택하고 Add 버튼을 클릭한다.

매핑 정보가 정상적으로 등록되었는지 확인한 뒤 OK를 눌러 준다.

Overview 탭으로 이동한다.

Included Mode Declaration Group Sets 항목을 클릭해 준다.

ModeDeclaration Group ... 버튼을 클릭한다.

우리가 정의해 놓은 MDG_ModeTest를 선택한 뒤 Add를 누른다.

포함된 모드 선언 그룹 세트를 확인하고 OK를 눌러 설정을 저장한다.

SWC_ModeTest에 포트를 생성하기 위해, Ports 탭으로 이동한 뒤 + 버튼을 클릭하고 Sender Receiver Interface → Sender를 클릭하여 포트를 생성한다.

인터페이스 선택 창에서 If_ModeRequest를 선택한 뒤 OK를 누른다.

생성된 포트를 더블클릭하여 세부 설정 창을 연다. Short Name을 P_ModeRequest로 수정한 뒤, 아래 Data Elements 리스트의 ModeTest 요소에 대해 Enable Provide Com Specs를 체크하고, 이어서 Init Value 항목에서 Numerical Value Specification을 체크해 준다.

+ 버튼을 클릭하고 Mode Switch Interface → Mode Receiver를 클릭하여 새로운 포트를 생성해 준다.

인터페이스 창에서 If_ModeUse를 선택하고 OK를 누른다.

생성된 포트를 더블클릭하여 Short Name을 P_ModeUse로 수정한다. 그 후 Mode Group 리스트의 ModeDeclarationGroupPrototype 요소에 대해 Enable Provide Com Specs를 체크하고, Enhanced Mode Api와 Supports Asynchronous Mode Switch 속성을 모두 true로 설정한다.

+ 버튼을 클릭하고 Client Server Interface → Client를 선택하여 클라이언트 포트를 생성해 준다.

인터페이스 검색창에 io를 입력하여 하드웨어 추상화 관련 인터페이스인 IoHWAb_If_DigDir을 선택하고 OK를 누른다.

이 과정을 총 3번 반복하여 동일한 형태의 Client 포트를 3개 만들어 준다.

첫 번째 Client 포트의 Short Name을 R_LED_Red로 수정한다. 아래 Operations 항목에서 WriteDirect를 선택하고 Enable Required Com Specs를 체크해 준다.

두 번째 Client 포트의 Short Name을 R_SW05로 설정한다. Operations 항목에서는 입력 핀이므로 ReadDirect를 지정하고 Enable Required Com Specs를 체크한다.

세 번째 Client 포트의 Short Name을 R_SW06으로 설정하고, 역시 Operations 리스트에서 ReadDirect를 선택한 뒤 Enable Required Com Specs를 체크해 준다.

동작 코드가 들어갈 Runnable을 생성하기 위해 Runnables 탭으로 이동한다. + 버튼을 클릭하여 새로운 Runnable을 추가하고, Short Name은 RE_ModeRequest, 실행 함수 심볼(Symbol)은 ModeRequest_func로 입력한다. 그리고 동시에 호출되지 않도록 Can Be Invoked Concurrently 옵션은 false로 설정해 준다.

이 Runnable이 주기적으로 실행되도록 이벤트를 매핑한다. RTE Event 항목 아래의 Add를 클릭한다.

이벤트 종류로 Timing Event를 선택한 뒤 OK를 누른다.

새로 추가된 주기적 타이밍 이벤트(Timing Event - 5 msec)를 선택하고 Edit 버튼을 클릭한다.

주기(Period)를 기존의 5ms에서 100 msec로 수정하고 OK를 누른다.

다음으로 Operation / Mode / Trigger Access 항목에서 Add를 클릭한다.

Synchronous Server Call Points으로 R_SW05.ReadDirect와 R_SW06.ReadDirect를 Ctrl 키를 누른 상태에서 동시에 선택한 후 OK를 눌러 추가한다.

다음으로 Data / Parameter Access 영역에서 Add를 클릭한다.

Data Send Points 목록에서 P_ModeRequest.ModeTest를 선택하고 OK를 눌러준다.

모드 A 진입 시 동작할 Runnable을 추가하기 위해 Runnables 탭에서 다시 +를 클릭한다. Short Name은 RE_Mode_A, Symbol은 Mode_A_func로 입력하고 Can Be Invoked Concurrently는 false로 설정한다.

이 Runnable이 주기적으로 실행되도록 이벤트를 매핑한다. RTE Event 항목 아래의 Add를 클릭한다.

모드가 변경될 때 실행되는 이벤트를 지정해야 하므로, Swc Mode Switch Event를 선택하고 세부 모드로 Entry - R_ModeUse.ModeDeclarationGroupPrototype.MODE_A를 찾아서 클릭한 뒤 OK를 누른다.

다음으로 Operation / Mode / Trigger Access 항목에서 Add를 클릭한다.

LED 제어를 위해 Synchronous Server Call Points에서 R_LED_Red.WriteDirect를 선택한 후 OK를 누른다.

이어서 모드 B 진입 시 동작할 Runnable을 위해 +를 클릭한다. Short Name은 RE_Mode_B, Symbol은 Mode_B_func로 입력하고 Can Be Invoked Concurrently를 false로 설정한다.

이 Runnable이 주기적으로 실행되도록 이벤트를 매핑한다. RTE Event 항목 아래의 Add를 클릭한다.

Swc Mode Switch Event를 선택하고 이번에는 모드 B 진입을 감지하도록 Entry - R_ModeUse.ModeDeclarationGroupPrototype.MODE_B를 선택한 뒤 OK를 누른다.

다음으로 Operation / Mode / Trigger Access 항목에서 Add를 클릭한다.

LED 제어를 위해 Synchronous Server Call Points에서 R_LED_Red.WriteDirect를 선택한 후 OK를 누른다.

SWC_ModeManager#
이제 SWC_ModeTest에 대한 컴포넌트 모델링이 완료되었다. 이어서 SWC_ModeManager 컴포넌트 탭으로 전환한 후, 동일하게 Data Type Mappings 설정을 시작한다.

Data Type의 ... 버튼을 클릭한다.

이전 장에서 생성해 두었던 DTMS_ModeTest를 선택하고 Add 버튼을 클릭한다.

매핑 정보가 정상적으로 등록되었는지 확인한 뒤 OK를 눌러 준다.

Overview 탭으로 전환하여 Included Mode Declaration Group Sets를 클릭한다.

ModeDeclaration Group ... 버튼을 클릭한다.

우리가 정의해 놓은 MDG_ModeTest를 선택한 뒤 Add를 누른다.

포함된 모드 선언 그룹 세트를 확인하고 OK를 눌러 설정을 저장한다.

Ports 탭으로 이동하여 + 버튼을 클릭한 뒤 Sender Receiver Interface → Receiver를 선택하여 입력 포트를 하나 생성해 준다.

인터페이스 선택 창에서 If_ModeRequest를 선택한 뒤 OK를 누른다.

생성된 포트를 더블클릭한다. Short Name을 R_ModeRequest로 수정한 뒤, 아래 Data Elements 리스트의 ModeTest 요소에 대해 Enable Provide Com Specs를 체크하고, Handle Never Received와 Enable Update 항목을 모두 true로 설정한다.

스크롤을 아래로 더 내려서 Init Value 속성 밑의 Numerical Value Specification을 체크해 준다.

다시 + 버튼을 눌러 포트를 추가하고, Mode Switch Interface → Mode Sender를 선택해 준다.

인터페이스 창에서 If_ModeUse를 선택하고 OK를 누른다.

생성된 포트를 더블클릭하여 Short Name을 R_ModeUse로 변경한다. Mode Group 영역에서 ModeDeclarationGroupPrototype에 대해 Enable Provide Com Specs를 체크한 후, Queue Length는 1로 입력하고 Enhanced Mode Api를 true로 설정한다.

Runnables 탭으로 전환하여 + 버튼을 누른다. 새로 추가된 Runnable의 Short Name에 RE_ModeManager를 적고, 심볼(Symbol)에는 ModeManager_func를 입력한다. 마찬가지로 Can Be Invoked Concurrently는 false로 지정해 준다.

이 Runnable이 주기적으로 실행되도록 이벤트를 매핑한다. RTE Event 항목 아래의 Add를 클릭한다.

포트로부터 새로운 모드 요청 데이터를 수신했을 때 구동되도록, Data Received Event 항목에서 R_ModeRequest.ModeTest를 지정하고 OK를 클릭한다.

다음으로 Operation / Mode / Trigger Access 항목에서 Add를 클릭한다.

모드 전환 제어 지점인 Mode Switch Points 목록에서 R_ModeUse.ModeDeclarationGroupPrototype을 선택하고 OK를 눌러준다.

다음으로 Data / Parameter Access 영역에서 Add를 클릭한다.

Data Receive Point By Arguments 리스트에서 R_ModeRequest.ModeTest를 선택하고 OK를 클릭해 저장한다.

5. Composition 설정 (SWC 연결)#
해당 경로로 이동하여 CSWC_RootComposition을 더블클릭하여 연다.

Components and Ports로 이동하고, Components 영역 아래의 + 아이콘을 클릭한다.

추가할 SWC 리스트에서 SWC_ModeManager와 SWC_ModeTest를 찾아 모두 체크한 뒤 OK를 누른다.

Automatic Connection 탭으로 전환한 후, SWC_ModeManager를 선택하고 오른쪽 위의 + 버튼을 클릭한다.

자동으로 연결 가능한 관계인 P_ModeRequest 포트와 R_ModeUse 포트가 정상적으로 체크되었는지 확인한 뒤 OK를 누른다.

창 왼쪽 위에 위치한 보라색 아이콘 버튼을 클릭한다.

ECU Software Components Mapping을 클릭한다.

확인 창이 나타나면 OK를 클릭한다.

2개의 AssemblySwConnector와 2개의 SwComponentPrototype이 추가되는 것을 확인한 뒤 Apply 버튼을 눌러 적용한다.

6. 실제 하드웨어 포트 추가 (SW05)#
창 왼쪽 상단에 있는 초록색 버튼을 누른다.

IoHWAb 1.7.1 모듈을 클릭한다.

All Contents 탭을 열고 IoHwAbConfig → IoHwAbDigitalDirect → Logical 항목을 더블클릭하여 열어 준다.

+ 버튼을 클릭하여 설정을 생성하고, Short Name을 IoHwAbDigitalDirectLogical_SW05로 적는다. 이어서 Port Pin Ch Ref의 ... 버튼을 클릭한다.

하드웨어 포트 리스트에서 버튼 입력과 연결될 IoHwAbPortPinCh_PTB26을 선택한 뒤 OK를 클릭하여 적용한다.

7. Harmonize#
창 왼쪽 상단에 있는 초록색 버튼을 누른다.

Generate ECU Configuration을 선택하여 클릭한다.

Next를 클릭한다.

Service 탭에서 Rte 항목에 체크를 확인한 뒤 Next를 클릭한다.

모든 체크를 확인하고 Finish를 눌러 생성을 마친다.

8. Os Task 추가 & Os Task Mapping#
Os Task 추가#
ECU 하모나이즈 작업이 완료되면, 다시 화면 왼쪽 위의 초록색 버튼을 클릭한다.

현재 설정 중인Base로 기본 지정되어 있는지 확인한 후 OK를 누른다.

Os 1.3.0 모듈을 찾아서 클릭한다.

Task 설정 트리로 들어간 뒤, + 아이콘을 클릭하여 새로운 OS Task를 추가한다. 이 작업을 한 번 더 반복하여 총 2개의 태스크를 생성해 준다.

첫 번째 태스크의 Short Name은 OsTask_ASW_ModeUser로, 우선순위(Priority)는 160으로 설정한다.
두 번째 태스크의 Short Name은 OsTask_ASW_ModeManager로 입력하고, 우선순위(Priority)는 140으로 설정해 준다.

Application 섹션으로 이동하여 OsApplication0을 더블클릭한다. 이후 우측 속성 창에서 App Task Ref 필드 옆의 Browse 버튼을 클릭한다.

방금 선언한 OsTask_ASW_ModeManager와 OsTask_ASW_ModeUser 두 태스크를 선택한 뒤 Add를 누른다.

우측 리스트에 두 태스크가 등록된 것을 확인한 뒤 OK를 클릭한다.

Os Task Mapping#
화면 왼쪽 위의 파란색 리본 아이콘인 RTE Event to Task Mapping 버튼을 클릭해 준다.

좌측 트리 메뉴에서 Sw Component Instance를 선택하고 SwcInstance_SWC_ModeManager를 찾아서 클릭한다.

하단 OsTask Mapping Table의 unMapped를 선택한 뒤 목록에서 OsTask_ASW_ModeManager 태스크를 선택하고, 매핑할 이벤트 리스트에서 DRE_RE_ModeManager_R_ModeRequest를 클릭해 지정한다.

Add 버튼을 클릭하여 태스크에 이벤트 맵핑을 완료하고, 테이블에 정상 등록된 것을 확인합니다.

다음으로 SwcInstance_SWC_ModeTest 컴포넌트를 선택한다. OsTask Mapping Table의 Related to Sw Component 목록에서 주기가 매칭되는 OsTask_ASW_FG1_100ms를 선택하고, 이벤트 리스트에서 주기적 타이밍 이벤트인 TE_RE_ModeRequest를 선택한다.

Add 버튼을 클릭하여 태스크에 이벤트 맵핑을 완료하고, 테이블에 정상 등록된 것을 확인합니다.

OsTask Mapping Table의 unMapped 탭에서 이번에는 OsTask_ASW_ModeUser 태스크를 선택하고, 아래 이벤트 목록에서 SMSE_Entry_RE_Mode_A_R_ModeUse와 SMSE_Entry_RE_Mode_B_R_ModeUse를 복수 선택해 준다.

Add 버튼을 클릭하여 태스크에 이벤트 맵핑을 완료하고, 테이블에 정상 등록된 것을 확인합니다.

9. Service I/O 연결#
상단 메뉴 모음의 망치 모양 아이콘 옆 화살표를 누르고 Generate All을 클릭하여 실행한다.

제너레이트 과정에서 실패 에러가 발생하더라도, EcuValueCollection 하위의 Service and I/O → IoHwAb 포트에 SW05가 추가되어 있다면 무시하고 다음 단계로 이동한다.

P_IoHwAbDigitalDirectLogical_LED_Red 요소를 선택한 후 + (New Connection) 아이콘을 클릭한다.

Respect Naming Rule 옵션 체크를 해제하고, R_LED_Red를 체크한 뒤 OK를 클릭해 준다.

P_IoHwAbDigitalDirectLogical_SW05를 선택하고 마찬가지로 + (New Connection) 아이콘을 누른다.

Respect Naming Rule 체크를 해제한 뒤 R_SW05를 체크하고 OK를 선택해 준다.

P_IoHwAbDigitalDirectLogical_SW06를 선택하고 + (New Connection) 버튼을 누른다.

Respect Naming Rule 체크를 끈 후 R_SW06을 체크하고 OK를 눌러 하드웨어 서비스 연결을 마친다.

10. C coding#
Build 설정#
Build 패키지 트리 아래의 Scons.arxml 파일 내의 Scons 설정을 더블클릭하여 열고, Module 탭을 선택한다.

Rte 항목을 찾아 더블클릭한 후, Input Files List 속성 칸에서 Add 버튼을 클릭한다.

파일 입력란에 App_ModeTest를 입력한 뒤 Add를 누른다.

리스트에 App_ModeTest가 추가된 것을 확인하고 OK를 누른다.

상단 망치 모양 아이콘 옆 화살표를 누르고 Generate All을 클릭하여 실행한다.

만약 코드 생성 중에 에러가 나타날 경우, ECU 하모나이즈 과정을 다시 진행하고 Generate를 실행해 주며 이 과정을 정상 완료될 때까지 반복해 준다.

C coding 작성#
프로젝트 탐색기에서 Static_Code → Reference_Code → src 폴더를 우클릭하고 New → File을 선택하여 빈 파일을 만든다.

File name 입력란에 SWC_ModeTest.c를 정확하게 입력한 뒤 Finish 버튼을 클릭한다.

생성된 파일에 아래와 같이 코드를 작성한다.

src 폴더를 우클릭하고 New → File을 클릭한다.

File name에 SWC_ModeManager.c를 입력한 뒤 Finish를 눌러 파일을 생성한다.

생성된 파일에 아래와 같이 코드를 작성한다.

11. Build#
화면 왼쪽 위의 망치 모양 아이콘 옆에 있는 화살표를 클릭하고 Build를 클릭하여 전체 빌드를 실행한다.

빌드가 완료되었는지 확인한다.
