C 언어 노트
임베디드 펌웨어의 대부분은 아직도 C로 짭니다. 포인터와 비트 연산이 손에 익어야 그다음이 열립니다.
변수와 자료형: uint8_t를 쓰는 이유
int의 크기는 컴파일러마다 다릅니다. 임베디드에서 크기가 정해진 자료형을 쓰는 이유와 부호, 오버플로를 정리했습니다.
C 언어연산자와 형변환: 버그가 숨는 곳
정수 나눗셈, 암묵적 형변환, 연산자 우선순위. 컴파일은 되는데 값이 틀리는 코드의 원인을 정리했습니다.
C 언어제어문: 펌웨어가 무한 루프인 이유
if, switch, for, while로 흐름을 만들고, 임베디드 프로그램이 끝나지 않는 루프로 짜이는 이유를 봅니다.
C 언어함수와 스코프: 값 복사, 수명, 재귀
함수 인자는 복사되어 전달됩니다. 지역 변수와 전역 변수의 수명, 그리고 MCU에서 재귀를 피하는 이유.
C 언어배열과 문자열: 버퍼 넘침의 원리
배열은 메모리에 연속으로 놓인 같은 자료형의 묶음이고, 문자열은 널 문자로 끝나는 char 배열입니다.
C 언어포인터: 주소를 다루면 레지스터가 보인다
포인터는 주소를 담는 변수입니다. 특정 주소를 읽고 쓰는 것이 레지스터 제어의 전부라는 점을 정리했습니다.
C 언어포인터 심화와 함수 포인터
포인터 연산, 이중 포인터, 그리고 콜백과 상태 머신에 쓰는 함수 포인터를 정리했습니다.
C 언어구조체, 공용체, 비트필드
레지스터 묶음과 통신 패킷을 구조체로 표현하고, 메모리 정렬과 패딩이 왜 생기는지 확인합니다.
C 언어비트 연산: 켜고, 끄고, 뒤집기
AND로 지우고, OR로 켜고, XOR로 뒤집고, 시프트로 자리를 옮깁니다. 레지스터 제어의 기본 문법입니다.
C 언어volatile, const, static
최적화를 막는 volatile, 값을 고정하는 const, 범위와 수명을 바꾸는 static. 임베디드에서 가장 자주 묻는 키워드 세 개.
C 언어전처리기와 매크로
#define, 조건부 컴파일, 헤더 가드. 매크로가 만드는 함정과 안전하게 쓰는 방법.
C 언어빌드 과정: 소스가 펌웨어가 되기까지
전처리, 컴파일, 어셈블, 링크를 거쳐 실행 파일이 되는 흐름과 링크 오류를 읽는 방법.