문제

OMAP Zoom 3430 MDK와 함께 제공되는 TMS32064X+ DSP에서 코드 조각을 실행하는 데 필요한 시계 사이클을 측정하려고합니다. DSP 칩의 "프로그래머 안내서"를보고 DSP가 Clock () 함수를 지원한다고 말합니다.

내가하는 일은 정말 간단합니다.

start = clock();
for (i=0;i<100;i++){
    /* do something here */
}
stop = clock();
total = stop - start;

그런 다음 "시작", "정지"및 "총"의 값을 ARM 프로세서와 이전에 할당 된 공유 메모리에 넣습니다. 그런 다음 단순히 팔면의 화면에 인쇄합니다.

문제는 첫 번째 실행에서 항상 동일한 "총"값을 얻은 다음 다음 달리기에서 항상 0을 얻는다는 것입니다! "시작"및 "정지"값은 "총"값과 함께 진행됩니다.

가장 이상한 점은 그들이 약간의 패턴을 따르는 것 같습니다! 아래에 출력을 넣었습니다.

# ./sampleapp
Total = 63744
Start clock() value = 0x000000f9
Stop  clock() value = 0x0000f9f9
# ./sampleapp 
Total = 4177526784
Start clock() value = 0x00f9f9f9
Stop  clock() value = 0xf9f9f9f9
# ./sampleapp
Total clock cyles = 0
Start clock() value = 0xf9f9f9f9
Stop  clock() value = 0xf9f9f9f9

명백히, Clock ()는 잘 작동하지 않지만 이것이 내가 잘못한 일 때문인지 또는이 유형의 물건이 내가 가진 하드웨어로 지원되지 않기 때문에 확실하지 않습니다. 왜 이런 일이 일어나고 있는지 아이디어가 있습니까?

도움이 되었습니까?

해결책

지금까지 질문을 읽음으로써, 원래 포스터는 지금까지 기고자 보다이 문제에 대해 더 많은 지식을 가지고 있으며, 시계 ()가 깨 졌거나 지원되지 않고 정의되지 않은 결과를 반환한다는 의심이 있습니다. DSP는 가능성이 높습니다.

다른 팁

흥미롭게도, 왜 당신은 a 이전에 할당되었습니다 공유 메모리. 일반 스택 변수로 시도하지 않으시겠습니까? 내가 놓친 것이 있습니까?

아마도 시계를 먼저 초기화해야 할 수도 있습니다.

어떻게 인쇄하고 있습니까? 문제가 실제로 결과를 표시하는 데 문제가 있습니까?

대부분의 플랫폼에서 Clock_T는 길이가 길다. %d와 함께 printf를 사용하는 경우 가변적 인 결과를 얻을 수 있습니다.

시작 및 엔드 변수가 'Clock_t'유형이라고 가정하고 공유 메모리가 전달 된 숫자에 대한 다른 쪽 끝의 해석에서 동일하다고 가정하면, 문제는 클럭 호출에 대한 문제가 아니며 시작 사이의 차이를 다루는 것이 아닙니다. 종료 시간 시간.

나는 당신의 문제가 둘 사이의 공유 메모리에 있다고 생각합니다. 두 개의 별도 프로세서간에 메모리를 공유하는 방법을 보여주기 위해 코드를 게시 해 주시겠습니까?

아마도 인라인 어셈블리를 사용하여 CPU의 카운터 레지스터에 직접 액세스 할 수 있습니다.

TMS320C64X+는 TSCL, TSCH에 64 비트 타임 스탬프 레지스터가 있습니다. 재설정시 카운터가 활성화되지 않습니다. 카운터를 시작하려면 먼저 레지스터에 편지를 써야합니다 (아마도 이것은 문제 일 것입니다. clock?). 등록부에서 읽는 것은 별도의 명령으로 읽어야하기 때문에 사소한 것은 아닙니다 (그리고 인터럽트를 얻을 수 있습니다 ...).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top