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/SouceFiles/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.h)
MainAlgorithm.c 예제코드
#include "MainAlgorithm.h" // _@mainArgoResult: mainAlgoResult 변수 정의 크기 uint8 uint8 mainAlgoResult; // _@mainAlgoData: mainAlgoData 변수 정의 크기 uint8 uint8 mainAlgoData; /* _@executeMainAlgorithm: /****************************************************************************************** ** ASIL : C ** Related ID : SRS-001 ** Description : mainCrashImpact 입력값과 mainAlgoData 전역 변수를 이용해 ** 충돌 영향을 계산하고, 그 결과를 mainAlgResult에 저장한다. ** 본 함수는 앍리즘의 핵심 연산을 담당한다. *****************************************************************************************/ 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의 판단을 보조하기 위한 ** 보완 로직으로 동작한다. ** 두 센서 결과를 통해 최동 중돌 여부를 판단한다. *****************************************************************************************/ 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 값을 주기적으로 읽어온다. ** 각 알고리즘에 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
이 기능은 산출물 자동화에 사용되는 기능입니다. RPE 템플릿으로 산출물을 자동으로 출력하는 기능은 RapidPublisher에 포함되어 있습니다.