Start 소스 분석
저번에 받은 Spark용 개발환경을 바탕으로 소스분석을 해보겠습니다.
아무래도 같은 STM32 코어를 사용하더라도 모듈마다 주변장치나 구성이 다르기 때문에 동작하는데 조금씩 차이가 있을것입니다. 하지만 같은 코어 기반이므로 동작원리는 거의 비슷하다고 보시면 될것 같습니다.
Spark -> Sprak:C -> core-firmware -> src -> startup -> startup_stm32f10x_md.S 로 들어갑니다.
.S확장자는 어셈블리어로 작성된 코드입니다.
어셈블리어는 컴퓨터 구조시간에 약간 본것 외에는 경험이 없어서 이곳저곳 찾아보면서 분석을 해야했습니다.
<소스코드>
Reset_Handler:
/* Copy the data segment initializers from flash to SRAM */
movs r1, #0 // r1 레지스터에 0을 넣는다.
b LoopCopyDataInit // LoopCopyDataInit으로 이동(jump) 함
CopyDataInit:
ldr r3, =_sidata // _sidata가 가르키는 메모리의 주소값을 r3 레지스터에 저장.
ldr r3, [r3, r1] // r1값을 offset으로 하여 r3+r1의 주소값을 r3에 불러온다.
str r3, [r0, r1] // r1값을 offset으로 하여 r0+r1의 주소값을 r3에 저장한다.
adds r1, r1, #4 // r1에 r1+4의 값을 저장한다.
LoopCopyDataInit:
ldr r0, =_sdata // r0에 _sdata의 주소값을 불러온다.
ldr r3, =_edata // r3에 _edata의 주소값을 불러온다.
adds r2, r0, r1 // r2에 r0+r1의 값을 저장한다.
cmp r2, r3 // r2와 r3값을 비교함.(Carry 생성)
bcc CopyDataInit // 캐리값이 없을경우 CopyDataInit으로 분기함
ldr r2, =_sbss // r2에 _sbss의 주소값을 불러온다.
b LoopFillZerobss // LoopFillZerobss로 이동(jump) 함.
FillZerobss:
movs r3, #0 // r3에 0을 저장.
str r3, [r2], #4 // r3에 r2+4의 값을 저장(store).
LoopFillZerobss:
ldr r3, = _ebss // r3에 _ebss를의 주소값을 불러온다.
cmp r2, r3 // r2와 r3값을 비교함.
bcc FillZerobss // 캐리값이 없을경우 FillZerobss으로 분기함
/* Call the clock system intitialization function. */
bl SystemInit // r14(LR)에 주소를 저장한후 SystemInit 함수로 이동.
/* Call the spark core configuration function. */
bl SparkCoreConfig // r14에 주소를 저장한후 SparkCoreConfig 함수로 이동.
/* Call C++ constructors. */
bl CallConstructors// r14에 주소를 저장한후 SparkCoreConfig 함수로 이동.
/* Call the application's entry point. */
bl main // r14에 주소를 저장한후 main 함수로 이동.
bx lr // thumb,ARM 모드변경후 lr 함수로 이동.
.size Reset_Handler, .-Reset_Handler
전체 말고 중요한 코드들만 복사해봤습니다. 한글로 된 주소는 구글링을 통해 명령어의 기능을 파악하여 적은것입니다. 아직 이해가 바탕이 되지 않았기 때문에 틀린 부분이나 어색한 부분이 있으나, 이해하는데는 큰 무리가 없어 보입니다. 추후 수정하도록 하겠습니다.
초기에 모듈에 전원이 공급되면 reset_Handler로 진입을 합니다. 함수의 몸체에서 보시는바와 같이 reset_handler의 수행이 완료 될시 LoopCopyDataInit로 분기를 합니다. 다시 LoopCopyDataInit의 함수 내부에서 다른 함수로 분기하고 이러한 과정들이 반복되며 함수가 수행되고, Main함수까지 진입을 하게 됩니다. 표로 도식화 하면 다음과 같습니다.
이 후 소스를 더 분석하기 위해서 reset_handler 다음의 함수들이 어떤식으로 구성되어있는지 일일히 찾아봐야 할 것 같습니다. 예를들어 systemInit에는 시스템이 동작하기 위해 클럭이 세팅되는 함수들이 있겠지요. 초기 실행하는 함수들을 다 이해하면 stm32에대한 이해가 많이 높아 졌다고 보시면 될것 같습니다. 프로그래밍은 주변장치에 대한 클럭 인가와 레지스터 설정만 해주면 되기 때문이죠.
다음은 더 내부로 들어가 표에 있는 함수들을 더 깊게 분석해 보도록 하겠습니다.
'개발' 카테고리의 다른 글
[생산] PCB란 (0) | 2017.04.18 |
---|---|
[생산] SMT란 (0) | 2017.04.18 |
[Spark] 스파크 모듈 소개 (0) | 2017.04.18 |
[Spark] 스파크 모듈 개발환경 구축 (0) | 2017.04.18 |
[Smartrobot] 아두이노 포팅 (0) | 2017.04.18 |
댓글