2013-08-17 8 views
-4

의 내용 나는 간단한 지연 FUNC했다 :단일 작업의 지속 시간이 STM32

void Delay(__IO uint32_t nCount) 
{ 
    while(nCount--) {} 
} 

을 그리고 나는 어떤 값을 단일 실행의 지속 시간을 예측합니다. 나는 나쁜 생각을 알고 있지만 정확한 시간이 필요하지 않으며 방해받지 않을 것입니다.

저는 168MHz의 STM32F405를 8MHz 외부 크리스탈과 함께 사용하고 있습니다.

지금까지 0x80 0000으로 전화를 걸면 약 30 초 정도 지연됩니다.

+4

-Jesse이 필요하십니까? –

+0

타이머가 필요하지 않습니다. – Jacob

+4

...하지만 당신은 뭔가 시간을하려고합니다. 나는 너의 질문을 정말로 이해하지 못한다. –

답변

1

해당 기능을 실행하는 데 걸리는 시간은 컴파일러와 설정에 따라 크게 달라질 수 있습니다. 함수가 아무 것도하지 않기 때문에 옵티마이 저가이 함수를 간단한 bx lr로 바꿀 수 있습니다. 시간을 측정 할 수 있다면 최적화되지 않은 것입니다 (그리고이 부분과 코드의 다른 부분은 훨씬 더 다양 할 것입니다).

결정적이고 반복 가능한 방식으로 문제를 해결한다고 가정하면 실행하고 참조 시간을 사용하여 타이밍을 정하는 데 걸리는 시간을 대략적으로 알 수 있습니다. cortex-m4의 타이머가 탁월한 선택입니다.

이 코드를 사용하는 방식을 변경하거나 캐시를 켜거나 프로세서 시계를 변경하거나 플래시의 타이밍 설정을 변경하면 언제든지 지연 기능을 다시 조정해야합니다.

지연을 수행하기 위해 타이머 중 하나를 직접 사용하는 것이 훨씬 쉽고 정확도가 상당히 향상됩니다. 카운터 루프 코드 및/또는 호출을 계속 유지하지 않아야합니다.

1

그래서 그 대신의 루프 동안, 당신이 거기에 __no_operation(); (2 밑줄이 아닌 1)을 넣어해야합니다 필요. 이것은 내 보드에서 168MHz에서 명령주기 당 29ns가 걸리며, 내장 어셈블리 NOP가 코드 스트림에 직접 삽입되므로 모든 최적화에 대해 대립하게됩니다.

마지막주의 사항 : 루프 카운터는 __IO이며 휘발성임을 나타냅니다. 즉 루프 카운터는 이 아니며을 CPU 레지스터에 넣어야합니다. 루프에 __no_operation(); 행을 넣으면이를 변경할 수 있습니다. 컴파일러에 의해 제거되지 않기 때문입니다.

당신은 일반적으로 타이머를 사용해야합니다,하지만 당신은 타이머를 원하는 경우가 아닌 타이머를 사용하는 이유 때때로 우리 모두는, 해킹 업 :