티스토리 뷰

ARM Cortex-M

Start up 2

Just4Fun 2017. 2. 12. 10:10

심화 과정 중 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함