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/SourceFiles/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.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
      
  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 값을 주기적으로 수신하고,
     **								      각 값을 알고리즘에 전달하여 개별 연산을 수행한다.
     **								      연산 결과가 일치하고 정해진 임계값 이상인 경우 에어백 전개를 요청한다.
     **								      본 함수는 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

💡

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

  1. 위에서 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)을 참고 한다.

  2. CrashDetector_SWUD의 ContextMenu/SW Unit Design/ Perform CommentReverse Engineering기능을 사용하여 Reverse한 HeaderFiles와 SourceFiles에 한하여 주석 Reverse가 가능하다.

  3. 주석 Reverse가 완료되면 아래와 같이 Log가 출력이 된다.

  4. Log 출력 확인 후 Reverse한 인자의 Description을 확인하면 Code Level에서 작성한 주석이 자동으로 입력된 것을 확인 할 수 있다.

    • MainAlgorithm.h /Functions/executeMainAlgorithm(uint8 mainCrashImpact)

    • MainAlgorithm.h/Variables/mainAlgoResult

    • MainAlgorithm.c/Functions/executeMainAlgorithm