MCU는 전원이 꺼지고 켜진 경우 (POR : Power on Reset)
처리된 데이터(static 변수, 지역 변수, 매개 변수) 들은 메모리 상에서 남아있지 않고 사라진다.
그래서 MCU가 꺼지고 다시 켜졌을 경우, 데이터를 저장해야 할 때가 있다.
아두이노는 이 역할을 하는 내장 메모리가 있으며, 이를 EEPROM이라고 한다. (하드 디스크처럼 기간과 횟수가 그리 많지 않음.)
(초기 ROM(Read Only Memory)로 오로지 공장에서 출하 과정에서 메모리에 write가 되면, 그 이 후부턴 read 밖에 할 수 없었음. read 만 할 수 있는 문제를 해결하기 위해 자외선을 통해 몇 번의 write를 할 수 있는 EPROM이 개발됨. 조금 더 시간이 흘러 자외선이 아닌 전기로 write가 가능한 EEPROM(Electrically Erasable Programmable ROM)이 개발 됨.
2byte 정수를 1byte 배열로 나눠서 저장하는 글을 작성하면서 EEPROM 이야기를 하는 이유는
EEPROM에 데이터를 저장할 때 한 개의 주소에 1Byte(8bit) 씩 저장하므로 1byte를 초과하는 데이터는 나눠서 저장해야 하기 때문이다.
그리고 CRC-16 결과 값인 2byte 정수를 1byte 배열로 나눠서 저장한다.
CRC(cyclic redundancy check ) = 데이터의 무결성을 체크하기 위해 사용.
예제는 간단하다.
비트 마스킹을 통해 원하는 변수를 추출하고 다운 캐스팅을 통해 형 변환을 해주면 된다.
#include <stdio.h>
#define EEP_DATA_SIZE 2
static unsigned char eepImage[EEP_DATA_SIZE];
static void EepHandler_2byte_to_1byte(void){
int l_result = 0x0102; // 2byte = 0x01_02
eepImage[0] = (unsigned char)(l_result >> 8); // 0x01_02 >> 8 = 0x00_01
eepImage[1] = (unsigned char)(l_result & 0x00FF); // 0x01_02 & FF = 0x00_02
}
int main()
{
EepHandler_2byte_to_1byte();
printf("EEPImage[0] : %d\n", eepImage[0]);
printf("EEPImage[1] : %d\n", eepImage[1]);
return 0;
}
728x90
반응형
'C, C++' 카테고리의 다른 글
[C언어] 포인터의 이해 (1) | 2023.10.15 |
---|---|
[C, C++] #define을 사용하는 이유 (0) | 2022.10.05 |
[CPP] strcpy_s 사용 예제 (0) | 2021.08.23 |
[C] Call by Value VS Call by Reference (0) | 2021.08.16 |
[C] UNION 공용체와 Struct 구조체를 이용해 간단한 패킷 만들기 (1) | 2021.01.20 |