AUTOSAR Memory Map에 대해 정리해보도록 하자.
MemMap File
MemMap file은 header file로 구성된다. MemMap.h이다. 이 header file은 함수나 변수를 특정 메모리 위치에 위치시키기 위해서 사용된다. 이 때 장소는 Flash memory나 RAM이 된다. 이렇게 특정 위치에 지정하는 이유는 RAM을 낭비하지 않기 위해서이고 각각 같은 비슷한 그룹으로 묶어두기 위해서이다.
메모리 낭비와 해결 방법
일반적으로 Embedded Systemd에서, 함수나 변수의 메모리 위치를 지정하지 않으면 RAM에 위치하게 되는데, 이 때 각각 다른 사이즈로 인하여 불필요한 메모리 낭비가 생길 수 있다. 그래서 결과적으로 #pragma를 통해 특정 구역으로 지정하게 된다.
#pragma location = 0x1000
int a;
이해를 위해 매우 단순하게 구성하면 위와 같이 #pragma location = 0x1000을 통해 변수를 위치시킬 수 있다. 사실 Embedded System에서는 pragma로 직접 메모리 위치를 지정하는 경우는 거의 없고, Memory Map을 거쳐 Locator를 통해 특정 메모리 '범위' 안에 지정되게 된다.
AUTOSAR 메모리 키워드 지정하기
AUTOSAR에서는 메모리 키워드를 특정 양식으로 정의하고 있다. 우리가 최종적으로 사용하는 Memory Mapping 형식은 다음과 같다.
1 #define ADC_START_SEC_VAR_INIT_16
2 #include "Adc_MemMap.h"
3 static uint16 adc = 0;
5 #define ADC_STOP_SEC_VAR_INIT_16
6 #include "Adc_MemMap.h"
그렇다면, ADC_START_SEC_VAR_INIT_16은 어떻게 나오게 된 것인가?
AUTOSAR Specification SWS_MemMap_00022에 따르면 다음과 같은 양식으로 해야함을 알려준다.
섹션 시작 시: <PREFIX>_START_SEC_<NAME>
섹션 끝날 시: <PREFIX>_STOP_SEC_<NAME>
<PREFIX>: 이 때 PREFIX는 BSW 모듈 이름 (정확히는 MIPS) 또는 섹션 이름, SWC의 이름 등을 사용할 수 있다. 여기서는 BSW 모듈인 ADC에 배치하기 때문에 ADC를 사용하였다.
START_SEC / STOP_SEC: SECTION의 시작 키워드와 끝 키워드이다.
<NAME>: 메모리 섹션 이름이다. 이 때 속성이 드러나야 된다. 예를 들어, ASIL 등급 또는 BIT 값 등 메모리 키워드에 식별되는 이름이다.
위 내용을 안다는 가정하에 AUTOSAR 방식을 살펴보면 다음과 같다.
#ifdef ADC_START_SEC_VAR_8BIT
#undef ADC_START_SEC_VAR_8BIT
#define START_SECTION_DATA_8BIT
#elif
/*Some more macros for different sections*/
#endif
#ifdef START_SECTION_DATA_8BIT
#pragma section data "sect_8bit"
#undef START_SECTION_DATA_8BIT
#undef MEMMAP_ERROR
#elif ADC_STOP_SEC_VAR_8BIT
#undef ADC_STOP_SEC_VAR_8BIT
#define STOP_SECTION_DATA_8BIT
#endif
#ifdef STOP_SECTION_DATA_8BIT
#pragma section code restore
#undef STOP_SECTION_DATA_8BIT
#und
첫 문단부터 하나하나 살펴보자.
ADC_START_SEC_VAR_8BIT를 해제하고 START_SECTION_DATA_8BIT으로 정의한다.
#ifdef ADC_START_SEC_VAR_8BIT
#undef ADC_START_SEC_VAR_8BIT
#define START_SECTION_DATA_8BIT
#elif
그리고 pragma를 통해 sect_8bit이라는 섹션을 정의한다. 이렇게 정의하면 따라오는 변수는 sect_8bit 메모리 섹션에 정의된다.
#ifdef START_SECTION_DATA_8BIT
#pragma section data "sect_8bit"
#undef START_SECTION_DATA_8BIT
#undef MEMMAP_ERROR
그리고 메모리 섹션에 할당하는 것을 그만 멈추기 위해 #define ADC_STOP_SEC_VAR_8BIT를 사용할 때도 비슷한 원리이다. STOP_SECTION_DATA_8BIT를 정의하고, #pragma section code restore를 통해 원래 코드 섹션으로 복원한다.
#elif ADC_STOP_SEC_VAR_8BIT
#undef ADC_STOP_SEC_VAR_8BIT
#define STOP_SECTION_DATA_8BIT
#endif
#ifdef STOP_SECTION_DATA_8BIT
#pragma section code restore
#undef STOP_SECTION_DATA_8BIT
#undef MEMMAP_ERROR
#endif
Memory type | Syntax of memory allocation keyword | Description | |
Code | [MSN]_START_SEC_CODE [MSN]_STOP_SEC_CODE |
Application Block에 연결되어야함. | |
Variables | [MSN]_START_SEC_VAR_NOINIT_[SIZE] [MSN]_STOP_SEC_VAR_NOINIT_[SIZE] |
초기화되지 않는 global 변수나 static 변수에 사용되어야함. | |
Variables | [MSN]_START_SEC_POWER_ON_INIT_[SIZE] [MSN]_STOP_SEC_POWER_ON_INIT_[SIZE] |
Power on reset때 초기화되는 global 변수나 static 변수에 사용되어야함. | |
Variables | [MSN]_START_SEC_VAR_FAST_[SIZE] [MSN]_STOP_SEC_VAR_FAST_[SIZE] |
Bitwise로 접근될 수 있는 global 또는 static 변수나 자주 접근되거나 사용되는 변수에 사용되어야함. | |
Variables | [MSN]_START_SEC_VAR_[SIZE] [MSN]_STOP_SEC_VAR_[SIZE] |
매 reset때마다 초기화되는 global 또는 static 변수에 사용되어야함. | |
Constants | [MSN]_START_SEC_CONST_[SIZE] [MSN]_STOP_SEC_CONST_[SIZE] |
Global 또는 static 상수에 사용되어야함. |
여기서 MSN은 모듈 이름을 얘기하고, SIZE는 8BIT, 16BIT, 32BIT 변수를 의미하고, 크기를 모르는 경우 UNSPECIFIED로 정의한다.
그러면 최종적으로 어떻게 쓸까? 바로 아래와 같이 사용한다.
#define ADC_START_SEC_VAR_16BIT
#include "MemMap.h"
static uint16 adc;
#define ADC_STOP_SEC_VAR_16BIT
#include "MemMap.h"
ADC_START_SEC_VAR_16BIT를 정의하고 MemMap.h을 include하여 결과적으로 pragma를 통해 section을 배치할 수 있게 한다.
'임베디드소프트웨어 > AUTOSAR' 카테고리의 다른 글
3. AUTOSAR 용어 정리하기 (0) | 2024.03.29 |
---|---|
2. AUTOSAR Basic Softwateware (BSW) 시작하기 (1) | 2024.02.24 |
1. AUTOSAR (오토사) 프로젝트 시작하기 (0) | 2024.02.10 |
0. AUTOSAR (오토사) 시작하기 (1) | 2024.02.09 |
댓글