Skip to content

AUTOSAR NvM 실습#

0. 목차#

  1. Project 생성
  2. NvM 블럭 생성
  3. Autosar 파일 생성 & SW Component 설정 (Port 생성/ Runnable 생성)
  4. Composition 설정 (SWC 연결)
  5. Harmonize
  6. Os Task Mapping
  7. Service I/O 연결
  8. C coding
  9. Build
  10. S32DS 실습

1. Project 생성#

우선 Project Import 과정부터 진행한다. FileImport를 클릭한다.

1

GeneralExisting Projects into WorkspaceNext를 누른다.

2

Browsebase 가져오기 → Copy projects into workspaceFinish를 누른다.

3

2. NvM 블럭 생성#

NvM 블럭을 생성하기 위해 이동한다. ConfigurationEcu

4

Ecud_NvM.arxmlNvM 더블클릭한다.

5

Block Descriptor → + 클릭한다.

6

Short Name - NvMBlock_N_Block1 → 나머지 설정은 아래 캡쳐를 따라 설정한다.

7

캡처된 사진 따라 설정한다.

8

캡처된 사진 따라 설정 → Ram Block Data Address - RamBlock_N_Block1

9

캡처된 사진 따라 설정 → Single Block Callback - Rte_Call_NvM_PNJF_NvMBlock_N_Block1_JobFinished

10

캡처된 사진 따라 설정한다.

11

OverviewUser Include Files - App_NvM_Ram.h 추가한다.

12

Edit Memory Blocks 클릭한다.

13

Memory Block ListRefresh 버튼 클릭 후 NvMBlock_N_Block1 추가 된 것을 확인 후 OK한다.

14

왼쪽 위 초록색 버튼 클릭 후 Service and I/ONvM → 새로만든 Block 없는 것을 확인한다.

15

왼쪽 위 망치버튼 옆 화살표 → Generate All을 클릭한다.

16

⚠️ 주의: 이 단계에서 RteEventtoTaskMapping 오류가 발생하는 것은 정상적인 동작입니다. (이후 '6. Os Task Mapping' 단계에서 해결됩니다.)

17

현재 Service and I/O 창을 끈 뒤 다시 열었을때 NvM에 새로 만든 블럭 추가된걸 확인한다.

18

3. Autosar 파일 생성 & SW Component 설정 (Port 생성/ Runnable 생성)#

SystemSwcd_AppNewAUTOSAR File 생성한다.

19

File name - App_NvMTest.arxmlFinish를 누른다.

20

App_NvMTest.arxmlARRoot에서 우클릭으로 → NewApplication Sw Component Type 생성한다.

21

생성된 Sw component 더블클릭 후 - Short Name - SWC_NvMTest - Supports Multiple Instantation - False

22

Ports → + 클릭 → Client Server InterfaceClient 생성한다.

23

NvM 검색 후 NvMService 선택 후 OK한다.

24

생성된 포트 더블 클릭 후 - Short Name - R_NvMService - Operations - ReadBlock - Enable Required Com Specs 체크

25

  • Operations - WriteBlock
  • Enable Required Com Specs 체크

26

+ 클릭 → Client Server InterfaceServer 생성한다.

27

NvM 검색 후 NvMNotifyJobFinished 선택 후 OK한다.

28

생성된 포트 더블 클릭 후 - Short Name - P_NvMNotifyJobFinished - Operations - JobFinished - Enable Required Com Specs 체크 - Queue Length - 1

29

+ 클릭 → Client Server InterfaceClient 생성한다.

30

Io 검색 후 IoHwAb_If_DigDir 선택 후 OK한다.

31

생성된 포트 더블 클릭 후 - Short Name - R_LED_RED - Operations - WriteDirect - Enable Required Com Specs 체크

32

Runnables → + 클릭 → 생성된 Runnable 더블클릭 - Short Name - RE_NvMTest - Symbol - NvMTest_func - Can Be Invoked Concurrently - False

33

Rte EventAdd 클릭한다.

34

Timing Event 선택 후 OK한다.

35

현재 설정되어 있는 5ms 클릭 후 → Edit 클릭한다.

36

100msec로 변경 후 OK를 누른다.

37

Operation / Mode / Trigger AccessAdd를 클릭한다.

38

Synchronous Server Call PointsR_LED_RED.WriteDirect & R_NvMService.ReadBlock & R_NvMService.WriteBlock 선택 후 OK한다.

39

Runnables → + 클릭 → 생성된 Runnable 더블클릭 - Short Name - RE_NvMTest_JobFinished - Symbol - NvMTest_JobFinished_func - Can Be Invoked Concurrently - False

40

Rte EventAdd 클릭한다.

41

Operation Invoked EventP_NvMTestJobFinished.JobFinished 선택 후 OK한다.

42

Operation / Mode / Trigger AccessAdd를 클릭한다.

43

Synchronous Server Call PointsR_LED_RED.WriteDirect 선택 후 OK한다.

44

ConfigurationSystemCompositionRootComposition.arxmlCSWC_RootComposition 더블클릭 → Components and PortsComponents+를 클릭한다.

45

SWC_NvMTest 체크 후 OK를 누른다.

46

4. Composition 설정 (SWC 연결)#

추가된 거 확인하고 왼쪽 위 보라색 아이콘 클릭한다.

47

ECU Software Components Mapping 클릭한다.

48

OK를 누른다.

49

1개의 SwComponentPrototype 추가되는거 확인 후 Apply한다.

50

5. Harmonize#

왼쪽 위 초록색 아이콘 클릭한다.

51

OverviewGenerate ECU Configuration 클릭한다.

52

그대로 Next를 누른다.

53

ServiceRte 체크 후 Next를 누른다.

54

그대로 Finish를 누른다.

55

6. Os Task Mapping#

하모나이즈 완료 후 왼쪽 위 파란색 아이콘 클릭한다.

56

Event Table에서 Sw Component InstanceSwcInstance_SWC_NvMTest 선택 OsTask Mapping Table에서 Related to Sw ComponentOsTask_ASW_FG1_100ms 선택 Evnet Table에서 TE_RE_NvMTest 선택 후 Add 클릭한다.

57

7. Service I/O 연결#

왼쪽 위 초록색 아이콘 클릭한다.

58

Service and I/ONvMPNJF_NvMBlock_N_Block1 선택 후 + 클릭한다.

59

Respect Naming Rule 체크 해제 후 P_NvMNotifyJobFinished 체크 후 OK를 누른다.

60

PS_NvMBlock_N_Block1 선택 후 + 클릭한다.

61

Respect Naming Rule 체크 해제 후 PS_NvMBlock_N_Block1 체크 후 OK를 누른다.

62

IoHwAbP_IoHwAbDigitalDirectLogical_LED_Red 선택 후 + 클릭한다.

63

Respect Naming Rule 체크 해제 후 P_IoHwAbDigitalDirect... 체크 후 OK를 누른다.

64

8. C coding#

Build 설정#

BuildSCons.arxmlSCons 더블클릭한다.

65

Module 클릭한다.

66

Rte 찾아서 더블클릭 후 Input Files ListAdd 클릭한다.

67

Value - App_NvMTest 작성 후 Add 클릭한다.

68

추가된거 확인 후 OK한다.

69

왼쪽 위 망치버튼 옆 화살표 → Generate All

70

제너레이트 성공 확인한다.

71

C coding 작성#

Static_CodeReference_CodesrcNewFile 생성한다.

72

File name - SWC_NvMTest.c 작성 후 Finish를 누른다.

73

Static_CodeReference_CodeincNewFile 생성한다.

74

File name - App_NvM_Ram.h 작성 후 Finish를 누른다.

75

Static_CodeReference_CodesrcNewFile 생성한다.

76

File name - App_NvM_Ram.c 작성 후 Finish를 누른다.

77

App_NvM_Ram.c에 다음과 같이 작성 후 저장한다.

#include "App_NvM_Ram.h"

uint8 RamBlock_N_Block1[10];

78

App_NvM_Ram.h에 다음과 같이 작성 후 저장한다.

#include "Std_Types.h"

extern uint8 RamBlock_N_Block1[10];

79

SWC_NvMTest.c에 다음과 같이 작성 후 저장한다.

#include "Rte_SWC_NvMTest.h"
#include "App_NvM_Ram.h"


void NvMTest_func(void)
{
    static uint8 mode = 0;

    if(mode == 1)
    {
        Rte_Call_R_NvMService_WriteBlock(RamBlock_N_Block1);
        mode = 0;
    }
    else if(mode == 2)
    {
        Rte_Call_R_NvMService_ReadBlock(RamBlock_N_Block1);
        mode = 0;
    }
    else if(mode == 3)
    {
        Rte_Call_R_LED_RED_WriteDirect(IOHWAB_LOW);
        mode = 0;
    }
}

FUNC(Std_ReturnType, SWC_NvMTest_CODE) NvMTest_JobFinished_func(VAR(NvM_BlockRequestType, AUTOMATIC) BlockRequest, VAR(NvM_RequestResultType, AUTOMATIC) JobResult)
{
    Rte_Call_R_LED_RED_WriteDirect(IOHWAB_HIGH);
}

80

9. Build#

왼쪽 위 망치버튼 옆 화살표 → Build

81

빌드 성공 확인한다.

82

10. S32DS 실습#

S32ds 실행 후 Workspace 지정한 뒤 Launch한다.

83

FileImport

84

S32 Design Studio for S32 PlatformC/C++ Executable as S32DS Project 선택 후 Next한다.

85

앞서 작업했던 폴더 → Debug.elf 파일 선택 후 열기한다.

86

S32K3S32K312M7 선택 후 Next한다.

87

Create Launch Configuration - GDB PEMircro Debugging Inteface 선택한다.

88

Toolchain Name - Nxp GCC 9.2 선택 후 Finish한다.

89

Debug 클릭한다.

90

실습을 위해 왼쪽 위 ExpressionRamBlock_N_Block1 작성해서 추가한다.

91

추가되면 다음과 같이 RamBlock의 값이 출력된다.

92

앞서 작업했던 폴더 → Static_CodeReference_CodesrcSWC_NvMTest 선택한다.

93

드래그해서 S32DS 환경에 추가한다.

94

if(mode == 1) 줄에 브레이크 포인트 설정한다.

95

Resume를 누른다.

96

실행되다가 브레이크 포인트에 걸리게 된다.

97

ExpressionValue 값들을 임의로 변경해본다.

98

VariablesmodeValue를 1로 변경 후 Resume을 누른다. (Write 됨)

99

비휘발성 메모리(NvM) 저장 기능을 테스트하기 위해 보드 연결 선을 뽑거나 보드 전원을 완전히 OFF했다가 다시 켠 뒤, Debug를 다시 실행한다.

100

Resume를 누른다.

101

ExpressionRamBlockValue 값이 다 0인 것을 볼 수 있다.

102

VariablesmodeValue를 2로 변경 후 Resume을 누른다. (Write했던거 Read하기)

103

ExpressionRamBlockValue 값이 Write했을때 값으로 변경되는 것을 확인한다.

104

Terminate 버튼으로 실습을 종료한다.

105

최종 확인: 전원을 완전히 껐다 켰을 때 초기값(0)이었던 RAM Block의 값이, mode2로 변경해 데이터를 Read했을 때 이전에 임의로 변경하고 Write했던 값으로 정상 복구된다면 NvM 읽기/쓰기 실습에 성공