Problem1
; Delay 루프 코드
lowlevel_init
; Add delay of 40ms
LDR r3, =600000 ; 딜레이 루프를 600,000번 수행하도록 지정
delay_loop
SUBS r3, r3, #1
BNE delay_loop
피드백 주신 부분 참고하여 60Mhz 에서 40ms 의 딜레이를 만드는 정상적인 방법으로 딜레이 루프 반복 횟수를 찾아냈습니다.
💡 60 MHz --> 1초에 60,000,000 번의 클럭 신호
40ms = 0.04s ⇒ 클럭 주파수 x 시간 = 60,000,000 Hz x 0.04 초 = 2,400,000 클럭 주파수
따라서, 0.04 초 (40 ms)에는 2,400,000 번의 클럭 주파수가 발생합니다.
💡 이때, 딜레이 루프(SUBS, BNE 명령)에서 4사이클이 소모되기 때문에
(실제 디버깅해보면 루프 한번당 4states 증가함을 확인)
0.04ms (2,400,000사이클)을 소모하기 위해서는
딜레이 루프를 2400000 / 4 = 600000 번 지나면 됨 따라서 r1의 초기값은 600,000으로 설정
Problem2
ROM과 RAM의 주소를 설정하고 루프 반복 횟수를 0x1000으로 지정.
이후에 copy_code_block 에서 ROM위치에서 RAM위치로 4바이트씩 복사.
한번 복사할 때마다 0x4씩 감소시켜서 r2값이 0이 될때까지만 복사.
이후 0x40000000 위치로 점프
; Setting ROM and RAM address
LDR r0, =0x40000000 ; RAM 영역 시작 주소
LDR r1, =0x0 ; ROM 영역 시작 주소
LDR r2, =0x1000 ; 복사할 코드 블록 크기
copy_code_block ; ROM -> RAM 으로 코드 블록 복사
LDR r4, [r1], #4 ; ROM위치에서 4바이트 로드하고 4바이트 증가
STR r4, [r0], #4 ; 로드한 값 RAM위치에 저장하고 주소 4바이트 증가
SUBS r2, r2, #4 ; 남은 복사 횟수 계산
CMP r2, #0
BNE copy_code_block
; ----- ----- ------
; 복사 이후
LDR r0, =0x4000000
BX r0 ; 복사한 값들이 있는 AM 주소(0x40000000)로 이동
최종 코드.
arm 7TDMI 어셈블리 코드이다.
GLOBAL Reset_Handler
AREA Reset, CODE, READONLY
ENTRY
Reset_Handler
; Delay 루프 코드
lowlevel_init
; Add delay of 40ms
LDR r3, =600000 ; 딜레이 루프를 600,000번 수행하도록 지정
delay_loop
SUBS r3, r3, #1
BNE delay_loop
; ----- ----- ------
; Setting ROM and RAM address
LDR r0, =0x40000000 ; RAM 영역 시작 주소
LDR r1, =0x0 ; ROM 영역 시작 주소
LDR r2, =0x1000 ; 복사할 코드 블록 크기
copy_code_block ; ROM -> RAM 으로 코드 블록 복사
LDR r4, [r1], #4 ; ROM위치에서 4바이트 로드하고 4바이트 증가
STR r4, [r0], #4 ; 로드한 값 RAM위치에 저장하고 주소 4바이트 증가
SUBS r2, r2, #1 ; 남은 복사 횟수 계산
CMP r2, #0 ; 0 인지 확인
BNE copy_code_block ; 0 아니면 반복
; ----- ----- ------
; 복사 이후
LDR r0, =0x40000000 ; 복사한 코드 블록 주소
BX r0 ; 복사한 값들이 있는 에뮬레이션 RAM 주소(0x40000000)로 이동
END
728x90
'기타' 카테고리의 다른 글
CV (Curriculum Vitae) - EJ (0) | 2023.06.28 |
---|---|
[ARM 컴퓨터 구조] delay_loop 구현 및 가상 머신 테스트 구현 과제 - 문제 (0) | 2023.06.12 |
댓글