티스토리 뷰
심화 과정 중 crt0에서 설명하였듯이 Reset 상태에서 main() 함수까지 진입하기 전에 처리해 주어야 하는 과정이 필요하다.
이번 글에서는 어셈블 코드로 작성했던 AVR과는 달리 C코드로 crt0 코드를 작성해 보도록 하겠다.
vector.c 파일안에 있는 Reset_handler() 함수를 다음과 같이 수정한다.
5번 줄에서 외부 변수들을 참조하겠다고 선언하였는데, 이러한 외부 변수들은 소스코드내에서 선언한 것들이 아니고 linker script에서 선언한 변수들이다.
10~12번줄은 flash memory 영역의 text섹션 다음에 연달아 기록되어 있는 data 섹션을 원래 있어야 될 영역인 SRAM으로 복사해주는 코드이다.
_etext의 주소는 ROM에 기록되어 있는 data 섹션의 시작주소와 동일한 값을 가지고 있다. 이 주소를 source address로 사용하게 된다.
_sdata의 주소는 실제 data 섹션이 존재해야 되는 RAM의 시작 주소를 가지고 있다. 이 주소를 destination address로 사용하게 된다.
Destination address가 data 섹션이 끝나는 주소보다 작으면 루프를 수행하게 된다.
16~18 줄은 bss 영역을 0으로 초기화 주는 코드이다.
ARM의 경우 memory space를 code 영역과 data 영역이 통합된 단일 영역을 사용하므로 이런 식으로 C코드로 작성할 수 있지만, AVR의 경우 code 영역과 data 영역이 서로 독립적으로 분리되어 있기 때문에 C코드로 작성이 불가능하다. 굳이 C코드로 작성하려면 못할수도 없지만, 최소한 inline assemble 코드를 사용하여야 가능하다.
'ARM Cortex-M' 카테고리의 다른 글
Clock 설정 (0) | 2017.02.17 |
---|---|
GPIO를 통한 LED 제어 (0) | 2017.02.12 |
Start up (17) | 2017.02.11 |
디버거/프로그래머 연결 (0) | 2017.02.11 |
프로그램 개발 환경 설정 (0) | 2017.02.11 |