2016-07-07 2 views
0

나는 raspbery pi model b ARM1176 bare metal (어셈블리 및 c)을 프로그래밍 중입니다. 어셈블리 코드를 실행하는 데 사용 된 클럭 사이클을 계산해야합니다. ARM11 8 파이프 라인을 가지고 있기 때문에 올바른 보인다 내가 r1=8r0=0 얻을 내 코드, 대신에ARM11의 PMU 카운터

add r3,#3 

가있는 경우이에서

mov r0,#1 

MCR p15, 0, r0, c15, c12, 0 ; Write Performance Monitor Control Register 
    /* Reset Cycle Counter */ 

mov r0,#5 

MCR p15, 0, r0, c15, c12, 0 ; Write Performance Monitor Control Register 
    /* Meaure */ 

MRC p15, 0, r0, c15, c12, 1 @ Read Cycle Counter Register 

<MY CODES> 

MRC p15, 0, r1, c15, c12, 1 @ Read Cycle Counter Register 

:
나는 PMU 카운터 다음 코드를 사용하고 스테이지를 실행하기 위해서는 8 클록 사이클이 걸립니다.

add r3,#3 

add r4,#1 

r0=0,r1=97/96/94 (the result of r1 should also be constant!!!) 

같은

하지만 더 많은 명령을 추가 할 때 내가 얻고 말도 안되는 결과는 내가 전무에 레지스터의 결과를 볼 수 uart을 사용하고 있습니다.

답변

0

좋아요, 똑같은 것을 보니 매우 흥미 롭습니다. 내가 그렇게 R2에 엉망이 스택에 저장해야합니다 테스트중인 코드에서 R4로 깨끗이 그래서 만약

@ nop 
.globl test 
test: 
    mov r0,#1 
    MCR p15, 0, r0, c15, c12, 0 
    mov r0,#5 
    MCR p15, 0, r0, c15, c12, 0 
    MRC p15, 0, r0, c15, c12, 1 

    add r3,#3 
    add r2,#1 

    MRC p15, 0, r1, c15, c12, 1 
    sub r0,r1,r0 
    bx lr 

나는 C에서이 호출하고있다. add r2 라인이 없으면 리턴 값은 8이고 add r2 라인의 경우 리턴 값은 0x68이었고 0x65였습니다. 이 점은 파이 제로에 있음에 유의하십시오. 그래서 약간의 시계는 당신보다 약간 빠릅니다.

이것은 드럼과 드럼에서 실행된다는 것을 기억하십시오. 고통스럽게 느립니다. 그래서 당신은 그 중 일부를 볼 수 있습니다.

코드의

초기 정렬 :

00008024 <test>: 
    8024: e3a00001 mov r0, #1 
    8028: ee0f0f1c mcr 15, 0, r0, cr15, cr12, {0} 
    802c: e3a00005 mov r0, #5 
    8030: ee0f0f1c mcr 15, 0, r0, cr15, cr12, {0} 
    8034: ee1f0f3c mrc 15, 0, r0, cr15, cr12, {1} 
    8038: e2833003 add r3, r3, #3 
    803c: e2822001 add r2, r2, #1 
    8040: ee1f1f3c mrc 15, 0, r1, cr15, cr12, {1} 
    8044: e0410000 sub r0, r1, r0 
    8048: e12fff1e bx lr 

네를, 나는 .globl 시험의 앞에 NOP의 주석을 해제하고, 나는 단지 테스트중인 코드와 추가 R3를 추가 R2를 주석 경우 만 nop은 전체 코드 블록의 정렬을 푸시합니다. r3을 추가하고 nop을 사용하지 않으면 r3을 추가하여 8 카운트를 얻고 nop을 사용하면 0x67 카운트를 얻습니다.

그래서 이것은 가져 오기를 측정하는 경우에 불과하다고 생각합니다. 나는 암 캐시를 활성화하지 않았지만이 램이 암과 GPU간에 공유되기 때문에 더 깊은 캐시 나 mmu 또는 기타가있을 수 있습니다.

한 단계 더 나아가 nop을 주석 처리하지 않은 경우 r3을 추가하고 r2를 추가하면 0x69가됩니다. 또는 근본적으로 동등하거나 간신히 하나의 명령보다 길기 때문에 우리는 거기에서 페치를 강요했습니다.

는 그래서 계산의 초기 읽기는 8 워드 경계에 정렬되도록 좀 더 NOP를 추가, 나는 두 개의 지침이있는 경우 제 경우는 내가 8의 수를 얻을
00008030 <test>: 
    8030: e3a00001 mov r0, #1 
    8034: ee0f0f1c mcr 15, 0, r0, cr15, cr12, {0} 
    8038: e3a00005 mov r0, #5 
    803c: ee0f0f1c mcr 15, 0, r0, cr15, cr12, {0} 
    8040: ee1f0f3c mrc 15, 0, r0, cr15, cr12, {1} 
    8044: e2833003 add r3, r3, #3 
    8048: e2822001 add r2, r2, #1 
    804c: ee1f1f3c mrc 15, 0, r1, cr15, cr12, {1} 
    8050: e0410000 sub r0, r1, r0 
    8054: e12fff1e bx lr 

를 I 측정된다. 나는 거기에 3 번째 명령을 넣고 r3을 추가하고 2 번째 명령을 r2s를 추가한다. 여전히 카운트가 8입니다.

이 부분으로 돌아 가면 적어도 부분적으로 다른 페치 라인에 있습니다.

00008024 <test>: 
    8024: e3a00001 mov r0, #1 
    8028: ee0f0f1c mcr 15, 0, r0, cr15, cr12, {0} 
    802c: e3a00005 mov r0, #5 
    8030: ee0f0f1c mcr 15, 0, r0, cr15, cr12, {0} 
    8034: ee1f0f3c mrc 15, 0, r0, cr15, cr12, {1} 
    8038: e2833003 add r3, r3, #3 
    803c: e2822001 add r2, r2, #1 
    8040: ee1f1f3c mrc 15, 0, r1, cr15, cr12, {1} 
    8044: e0410000 sub r0, r1, r0 
    8048: e12fff1e bx lr 

그리고 난 아무것도 변경하지 않고 3 실점을 한 다음 L1 캐시 (명령)를 사용하고 그래서 난 당신이 느린 DRAM 다루고있는 생각 세 이상 실행 내가

00000068 
0000001D 
0000001D 
0000001F 
00000008 
00000008 

을받을 수 있나요 라인 페치, 캐시 미스 및 히트 및 결과 캐시 라인 페치.

명령어를 실행하는 데 걸린 클럭 수를 예상하는 경우 l1 캐시에서 테스트중인 전체 코드를 유지할 수 없다면 대기 상태 메모리가 없습니다.

나는이 칩/보드를 위해 이런 종류의 것을 사용할 수있는 칩 sram이 없다고 생각한다. 결국 당신은 드럼을 치는 것을 끝낼 것이며 그 드럼은 gpu와 공유된다. 그래서 기본적으로 프로그램 실행 시간은 결정적 일 것으로 예상되지 않으며 컴퓨터 나 전화 또는 다른 컴퓨터와 마찬가지로 병목 현상이 오랫동안 발생하지 않았기 때문에 데이터 또는 지침을 제공 받기 위해 대기 중입니다.