2014-11-23 8 views
2

ARM Cortex-M4 프로세서와 함께 STM32F429를 사용하고 있습니다. 나는 ARM 어셈블리를 모른다는 것을 전제로하지만, 코드를 최적화해야한다. 내가 필요하지만,이 솔루션은 코어 텍스 A8을 위해입니다C에서 ARM Cortex-M4 프로세서의 경과 시간을 측정하는 방법은 무엇입니까?

How to measure program execution time in ARM Cortex-A8 processor?

의 솔루션을 읽어 보시기 바랍니다. 충동, 나는 내 코드에 위의 링크의 코드를 구현하려하지만 난이 시점에서 SEGV을 구하십시오

가 어떻게 ARM 코어 텍스 M4에서 수행이 어셈블리 코드를 조정할 수 있습니다

if (enable_divider) 
    value |= 8;  // enable "by 64" divider for CCNT. 

    value |= 16; 

    // program the performance-counter control-register: 
    asm volatile ("MCR p15, 0, %0, c9, c12, 0\t\n" :: "r"(value)); /*<---Here I have SEGV error*/ 

    // enable all counters: 
    asm volatile ("MCR p15, 0, %0, c9, c12, 1\t\n" :: "r"(0x8000000f)); 

    // clear overflows: 
    asm volatile ("MCR p15, 0, %0, c9, c12, 3\t\n" :: "r"(0x8000000f)); 
?

+0

안녕하세요. Chris. 나는 링크에 대한 대답을 읽었다. Throwback1986에 의해 주어진 다른 링크에서, 그는 DWT_CYCCNT를 사용할 것을 제안합니다. 승인. 하지만, 솔루션을보고, 내 코드 (내 질문의 코드를 사용하여) 구현하는 방법을 이해하지 않습니다. 실례합니다. ARM 프로세서의 어셈블리에 초보자입니다. ( – Anth

+0

대부분의'MCR p15' 명령은 ** 사용자 모드 **에 있지 않다고 가정합니다 ** 또한 CPU 용이라면 괜찮습니다; 대부분의'MCR p15' 명령은 CPU (Cortex-M 또는 Cortex-M3)에만 해당해야합니다. –

+0

SEGV (하드 포일이라고 가정)는 클럭 전원을 켜지 않고도 일부 하드웨어에 액세스했기 때문일 수 있습니다. ARM은 마이크로 컨트롤러가 저전력 모드에서 작동한다는 것을 알아야합니다. 즉, 주변 장치를 직접 켜야한다는 의미입니다. 먼저 전원을 켜지 않고 주변 장치에 액세스하면 예외가 발생합니다 (예 : 내 대답 아래에 내 대답에 언급 한 설명서를 참조하십시오. –

답변

0

Ditch the Cortex-A8 방법.

이것은 대부분의 코어 텍스 M 기반 마이크로 컨트롤러를 할 수있는 올바른 방법이다 (SysTick을 사용하지 않습니다!) :

  1. 는 CPU와 같은 속도로 실행되는 타이머를 설정합니다.
  2. 타이머에 인터럽트를 연결하지 마십시오. 측정을 시작하기 전에
  3. 단일 LDR 명령을 사용하여 타이머 값을 폴링하십시오.
  4. 'NOP'명령 측정 할 코드를 실행하십시오. 'NOP'실행
  5. 명령 측정을 끝내면 단일 LDR 명령어
  6. 을 사용하여 타이머 값을 폴링합니다.

NOP 지침은 파이프 라이닝이 결과를 방해하지 않는지 확인하기위한 것입니다. 하나의 LDR 명령어가 2 클럭주기가 걸리기 때문에 Cortex-M3에서는 이러한 작업이 필요합니다. 두 개의 연속 LDR 명령어는 파이프 라인 될 수 있으므로 총 3 클럭 사이클 만 소요됩니다. 명령어 세트 타이밍에 대한 자세한 내용은 ARM 정보 센터의 Cortex-M4 Technical Reference Manual을 참조하십시오.

물론 느린 플래시 메모리로 인해 속도가 느려지지 않도록 내부 SRAM에서 코드를 실행해야합니다.

모든 기기에서 100 % 정확한 사이클을 보장 할 수는 없지만 매우 가깝습니다. (Chris의 아래 코멘트 참조). 또한 인터럽트가없는 환경에서 사용하기위한 것임을 알아야합니다.

+0

안녕하세요 PacMan! 이론적으로 대답을 이해하지만 나는 ARM 프로세서 어셈블리에 초보자입니다.이 목적을 위해 예제 코드를 게시 해 주시겠습니까? – Anth

+0

불행히도 나는 th의 예제 코드를 게시 할 수 없다. 전자 STM, 나는 그것을 확인할 수 없기 때문에. (STM은 훌륭한 제품이지만 다른 Cortex-M3 MCU에서도 작업하고있다.)타이머 구성을 시작하기 전에 타이머의 클럭 전력을 켜야한다고 말할 수 있습니다. 그렇지 않으면, HardFault 충돌이 발생합니다. C 함수 (아무 문제없이)를 사용하여 타이머를 설정할 수 있으며, 주기적으로 정확한 결과가 필요하지 않으면 C 함수를 사용하여 타이머 카운터 레지스터를 읽을 수도 있습니다. –

+0

(STM 장치를 사용하는 사용자는 위의 구현을 자유롭게하고 응답으로 코드를 게시하십시오.) –

관련 문제