Skip to content

MeawMye/ARMv7-BareMetal-Analysis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ARMv7 BareMetal Project for Study

개요

이 리포지토리는 ARMv7-A/R 환경에서 동작하는 최소 단위 커널/타이머/태스크 스케줄러 학습용 예제입니다. 주요 목적은 태스크 생성, 컨텍스트 스위칭, 간단한 인터럽트 기반 타이머와 UART 등 HAL(하드웨어 추상화 레이어)을 통해 시스템 초기화와 실행 흐름을 이해하는 것입니다.

디렉터리 구조

  • boot/

    • Entry.S : CPU 진입점, 초기 스택/벡터 테이블 설정.
    • Handler.c : 인터럽트/예외 핸들러.
    • Main.c : 부트 이후 최초 C 함수 호출 및 커널 시작부.
  • hal/

    • HalInterrupt.h : 인터럽트 enable/disable, priority 제어.
    • HalTimer.h : 타이머 설정 및 유틸 함수.
    • HalUart.h : UART 송수신 추상화.
    • rvpb/ : 실리콘 레지스터 기반 드라이버 (Interrupt/Timer/Uart).
  • include/

    • ARMv7AR.h, MemoryMap.h 등 CPU/메모리 맵 정의.
    • stdint.h, stdbool.h, stdarg.h : 표준 자료형, 가변인자 등.
  • kernel/

    • Kernel.c, Kernel.h : 태스크 및 스케줄러 메인 로직.
    • task.c, task.h : 태스크 제어 블록(TCB), 컨텍스트 스위칭 구현.
  • lib/

    • armcpu.c, armcpu.h : 기본 CPU 코드(어셈블리 인터페이스).
    • stdio.c, stdlib.c : 간단 lib 지원.

레이어 설명

  1. 하드웨어 레이어 (HAL)

    • hal/hal/rvpb/ 소스가 하드웨어를 직접 초기화하고 제어.
    • 타이머 인터럽트, UART 출력/입력, 인터럽트 컨트롤러를 추상화.
  2. 커널 레이어

    • kernel/에 태스크 생성, 스케줄링 및 컨텍스트 스위칭 구현.
    • 태스크 상태 관리, 우선순위(필요하면)와 데이터 구조.
  3. 애플리케이션 레이어

    • boot/Main.c에서 초기화 후 테스트 태스크를 등록하고 스케줄러 시작.

초기화 흐름

  1. Entry.S 진입

    • CPU 모드 설정, 벡터 테이블, 스택 포인터.
  2. C 런타임/데이터 초기화 (부트 코드)

    • .data, .bss 초기화, 전역 변수 초기화.
  3. Main.c

    • HAL 초기화 (HalUart_Init, HalTimer_Init, HalInterrupt_Init).
    • 커널/태스크 초기화 (Kernel_Init, Task_Create).
  4. 타이머 인터럽트 활성화

    • 주기적 틱 생성, 스케줄러 트리거.
  5. 커널 시작

    • 첫 태스크 컨텍스트로 전환 후 태스크 실행.

HAL 인터페이스

  • HalUart

    • HalUart_Init(): UART 설정.
    • HalUart_SendChar(), HalUart_SendString(): 출력.
    • HalUart_RecvChar(): 입력(폴링).
  • HalTimer

    • HalTimer_Init(tick_ms): 타이머 모드/주기 설정.
    • HalTimer_OnTick(): 틱 핸들러 콜백.
  • HalInterrupt

    • HalInterrupt_Enable(), HalInterrupt_Disable().
    • HalInterrupt_Register(vector, handler) (가능 시).

rvpb 레지스터 드라이버

  • rvpb/Interrupt.c : NVIC/프로그램 인터럽트 레지스터 제어.
  • rvpb/Timer.c : 타이머 매치/재로드 설정.
  • rvpb/Uart.c : UART FIFO, 통신 속도, 상태 확인.

기능 설명

  • 태스크 스케줄러

    • 간단한 라운드 로빈 또는 우선순위 기반 전환.
    • 타이머 틱에 의해 Kernel_TriggerContextSwitch() 호출.
  • 컨텍스트 스위칭

    • 각각 태스크 잠재 상태(R0-R12, SP, LR, PC, CPSR) 저장/복원.
    • task.c에서 Task_SaveContext, Task_RestoreContext에 구현.
  • UART 디버깅

    • printf 스타일 출력과 로그 메시지를 통해 상태 확인.
    • 태스크 전환 로그, 인터럽트 발생 및 타이머 틱 메시지.
  • 예제 태스크

    • LED 토글 또는 시리얼 카운트 출력 (플랫폼 의존).
    • CPU 사용률과 스케줄링 동작 검증.

빌드/실행

  • Makefile에 정의된 빌드 규칙 사용.
  • 예: make all / make run (실행 대상 플랫폼에 따라 수정 필요).

확장 포인트

  • 더 많은 태스크 상태 (대기, 대기중, 블록 등) 추가.
  • 세마포어/뮤텍스, IPC 큐, 이벤트 플래그 구현.
  • 사용자 모드/시스템 모드 분리(RUN/IRQ/SVC 등).

문서 요약

  • boot/ : 부트스트랩 및 예외
  • hal/ : 하드웨어 추상화
  • kernel/ : 스케줄러/태스크 관리
  • lib/ : 표준 라이브러리 지원
  • 초기화: Entry.S -> Main.c -> HAL -> 커널
  • 기능: 타이머 기반 컨텍스트 스위칭 + UART 로깅

About

ARMv7 bare-metal boot process and BSP analysis on RealView PBA8 using QEMU

Topics

Resources

Stars

Watchers

Forks

Contributors