✅ 개념:
명령어 - 관련함수 세트로 구조체 사용하는 경우가 많다.✅ 예시:
struct SensorData {
int temperature;
float pressure;
char status;
};
✅ 임베디드 관점:
struct __attribute__((packed)) RegMap {
uint8_t control;
uint16_t status;
uint8_t data;
};
✅ 개념:
• 여러 멤버가 같은 메모리 공간을 공유함.
• 하나의 멤버만 유효하며, 가장 큰 멤버 크기만큼 공간이 할당됨.
✅ 예시:
union DataPacket {
uint32_t value;
uint8_t bytes[4];
};
✅ 임베디드 관점:
• 바이트 레벨로 데이터 해석할 때 유용.
• 예를 들어, 32비트 데이터를 바이트 단위로 분해하거나 결합할 때 사용.
• 센서 값 파싱, 통신 프로토콜 구현 등에 필수.
✅ 개념:
• 관련된 상수들에 이름을 붙여 가독성과 유지보수성을 높임.
• 내부적으로는 정수형(int)으로 처리됨.
✅ 예시:
enum SystemState {
IDLE,
RUNNING,
ERROR
};
✅ 임베디드 관점:
• 상태 머신(state machine) 설계에서 상태를 명확하게 표현.
• 플래그, 명령 코드, 모드 구분 등에 사용.
• 컴파일러 최적화 측면에서도 효과적이고, 디버깅 시 출력값이 의미 있는 이름으로 바뀌어 가독성 향상.
파일 입출력 : 파일을 읽어오거나, 수행결과를 저장.
현업에서는 보통 데이터베이스에 저장하나, 간단한 내용은 파일입출력 사용할 수 있음.
운영체제가 프로세스에 입력,출력,에러 버퍼를 만들고 기본적인 키보드-모니터 장치로 연결시켜줌. 입력하고 출력이 버퍼를 통해 진행되어서, 이를 스트리밍이라고 하며 스트림버퍼라고 한다.
키보드에서 입력, 모니터로 출력하는 방법이나 파일에 대한 입출력이 동일하다.
표준 입/출력 대신 하드디스크에 존재하는 파일내용을 입력 출력하는 것 뿐이다.
모니터나 키보드는 자동적으로 운영체제가 할당시켜주나, 파일은 별도로 지정해주는것이 필요하다. 어떤 파일로부터 입력받을지, 출력할지를 지칭해주는게 필요함.
🔹 fopen
// ex)
FILE *fp = fopen("data.txt", "r");
모드 예시:
🔹 fclose
fclose(fp);
🔹 fread / fwrite
fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);
fread(buf, sizeof(char), 100, fp); → 1byte씩 반복횟수 100회(최대 100바이트)를 fp로부터 buf로 읽어들임.
🔹 fgets / fputs
• 문자열 단위(\n)로 읽고 씁니다 (텍스트 파일 전용).
fgets(buffer, sizeof(buffer), fp);
fputs("Hello\n", fp);
🔹 fscanf / fprintf
편하긴하지만, 오버헤드가 있어서 사용하기 꺼려짐
-> fread/fwrite 를 주로 사용하는 이유.
fprintf(fp, "%d %s", 10, "text");
fscanf(fp, "%d %s", &num, str);
🧭 파일 위치 제어 함수들
🔸 fseek
• 파일의 현재 위치를 임의의 위치로 이동시킵니다.
fseek(fp, offset, origin);
• origin:
• SEEK_SET: 파일 시작 위치 기준
• SEEK_CUR: 현재 위치 기준
• SEEK_END: 파일 끝 기준
📌 이진 파일 처리나 레코드 접근에 매우 유용함.
🔸 rewind
• 파일 위치를 처음으로 되돌림. fseek(fp, 0, SEEK_SET); 와 같음.
rewind(fp);
🔸 ftell
• 현재 파일 위치를 바이트 단위로 반환.
long pos = ftell(fp);
⚠️ 파일 상태 점검 함수
🔸 feof
• 파일의 끝에 도달했는지 확인.
while (!feof(fp)) {
fgets(buf, sizeof(buf), fp);
}
📌 주의: feof는 읽기를 시도한 후에만 true가 됩니다. 읽기 전에 사용하면 잘못된 동작할 수 있음.
🧠 임베디드 관점의 팁
✅ 예제: 간단한 이진 파일 읽기
FILE *fp = fopen("data.bin", "rb");
if (fp) {
uint8_t buffer[16];
while (fread(buffer, 1, sizeof(buffer), fp) > 0) {
// 처리 코드
}
fclose(fp);
}