[펌웨어설계] 4. CPU 초기화 코드 설계

Sireal·2022년 2월 7일
1

펌웨어 설계

목록 보기
4/16

CPU 초기화 코드 소개

  • 처음 전원이 들어온 후 CPU가 본연의 기능을 하기 위해 초기화 해야하는 블록들을 초기 설정하는 코드

초기화코드 일반적인 과정

  • 초기화 코드 작성 > Reset벡터 시작 > 데이터의 복사 (ROM->RAM) > Main함수로 점프 > 주변장치 초기화
    • 초기화 코드 작성 : 어셈블리어로 작성된다.
      CPU의 Clock과같은 기본적인 것들을 초기화 한다.
    • Reset 벡터 시작 : Reset 벡터라는 어드레스로 싲가해서 순차적으로 코드를 실행한다.
    • 데이터의 복사 : RAM의 Stack과 Heap 등 기능별 영역으로 나누어 초기화 함. 이외 라이브러리 함수또한 초기화
    • Main 함수로 점프
    • 주변장치 초기화 : GPIO,Flash메모리, clock, Uart등을 초기화

칩 내부구조

  • Arm Core_주 연산장치
  • IP : Intellectual Property, USB, Eathernet등의 하드웨어 블록
  • SoC : System on Chip : Core 외 필요한 IP들을 추가한 칩을 말함.

ARM Coretex-M4 Processor

  • FPU : 소수점 연산가 있는 Coretex-M4 Core
  • NVIC : 인터럽트 컨트롤러
  • 디버깅 관련장치 : FPB, DWT, ITM 등
  • 메모리 보호 블록 : MPU
  • AHB, AHB AccessPort, BusMatrix : APB와 같은 버스를 연겷하기 위한 장치
  • Processor와 USB나 이더넷 과 같은 컨트롤러 를 연결하기 위해 AHB, APB 버스가 필요함 : AMBA버스
    • 버스 : Address와 여러가닥의 데이터 라인으로 이루어진 통신포트

Coret 레지스터

  • 내부레지스터(이름이 R로 시작하는 크기가 32비트)들이 존재
    | R0 | ... | R12(SP) | R14(LR) | R15(PC) | xPSR |
    • 각각 32비트, 18개
    • R0 ~ R12 : 13개의 범용 레지스터, 일반적인 데이터 연산을 위해 사용
    • R13(SP) : Stack Pointer
      • SP_Process, SP_Main 이라는 Banked레지스터를 말한다.
        • SP_Main_MSP : OS커널, exeption에서 사용
        • SP_process_PSP : 사용자 어플리케이션 코드에서 사용
    • R14(LR) : Link레지스터_ 함수호출시 되돌아올 주소 저장
    • R15(PC) : Program Counter 레지스터. 현재 실행하는 명령어 위치를 나타낸다.
    • xPSR : Special-Purpose Program Status Register, 특정 상황 수행후 상태를 확인하는 레지스터

프로세서 동작 모드와 특권레벨

  • 동작 모드 : Thread 모드, Handler모드
    • Thread Mode : 어플리케이션 프로그램 실행시 사용. 프로세서가 Reset되면 이 모드가 됨
      • System Clock Block 같은 중요한 정보 접근이 근본적 차단.
    • Hanlder Mode : OS 커널, Exception 핸들러등이 실행할 때 사용되는 모드. System Control Block 접근 가능.
  • 특권레벨 : Privileged level, Unprivileged level
    • Privileged 레벨 : 모든 명령어와 모든 메모리 범주에 접근이 가능함.
    • Unprivileged 레벨 : MSR, MRS같은 일부명령어는 접근 불가. SystemTimer, NVIC, SCB등의 접근이 제한됨.

ARM Cortex-M4 어셈블리어

  • 어셈블리어를 다른 용어로 Instruction set이라고 함
  • 32비트 명령어로 이루어짐 : 최종 기계어는 커파일 후 32비트 숫자갑으로 이루어짐.
  • 어셈블리어 플로우
    • InstructionSet, 레지스터
    • 명령어, 레지스터
Reset Handler: /* 레이블 */
  ldr sp, = estack /* set STack Pointer */
movs r1, #0
  b LoopCopyDataInit /* banch (명령어) LoopCopyDataInit이라는 레이블로 점프하라 라는 뜻.*/

초기화 코드 분석

  • 초기화 파일 : CubeMX를 사용하여 생성한 프로젝트에 초기화파일은 보통 startup_stm32f4nnxx.s 이다.
    • GNU 계열 어셈블리에서 주로 사용되는 파일 확장자
  • CPU 부팅을 제일 먼저 reset Vector로 점프하여 resethandler를 수행.
  • 주요동작
    • Reset 핸들러 : cpu가 부팅 후 제일 먼저 실행하는 코드
    • CopyDataInit : Flash메모리에 저장된 값들을 data 영역 메모리로 복사하여 초기화
    • LoopCopyDataInit : 데이터 영역과 bss 영역을 초기화 하는 함수
    • LoopFillZerobss : bss 영역의 메모리를 0으로 초기화
    • SystemInit : Clock, 인터럽트 설정, 외부메모리, FPU설정 등을 설정
    • bl main : C언어의 시작점인 main으로 점프시켜줌
  • Linker Script : 컴파일 후 링크 시 사용하는 값들을 정리한 스크립트 파일을 말함
    • 링크 : object파일들을 합쳐 하나의 출력파일로 만드는 과정
    • 수많은 상수들, RAM,ROM 시작주소와 크기, resetvector의 위치, stack과 heap의 크기 등 지정되어있음.
    • Main.c
      • HAL_Init함수 : Hardware Abstraction Layer약자
        • 하드웨어, 시스템클락 등 초기화
      • SystemClock Config : SystemClock 초기화 함수
      • MX_GPIO_Init 함수 :GPIO를 초기화 하는 함수
      • 무한 while 문.
  • STM32f4xx_it.c : 인터럽트 핸들러들이 모여있는 파일
    • Src 디렉토리에 위치. CubeMX로 특정 인터럽트를 활성화 하면, 이파일에 활성화된 인터럽트의 핸들러가 자동으로 생성됨.
    • NMI_Hanlder : Non Maskable Interupt 핸들러
      • 무조건 발생하는 인터럽트 핸들러
      • ARM 사의 고유 인터럽트 중 하나. 유저Code 삽입가능
    • User Code Begin~ User Code End : 자체작성 함수 적으세요
      • 이런곳에 코드를 써야 리셋 안먹음.
profile
🚄계속 앞으로🚄

0개의 댓글

관련 채용 정보