그라운드 임베디드 EN 유튜브 구독

로드맵

기초 · 과목 01

C 언어

임베디드 펌웨어의 대부분은 아직도 C로 짭니다. 포인터와 비트 연산이 손에 익어야 그다음이 열립니다.

목표: 레지스터를 직접 읽고 쓰는 코드를 스스로 짤 수 있다.

  • 입문난이도
  • 약 4주하루 1시간 기준
  • 12개주제
  • 3개실험실

다음 과목 자료구조와 알고리즘컴퓨터구조

지도에서 보기 →
  1. 변수와 자료형

    int 대신 uint8_t, int16_t처럼 크기가 정해진 자료형을 쓰는 이유와 부호, 오버플로를 봅니다.

  2. 연산자와 형변환

    정수 나눗셈, 암묵적 형변환, 연산자 우선순위처럼 버그가 잘 숨는 곳을 짚습니다.

  3. 제어문

    if, switch, for, while로 흐름을 만들고, 무한 루프가 펌웨어의 기본 골격인 이유를 봅니다.

  4. 함수와 스코프

    값이 복사되어 전달된다는 점, 지역·전역 변수의 수명, 재귀가 MCU에서 위험한 이유.

    GROUND EMBEDDED · 실험실포인터 주소를 따라가값을 바꾸기 1volatile uint32_t *ODR 2 = (uint32_t*)0x40020014; 3*ODR |= (1u << 5); 4while (1) { 5 if (flag) toggle(); 6}3D 실험실
  5. 배열과 문자열

    메모리에 연속으로 놓인 데이터와 널 문자로 끝나는 문자열. 버퍼 넘침이 생기는 원리.

    GROUND EMBEDDED · 실험실포인터 주소를 따라가값을 바꾸기 1volatile uint32_t *ODR 2 = (uint32_t*)0x40020014; 3*ODR |= (1u << 5); 4while (1) { 5 if (flag) toggle(); 6}3D 실험실
  6. 포인터

    주소를 담는 변수입니다. 특정 주소를 직접 읽고 쓰는 것이 레지스터 제어의 전부입니다.

    GROUND EMBEDDED · 실험실포인터 주소를 따라가값을 바꾸기 1volatile uint32_t *ODR 2 = (uint32_t*)0x40020014; 3*ODR |= (1u << 5); 4while (1) { 5 if (flag) toggle(); 6}3D 실험실
  7. 포인터 심화와 함수 포인터

    포인터 연산, 이중 포인터, 콜백과 상태 머신에 쓰는 함수 포인터.

  8. 구조체, 공용체, 비트필드

    레지스터 묶음과 통신 패킷을 구조체로 표현하고, 메모리 정렬과 패딩을 확인합니다.

  9. 비트 연산

    AND로 지우고, OR로 켜고, XOR로 뒤집고, 시프트로 자리를 옮깁니다.

  10. volatile, const, static

    최적화를 막는 volatile, 값을 고정하는 const, 범위와 수명을 바꾸는 static.

  11. 전처리기와 매크로

    #define, 조건부 컴파일, 헤더 가드, 매크로가 만드는 함정.

  12. 빌드 과정

    전처리, 컴파일, 어셈블, 링크를 거쳐 실행 파일이 되는 흐름과 링크 오류 읽는 법.

확인 과제

비트 연산으로 가상 레지스터 다루기

32비트 변수 하나를 레지스터라고 보고, 원하는 비트만 켜고 끄는 함수를 만들어 봅니다.

세 가지에 모두 체크할 수 있으면 다음 과목으로 넘어가도 됩니다. 체크는 이 브라우저에만 저장됩니다.