2017-11-18 2 views
0

어셈블리 언어로 1 초 지연 루프를 쓰고 싶습니다. 루프의 카운트가 1 초가 될 것입니다. 나는 Beaglebone 블랙을 사용하고어셈블리에서 지연 루프의 타이밍을 올바르게 설정하는 방법은 무엇입니까?

MOV R1, #count 

DELAY_LOOP: 
      SUBS R1, R1, #1 

      BNE DELAY_LOOP 

: 여기

는 내가 지금까지 가지고있는 것입니다. 미리 감사드립니다!

+1

타이머 인터럽트를 사용할 수있는 경우이를 대신 사용해보십시오. – Thilo

+1

클럭 속도와 사용하는 각 명령어의 클럭 수를 확인하십시오. 그런 다음 나누십시오. 또는 게으르다가 많은 정밀도를 필요로하지 않는다면 거기에 큰 숫자를 넣고 시계에 코드를 기록한 다음 다시 스케일합니다. – Jester

+0

특히 현대 CPU에서는; 클럭 속도는 CPU마다 다르며 CPU가 작동하는 동안 변경 될 수 있습니다 (예 : 전원 관리로 인해).Beaglebone Black이 사용하는 SoC가 지원하는 "동적 CPU 주파수 스케일링"기능); 그런 일들이 가능하지 않다면 루프를 "임의로"만들어야하는 것보다 오래 걸리는 IRQ가 있습니다. 이러한 이유 때문에 지연 루프는 거의 항상 버그입니다. 올바른 수를 결정하는 것이 불가능하기 때문입니다 (심지어 버그가 아닌 경우에도 이식성 및 유지 보수 재난입니다). 대신 실제 하드웨어 타이머를 사용해야합니다. – Brendan

답변

0

특히 운영 체제에서이 코드를 실행하는 경우 ARM에 적합하지 않습니다. 정확하지 않을 수 있습니다. 순수한 베어 메탈, 인터럽트가 없으면 실험적으로 조정할 수 있지만, 정렬을 변경하면 성능이 상당히 바뀔 수 있습니다. 대부분의 사람들이 캐싱을 할뿐만 아니라 가져 오기 라인이있는 곳과 스위트 스폿 분기 예측이있는 경우 분기 예측 및 구현 방법 나는이 정확한 루프를 사용하여 약간의 문제가 있음을 보여줍니다.

문제는 ARM에만 국한되지 않습니다. 파이프 라인은 가져 오기 트랜잭션 당 두 개 이상의 명령어를 가져 오는 경우가 많으며 성능상의 이유로 페치가 정렬 된 경계에있는 경우가 많으며이 데이터를 수신하는 프리 페치 버퍼에 워터 마크가 있습니다 다음 페치를 수행 할시기를 결정하는 두 명령의 위치는 루프의 위치에 따라 실행 성능에 혼란을 줄 수 있습니다. 기본적으로 루프 당 두 개의 페치 행 또는 루프 당 하나이며 캐시는 첫 번째 통과를 넘어 관련이 없습니다. 하나 또는 두 개의 페치 (fetch) 행이 여전히 캐시에 도달 할 수 있습니다.

그러나이 모든 것은 아키텍처에 따라 다릅니다. Mips를 파이프, 팔, x86, powerpc 등으로 가져오고 버퍼링하는 작업은 모두 다양하며 아마도 3 년마다 해당 아키텍처의 Rev 또는 세대에 따라 다를 수 있습니다.

ARM 및 MIPS 및 다른 IP 기반 코어 (칩 공급 업체가 메모리 시스템을 구현하는 경우)와 동일한 정확한 코어 버전을 사용할 수 있지만 칩 공급 업체 또는 제품군을 칩 공급 업체 또는 가족과 차별화 할 수 있음/ 은 성능에 영향을 미칠 수 있으므로 하나의 칩에 가깝게, 같은 정렬 및 기타 코어 설정 성능은 칩 공급 업체/메모리 측면에서 기반으로 다를 수 있습니다. 이 방정식에 DRAM을 추가하십시오. 여기서 메모리의 성능은 결정적이지 않으며 단지 훨씬 더 나쁜 것으로 나타납니다.

실행이 한 번에 한 명령 씩 예측 가능한 파이프 라인 이전 날짜로 돌아 가면 일반적으로 사용되는 시간 지정 루프가 예전 PIC 명령어 세트로 수행되며 매우 예측 가능하며 일반적이지 않습니다. 타이머 대신 사용되는 시간 지정 루프를 참조하십시오. 다른 mcus 및 아키텍처 (실패 할 경우에만)를 사용하여 해당 아키텍처에서 배운/보았던 많은 사람들에게이 작업을 시도했습니다.

이것은 매우 교육적인 연습이며 시도해 보시기 바랍니다. 타이머를 참조로 사용하고 테스트중인 코드 전후의 단일로드 명령어로 이상적으로 샘플링하십시오. 운영 체제에서이 모든 작업을 수행하는 경우에는 차이점에 대해 자세히 알지 못하는 정도의 노이즈가있을 수 있습니다. 전반적인 타이밍에 추가되는 다른 사이클 스틸러, 특히 테스트중인 코드 전후의 시간을 얻기위한 호출을 생성하게됩니다.

관련 문제