부팅 시퀀스 과정은 쉽게 설명하면 다음의 경우에 이뤄집니다.

  • 디바이스에 전원을 인가할때
  • 리셋 버튼 누를 때

두 가지 모두 부팅이 이루어지기 때문에 하나의 설명으로도 충분합니다.

우선 우리가 디바이스를 구동시키기 위한 소스코드가 어디에 저장되는지 알아야합니다.

코드는 Flash 영역에 저장됩니다. 0x0800 0000 - 0x080F FFFF 영역인데요, 바이너리가 이 영역을 벗어날 정도로 크면 안되겠죠.

그리고 vector table을 알아야 합니다. vector table은 exception과 interrupt service routine 어드레스를 가지고 있습니다.

cortex-m4의 vector table은 아래와 같습니다.

그림에서 0x0000 0000은 비어있는데 이것은 초기 Stack Pointer 값을 가지고 있기 때문입니다. 그리고 0x0000 0004는 reset handler의 주소를 가지고 있습니다. 만일 리셋 버튼을 누르거나 전원을 공급한다면 아래 절차가 수행됩니다.

  1. PC(program counter)는 0x0000 0000으로 로드됩니다. 즉 현재 프로세스의 흐름은 0x0000 0000입니다.
  2. 0x0000 0000이 Stack pointer 값을 가진 후, MSP(main stack pointer)로 fetch됩니다. 그러면 fetch된 값이 스택의 entry 주소입니다.
  3. 그리고 PC는 Reset handler의 주소를 가지게 됩니다.

이 3단계는 하드웨어에 의해서 행해집니다. 그리고 이것은 하드웨어 아키텍처에 따라 조금씩 상이하다는것을 의미합니다.

위 3단계가 끝나면 reset handler는 아래 절차를 수행합니다.

  1. 시스템을 초기화
  2. 초기화된 global variable, static variable(.data)를 SRAM에 copy합니다.
  3. 초기화되지않은 data(.bss)를 SRAM에 copy하고 0으로 초기화합니다.
  4. 그리고 소스코드상의 main()을 호출합니다.

 

 

 

 

'STM32F4 계열 레퍼런스' 카테고리의 다른 글

Memory map  (0) 2022.03.03

프로세서의 메모리 모델은 다음과 같습니다.

메모리 맵

우선은 Code 영역을 분석하겠습니다.(한꺼번에 포스팅하기에는 내용이 넘 많은것같네요 ㅜ.)

code region은 아래와 같이 설명하고 있습니다.

Instruction fetches are performed over the ICode bus. Data accesses are performed over the DCode bus.

그리고 code region의 디테일은 아래와 같습니다.

디테일

  • Flash : 프로그래머가 작성할 코드는 이 영역에 저장됩니다. Flash의 사이즈 또한 offset을 이용해 확인할 수 있습니다.
  • System memory + OTP : 일단 system memory은 ROM입니다. ROM에는 bootloader라고 불리우는 프로그램이 저장돼 있습니다. bootloader는 각각의 vendor(TI, ST 등등)들이 chip을 생산할때 자체적으로 제작해서 집어넣습니다.
    또한 0x1fff 0000 ~ 0x1fff ffff는 bootloader를 위해서 예약된 ROM region입니다.

    The boot loader is located in system memory. It is used to reprogram the Flash memory by using USART1 (PA9/PA10), USART3 (PC10/PC11 or PB10/PB11), CAN2 (PB5/PB13), USB OTG FS in Device mode (PA11/PA12) through DFU (device firmware upgrade).

'STM32F4 계열 레퍼런스' 카테고리의 다른 글

부팅 시퀀스  (0) 2022.03.13

+ Recent posts