관리 메뉴

Leo's Garage

FEE Module과 Garbage Collection 본문

자동차 및 자동차 SW/AUTOSAR

FEE Module과 Garbage Collection

LeoBehindK 2023. 7. 31. 22:17
728x90
반응형

최근에 FEE 모듈과 Garbage Collection으로 인해 곤혹스러운 일을 겪은 것을 기념하며 해당 내용을 정리하고자 한다.

FEE(Flash EEPROM Emulation) 모듈은 Flash 메모리를 마치 EEPROM처럼 사용하고자 할 때, 그 중간 역할을 하는 모듈이다.

FEE 모듈에는 Garbage Collection이라는 기능이 있는데, 이 기능은 NvM(NVRAM Manager) Block을 새로운 Sector에 복사하고, 이미 채워진 Sector를 지우는 방식으로 Sector 전환 및 Dflash Clean을 하는 기능이다. 

예를 들어 MCU에 NvM에 활용할 수 있는 Dflash가 512Kbyte 있다고 가정하자. 

우리는 이 용량을 256Kbyte씩, 2개의 섹터로 나눠서 사용하고 싶다. 

보통 이렇게 섹터를 나눠서 사용하는 이유는 메모리의 수명 때문이다.

번갈아가면서 사용해야 메모리의 수명을 더 오래 사용할 수 있기 때문이다.

이렇게 나눠진 섹터에 대해 활성화된 섹터의 일정 데이터가 쌓이면, 섹터 전환을 위해서 데이터를 옮기고 지우는 일련의 과정이 필요하다.

이 기능이 바로 Garbage Collection이다. 

Garbage Collection Steps

단계는 아래와 같다. 

 

1. Data Block에 대한 Write 요청이 현재 활성화 되어 있는 섹터의 임계값을 넘으면, Garbage Collection 기능이 활성화 된다.

2. 모든 Block에 있는 최신 버전을 현재 활성화된 섹터에서 비어 있는 비활성 섹터로 복사한다.

3. 복사된 데이터 블록의 끝에 유효한 상태 페이지를 작성하여 복사 절차가 올바로 끝났음을 표시한다. 이제 비활성 섹터가 활성 섹터로 변환하고, 이전 활성 섹터가 비활성 섹터가 된다.

4. 지워진 섹터에 erased state page를 쓴다. 

 

보통 NVM Data 저장을 shut down 때 수행하기 때문에, Shut down 시 GC가 중단되는 경우가 발생할 수 있다. 이런 경우에는 FEE initialization 혹은 Booting중에 GC가 Trigger될 수 있다. 

FEE 및 Flash content에 쓰기 명령을 허용하는 상태로 변환하려면 반드시 GC가 완료되어야 한다. 

NvM 초기화는 아래의 단계로 구성된다.

1. FLS 초기화 : 내부적으로 FLS 드라이버를 초기화 한다. 

2. FEE 초기화 : FLS가 작동 중인 경우, FEE 드라이버를 초기화하고, 섹터 상태를 확인하며 캐시 테이블을 생성한다. (캐시 테이블은 FEE 블록의 메타데이터만 유지)

3. FEE init 시의 intermediate MainFunctions : FEE가 모든 내부 활동을 완료할 때까지 주기적으로 Fls_MainFunction 및 Fee_MainFunction을 실행한다. 선택적으로 3단계를 건너뛰고 5단계에서 FEE 내부 작업이 처리되도록 할 수 있으며, 이는 NvM 읽기 작업이 처리되기 전에 이루어진다. 

4. NvM Read All : FEE가 작동 중이면 NvM이 모든 블록을 RAM에 읽어오기 위해 트리거 되며, 이로 인해 NvM 블록의 데이터를 RAM에 복사한다. 

5. NvM init 시의 intermediate MainFunctions : NvM이 모든 내부 활동을 완료할 때까지 주기적으로 NvM_MainFucntion, Fls_MainFunction, Fee_MainFunction을 실행한다. 

6. Operational State : 들어오는 작업을 처리하기 위해 주기적으로 NvM_MainFucntion, Fls_MainFunction, Fee_MainFunction을 실행한다. 

Booting Process의 속도를 높이기 위해 3단계와 5단계의 루프는 대기 시간없이 동기적으로 구현되고, 6단계의 메인 함수는 보통 10ms Task로 주기적으로 호출한다. 

FEE configuration parameter에 따라서 GC는 3단계(FEE_GC_RESTART_INIT) 중에 트리거되거나 6단계 중 새로운 Write 명령이 처음 발생할 때 트리거 될 수 있다. (FEE_GC_RESTART_WRITE)

728x90
반응형
Comments