본문 바로가기
  • Welcome.
기타

[ARM 컴퓨터 구조] delay_loop 구현 및 가상 머신 테스트 구현 과제 - 해결 과정 - 도전1트

by EunBird 2023. 6. 12.

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으로 설정

 

delay 루프 수행 후 states 값이 24000004 가 되는 것을 확인


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

0x4000000 위치부터 복사 루프당 4바이트씩 복사되어 쓰여지는 것을 확인.

728x90

댓글