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 : 자체작성 함수 적으세요