AUTOSAR NvM 실습#
0. 목차#
- Project 생성
- NvM 블럭 생성
- Autosar 파일 생성 & SW Component 설정 (Port 생성/ Runnable 생성)
- Composition 설정 (SWC 연결)
- Harmonize
- Os Task Mapping
- Service I/O 연결
- C coding
- Build
- S32DS 실습
1. Project 생성#
우선 Project Import 과정부터 진행한다. File → Import를 클릭한다.

General → Existing Projects into Workspace → Next를 누른다.

Browse → base 가져오기 → Copy projects into workspace → Finish를 누른다.

2. NvM 블럭 생성#
NvM 블럭을 생성하기 위해 이동한다. Configuration → Ecu

Ecud_NvM.arxml → NvM 더블클릭한다.

Block Descriptor → + 클릭한다.

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

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

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

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

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

Overview → User Include Files - App_NvM_Ram.h 추가한다.

Edit Memory Blocks 클릭한다.

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

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

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

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

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

3. Autosar 파일 생성 & SW Component 설정 (Port 생성/ Runnable 생성)#
System → Swcd_App → New → AUTOSAR File 생성한다.

File name - App_NvMTest.arxml → Finish를 누른다.

App_NvMTest.arxml → ARRoot에서 우클릭으로 → New → Application Sw Component Type 생성한다.

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

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

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

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

- Operations -
WriteBlock Enable Required Com Specs체크

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

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

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

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

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

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

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

Rte Event → Add 클릭한다.

Timing Event 선택 후 OK한다.

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

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

Operation / Mode / Trigger Access → Add를 클릭한다.

Synchronous Server Call Points → R_LED_RED.WriteDirect & R_NvMService.ReadBlock & R_NvMService.WriteBlock 선택 후 OK한다.

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

Rte Event → Add 클릭한다.

Operation Invoked Event → P_NvMTestJobFinished.JobFinished 선택 후 OK한다.

Operation / Mode / Trigger Access → Add를 클릭한다.

Synchronous Server Call Points → R_LED_RED.WriteDirect 선택 후 OK한다.

Configuration → System → Composition → RootComposition.arxml → CSWC_RootComposition 더블클릭 → Components and Ports → Components 의 +를 클릭한다.

SWC_NvMTest 체크 후 OK를 누른다.

4. Composition 설정 (SWC 연결)#
추가된 거 확인하고 왼쪽 위 보라색 아이콘 클릭한다.

ECU Software Components Mapping 클릭한다.

OK를 누른다.

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

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

Overview → Generate ECU Configuration 클릭한다.

그대로 Next를 누른다.

Service → Rte 체크 후 Next를 누른다.

그대로 Finish를 누른다.

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

Event Table에서 Sw Component Instance → SwcInstance_SWC_NvMTest 선택
OsTask Mapping Table에서 Related to Sw Component → OsTask_ASW_FG1_100ms 선택
Evnet Table에서 TE_RE_NvMTest 선택 후 Add 클릭한다.

7. Service I/O 연결#
왼쪽 위 초록색 아이콘 클릭한다.

Service and I/O → NvM → PNJF_NvMBlock_N_Block1 선택 후 + 클릭한다.

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

PS_NvMBlock_N_Block1 선택 후 + 클릭한다.

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

IoHwAb → P_IoHwAbDigitalDirectLogical_LED_Red 선택 후 + 클릭한다.

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

8. C coding#
Build 설정#
Build → SCons.arxml → SCons 더블클릭한다.

Module 클릭한다.

Rte 찾아서 더블클릭 후 Input Files List → Add 클릭한다.

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

추가된거 확인 후 OK한다.

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

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

C coding 작성#
Static_Code → Reference_Code → src → New → File 생성한다.

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

Static_Code → Reference_Code → inc → New → File 생성한다.

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

Static_Code → Reference_Code → src → New → File 생성한다.

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

App_NvM_Ram.c에 다음과 같이 작성 후 저장한다.
#include "App_NvM_Ram.h"
uint8 RamBlock_N_Block1[10];

App_NvM_Ram.h에 다음과 같이 작성 후 저장한다.
#include "Std_Types.h"
extern uint8 RamBlock_N_Block1[10];

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);
}

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

빌드 성공 확인한다.

10. S32DS 실습#
S32ds 실행 후 Workspace 지정한 뒤 Launch한다.

File → Import

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

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

S32K3 → S32K312 → M7 선택 후 Next한다.

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

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

Debug 클릭한다.

실습을 위해 왼쪽 위 Expression → RamBlock_N_Block1 작성해서 추가한다.

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

앞서 작업했던 폴더 → Static_Code → Reference_Code → src → SWC_NvMTest 선택한다.

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

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

Resume를 누른다.

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

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

Variables → mode의 Value를 1로 변경 후 Resume을 누른다. (Write 됨)

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

Resume를 누른다.

Expression → RamBlock → Value 값이 다 0인 것을 볼 수 있다.

Variables → mode의 Value를 2로 변경 후 Resume을 누른다. (Write했던거 Read하기)

Expression → RamBlock → Value 값이 Write했을때 값으로 변경되는 것을 확인한다.

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

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