4. SWUD 설계

Table of contents

💡

이 가이드는 A-SPICE에서 SWE.3 (Software Detailed Design)에 해당하는 과정입니다. SWAD 설계에서 이어집니다.

4.1. SWUD생성

  1. 현 가이드에서는 “CrashDetector” SW-C 상세 설계 및 구현을 진행한다.

  2. DAB_SWAD에서 CrashDetector의 ContextMenu → ‘Create SW Unit Model’를 클릭하여 CrashDetector_SWUD를 생성한다.

  3. 생성된 SWUD의 초기 모습이다.

  4. CrashDetector_SWUD/Directories/RteFiles/SouceFiles/Rte/Functions을 보면 SWAD에서 설계한 CrashDetector와 Communication하는 RTE가 자동으로 생성된 것을 볼 수 있다.

  5. CrashDetector_SWUD/Directories/CrashDetector_Src/SourceFiles/Rte_CrashDetector/Functions을 보면 ‘CrashDetector’ SW-C의 RunnableEntity가 자동으로 생성된 것을 볼 수 있다.

4.2 VisualStudio실행(CodeGenerate)

  1. RapidAUTO Context Menu의 SW Unit Design/Generate SW Unit Code를 클릭해 VisualStuio를 실행한다.

  2. Log에 안내 메세지와 함께 VisualStudio가 자동으로 실행되고 탐색기 Root에 새로운 폴더가 자동으로 생성된 것을 확인할 수 있다.

  3. 처음 VisualStuio생성 및 실행시 자동으로 생성되는 .c, .h들이 잘 생성되었는지 Build를 통해 확인한다. 이때, VisualStudio 상단 Solution Platform을 x64에서 x86으로 변경하고 Build를 진행한다.

  4. 자동 생성된 Rte.c의 모습이다.

4.3 SW-C 상세설계 (Code Level)

  1. 기존에는 RapidAUTO환경에서 모델 설계를 했지만 현 RapidAUTO Pro는 개발자에 맞춘 Tool로서 Code에서 개발하도록 개량되었다.
  2. 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
      
  3. 마지막으로 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

  1. VisualStudio Project를 Build하여 코드의 에러를 찾고 없다면 Reverse를 진행한다.
  2. 이때, 작성한 MainAlgorithm.c, MainAlgorithm.h, SafingAlgorithm.c, SafingAlgorithm.h를 탐색기 Solution 경로의 DAB_SWUD\CrashDetector_SWUD\CrashDetector_Src에 위치하도록 한다.

  3. 다시 SWUD 환경으로 넘어와 ContextMenu → SW Unit Design → Perform Code Reverse Engineering을 클릭해 CodeReverse를 진행한다.

  4. CrashDetector_Src아래에 MainAlgorithm과 SafingAlgorithm에 해당하는 .c, .h가 모델화 된 것을 볼 수 있다.

4.5 Code Level 주석 Reverse

💡

이 기능은 산출물 자동화에 사용되는 기능입니다. RPE 템플릿으로 산출물을 자동으로 출력하는 기능은 RapidPublisher에 포함되어 있습니다.