4. SWUD 설계
Table of contents
- 4.1. SWUD 생성
- 4.2 VisualStudio 실행 (CodeGenerate)
- 4.3 SW-C 상세 설계 (Code Level)
- 4.4 Code Reverse
- 4.5 Code Level 주석 Reverse
이 가이드는 A-SPICE에서 SWE.3 (Software Detailed Design)에 해당하는 과정입니다. SWAD 설계에서 이어집니다.
4.1. SWUD 생성
현 가이드에서는 “CrashDetector” SW-C 상세 설계 및 구현을 진행한다.
DAB_SWAD에서 CrashDetector의 ContextMenu → ‘Create SW Unit Model’를 클릭하여 CrashDetector_SWUD를 생성한다.
생성된 SWUD의 초기 모습이다.
CrashDetector_SWUD/Directories/RteFiles/SourceFiles/Rte/Functions을 보면 SWAD에서 설계한 CrashDetector와 Communication하는 RTE가 자동으로 생성된 것을 볼 수 있다.
CrashDetector_SWUD/Directories/CrashDetector_Src/SourceFiles/Rte_CrashDetector/Functions을 보면 ‘CrashDetector’ SW-C의 RunnableEntity가 자동으로 생성된 것을 볼 수 있다.
4.2 VisualStudio 실행 (CodeGenerate)
RapidAUTO Context Menu의 SW Unit Design/Generate SW Unit Code를 클릭해 VisualStuio를 실행한다.
Log에 안내 메시지와 함께 VisualStudio가 자동으로 실행되고 탐색기 Root에 새로운 폴더가 자동으로 생성된 것을 확인할 수 있다.
생성된 VisualStuio 솔루션과 실행된 프로젝트 창에서 자동으로 생성된 .c, .h 파일들이 잘 생성되었는지 Build를 통해 확인한다. 이때, VisualStudio 상단 Solution Platform을 x64에서 x86으로 변경하고 Build를 진행한다.
자동 생성된 Rte.c의 모습이다.
4.3 SW-C 상세 설계 (Code Level)
기존에는 RapidAUTO환경에서 모델 설계를 했지만 현 RapidAUTO Pro는 개발자에 맞춘 Tool로서 Code에서 개발하도록 개량되었다.
SW Safety Requirement를 만족하는 알고리즘 코드를 생성한다.
Main Algorithm을 구현하기 위한 MainAlgorithm 코드 작성 (MainAlgorithm.h, MainAlgorithm.c)
Safing Algorithm을 구현하기 위한 SafingAlgorithm 코드 작성 (SafingAlgorithm.h, SafingAlgorithm.c)
MainAlgorithm.c 예제코드
#include "MainAlgorithm.h" // _@mainAlgoResult: mainCrashImpact와 mainAlgoData의 연산 결과를 저장하는 전역 변수. uint8 mainAlgoResult; // _@mainAlgoData: 알고리즘 연산에 사용되는 입력용 전역 변수. uint8 mainAlgoData; /* _@executeMainAlgorithm: /****************************************************************************************** ** ASIL : C ** Related ID : SRS-001 ** Description : mainCrashImpact 입력값과 mainAlgoData 전역 변수를 이용해 ** 충돌 영향을 계산하고, 그 결과를 mainAlgoResult에 저장한다. ** 본 함수는 알고리즘의 핵심 연산을 담당한다. ** Argument : ** mainCrashImpact[In] : 센서로부터 수신된 충돌 감지 값으로, 연산의 기준이 되는 입력 값. ******************************************************************************************/ void executeMainAlgorithm(uint8 mainCrashImpact) { mainAlgoResult = mainCrashImpact + mainAlgoData; }
MainAlgorithm.h 예제코드
#ifndef MAINALGORITHM_H #define MAINALGORITHM_H #include "Platform_Types.h" // _@mainAlgoResult: 전역 변수 mainAlgoResult 선언 크기는 uint8 extern uint8 mainAlgoResult; // _@mainAlgoData: 전역 변수 mainAlgoData 선언 크기는 uint8 extern uint8 mainAlgoData; // _@executeMainAlgorithm: mainCrashImpact 값을 기반으로 연산을 수행하고 mainAlgoResult에 결과를 저장하는 함수 void executeMainAlgorithm(uint8 mainCrashImpact); #endif
SafingAlgorithm.c 예제코드
#include "SafingAlgorithm.h" // _@safingAlgoResult: 변수 safingAlgoResult 정의 크기는 uint8 uint8 safingAlgoResult; // _@safingAlgoData: 변수 safingAlgoData 정의 크기는 uint8 uint8 safingAlgoData; /* _@executeSafingAlgorithm: /****************************************************************************************** ** ASIL : C ** Related ID : SRS-001 ** Description : SafingAlgorithm은 MainAlgorithm의 판단을 보조하기 위한 ** 보완 로직으로 동작한다. ** 두 센서 결과를 통해 최종 충돌 여부를 판단한다. ** Argument : ** safingCrashImpact[In] : 보조 센서로부터 수신된 충돌 감지 값으로, 보완 연산의 입력 값. *****************************************************************************************/ void executeSafingAlgorithm(uint8 safingCrashImpact) { safingAlgoResult = safingCrashImpact + safingAlgoData; }
SafingAlgorithm.h 예제코드
#ifndef SAFINGALGORITHM_H #define SAFINGALGORITHM_H #include "Platform_Types.h" // _@safingAlgoResult: 전역 변수 safingAlgoResult 선언 크기 uint8 extern uint8 safingAlgoResult; // _@safingAlgoData: 전역 변수 safingAlgoData 선언 크기 uint8 extern uint8 safingAlgoData; // _@executeSafingAlgorithm: safingCrashImpact를 기반으로 연산 수행 후, 결과를 safingAlgoResult에 결과를 저장하는 함수. void executeSafingAlgorithm(uint8 safingCrashImpact); #endif
마지막으로 Runnable Entity코드를 작성해준다. 이때, Rte_CrashDetector.c에 코드를 작성해준다.
#include "Rte_CrashDetector.h" #include "MainAlgorithm.h" #include "SafingAlgorithm.h" /* _@REtCrashDetector_250ms: /****************************************************************************************** ** ASIL : C ** Related ID : SRS-003 ** Description : Main 센서와 Safing 센서로부터 crashImpact 값을 주기적으로 수신하고, ** 각 값을 알고리즘에 전달하여 개별 연산을 수행한다. ** 연산 결과가 일치하고 정해진 임계값 이상인 경우 에어백 전개를 요청한다. ** 본 함수는 250ms 주기로 실행되며, 충돌 판단 및 에어백 전개 결정의 핵심 제어 역할을 수행한다. *****************************************************************************************/ FUNC(void, CrashDetector_CODE) REtCrashDetector_250ms() { uint8 mainCrashImpact; uint8 safingCrashImpact; Rte_Read_CrashDetector_R_MainSensorData_crashImpact(&mainCrashImpact); Rte_Read_CrashDetector_R_SafingSensorData_crashImpact(&safingCrashImpact); executeMainAlgorithm(mainCrashImpact); executeSafingAlgorithm(safingCrashImpact); if(mainAlgoResult == safingAlgoResult && mainAlgoResult > 10) { Rte_Call_CrashDetector_R_DriverAirbagControl_inflateAirbag(mainAlgoResult); } }
4.4 Code Reverse
VisualStudio Project를 Build하여 코드의 에러를 찾고 없다면 Reverse를 진행한다.
이때, 작성한 MainAlgorithm.c, MainAlgorithm.h, SafingAlgorithm.c, SafingAlgorithm.h를 탐색기 Solution 경로의 DAB_SWUD\CrashDetector_SWUD\CrashDetector_Src에 위치하도록 한다.
다시 SWUD 환경으로 넘어와 ContextMenu → SW Unit Design → Perform Code Reverse Engineering을 클릭해 CodeReverse를 진행한다.
CrashDetector_Src 아래에 MainAlgorithm과 SafingAlgorithm에 해당하는 .c, .h가 모델화된 것을 볼 수 있다.
4.5 Code Level 주석 Reverse
이 기능은 산출물 자동화에 사용되는 기능입니다. RapidPublisher 템플릿으로 산출물을 자동으로 출력하는 기능은 RapidPublisher에 포함되어 있습니다.
위에서 Reverse를 수행한 코드의 경우 알맞은 주석 양식을 갖추면 주석 Reverse기능을 사용할 수 있다. 주석 양식은 4.3 SW-C상세 설계 코드를 참고하면 된다.
이때 작성한 코드의 변수나 함수의 이름과 키워드를 일치시켜야한다.
(Ex. uint8 mainAlgoResult 주석 Reverse를 위해서는 // _@mainAlgoResult: <Description>)
그 외 주석 작성 가이드: [https://rapidauto.io/1-Getting_Started/Work_Product/2-_SDD_Work_Product/2-2_SDD_Description_작성_과정](https://rapidauto.io/1-_Getting_Started/Work_Product/2-_SDD_Work_Product/2-2_SDD_Description%EC%9E%91%EC%84%B1_%EA%B3%BC%EC%A0%95)을 참고 한다.CrashDetector_SWUD의 ContextMenu/SW Unit Design/ Perform CommentReverse Engineering기능을 사용하여 Reverse한 HeaderFiles와 SourceFiles에 한하여 주석 Reverse가 가능하다.
주석 Reverse가 완료되면 아래와 같이 Log가 출력이 된다.
Log 출력 확인 후 Reverse한 인자의 Description을 확인하면 Code Level에서 작성한 주석이 자동으로 입력된 것을 확인 할 수 있다.
MainAlgorithm.h /Functions/executeMainAlgorithm(uint8 mainCrashImpact)
MainAlgorithm.h/Variables/mainAlgoResult
MainAlgorithm.c/Functions/executeMainAlgorithm