• 카테고리

    질문 & 답변
  • 세부 분야

    반도체

  • 해결 여부

    미해결

lab10 usleep 관련하여 질문있습니다.

23.04.25 22:23 작성 23.04.25 22:29 수정 조회수 514

2

안녕하세요 맛비님!

lab10 main.c 부분 코드를 작성하면서

printf("Output took %llu clock cycles.\n", 2*(tEnd - tStart));
printf("Output took %.2f us.\n", 1.0 * (tEnd - tStart) / (COUNTS_PER_SECOND/1000000));

이 두 부분에서 궁금한 점이 생겼는데 관련하여 이미 질문하신 분이 계신가 찾아봤는데 없는 것 같아 질문을 드립니다.

강의에서 uSleep함수가 uSleep(1)이라고 하면 1us를 쉬는 함수라고 하셨는데, 100,000,000/100을 인자로 입력했을 때, 333000133이 tEnd-tStart로 나오는걸 보니

tEnd-tStart에 전달되는 값은 "1s를 'PS의 CPU(667MHz)'가 세기 위해 필요한 clock count수의 절반" 이라고 해석할 수 있을 것 같은데,

  1. tEnd, tStart는 그럼 정확히 시각이라기 보다는 PS의 CPU로 count한 Clock수의 절반 이라고 해석하는게 맞을까요?

  2. 또, 왜 절반으로 정의되는지 이유가 궁금합니다.

2와 관련해서 header 파일들을 열어보니, xparameters.h 파일에

#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2) 라고 정의되어 있는데, 이것 때문에 그런 것인가요? 어떤 이유 때문에 이렇게 /2를 하여 정의를 하는 것인지 궁금합니다... 그냥 100Mhz로 1s를 세려면 COUNTS_PER_SECOND 을 100M번으로 정의하면 되는것 아닌가요..?

  1. 또, SW sleep뿐 아니라 HW sleep 부분에서도 위와 같은 코드로 시간측정을 하는데, 결국 PL영역에서 동작한 내용을(HW Sleep/clock count) PS에서 읽어와서 해석했기 때문에 그런 것이고, 100Mhz가 기준이 아니라 667Mhz가 기준인 것도(uSleep(100,000,000/100)일 때 tEnd-tStart=333000133) PS에서 PL에 입력되는 Clock freq이 100MHz이지, PS내에서의 Clock freq은 667Mhz이기 때문이라고 생각을 했는데, 맞게 생각한게 맞을까요??

 

사소한 질문인 것 같은데, 오랫동안 생각해봐도 확실하게 답이 나오지 않아서 질문 드립니다... 항상 강의 잘 듣고 있습니다 :) 감사합니다 맛비님!

 

답변 1

답변을 작성해보세요.

1

안녕하세요 :)

이 부분은 정확한 답을드리기 어려울 것 같아요. 혹여나 질문자 님께서 답을 알게 되시면 답글 부탁드립니다. :)

Q1. tEnd, tStart는 그럼 정확히 시각이라기 보다는 PS의 CPU로 count한 Clock수의 절반 이라고 해석하는게 맞을까요?

A1. clock 의 counter 입니다. 절반에 관련된 내용은 저도 정확히 모르겠습니다. 제가 적은 수식상은 그렇게 해석하는 것이 옳겠네요. 다음링크 참고 부탁드립니다. https://docs.xilinx.com/r/2021.2-English/oslib_rm/XTime_GetTime?tocId=ct1g80b5xL5DHTxDXAjTrw

Q2. 또, 왜 절반으로 정의되는지 이유가 궁금합니다.

2와 관련해서 header 파일들을 열어보니, xparameters.h 파일에

#define COUNTS_PER_SECOND (XPAR_CPU_CORTEXA9_CORE_CLOCK_FREQ_HZ /2) 라고 정의되어 있는데, 이것 때문에 그런 것인가요? 어떤 이유 때문에 이렇게 /2를 하여 정의를 하는 것인지 궁금합니다... 그냥 100Mhz로 1s를 세려면 COUNTS_PER_SECOND 을 100M번으로 정의하면 되는것 아닌가요..?

A2. 글쎄요.. Xilinx 가 왜 그랬을까요? 저도 정확한 의도는 잘 모르겠습니다.

 

Q3. 또, SW sleep뿐 아니라 HW sleep 부분에서도 위와 같은 코드로 시간측정을 하는데, 결국 PL영역에서 동작한 내용을(HW Sleep/clock count) PS에서 읽어와서 해석했기 때문에 그런 것이고, 100Mhz가 기준이 아니라 667Mhz가 기준인 것도(uSleep(100,000,000/100)일 때 tEnd-tStart=333000133) PS에서 PL에 입력되는 Clock freq이 100MHz이지, PS내에서의 Clock freq은 667Mhz이기 때문이라고 생각을 했는데, 맞게 생각한게 맞을까요??

A3. 음........ 질문이 헷갈린데요. A1 을 참고하셔서 다시 적어주실 수 있을까요? "시간측정은 Arm processor 의 clock freq 도메인에서 이루어진다." 를 인지하신 후에 다시 작성 부탁드릴께요.

 

Pointer to the 64-bit location to be updated with the current value of physical timer counter register.라고 나와있는 것을 보니 PS에서의 Clock의 Counter 값이 tEnd,tStart에 들어가는게 맞는 것 같네요! 왜 절반인지는 진짜 잘 모르겠습니다ㅜㅜ 일단 Xilinx에서 그렇게 만들었으니 받아들이고 사용하는 게 맞을 것 같아요. 그리고 3번에서는 Vivado 에서 100Mhz로 Clock freq을 설정했었는데 왜 667Mhz의 freq으로 count가 되는 것인지에 대한 의문을 나름대로 정리해 본 것이었는데, 맛비님께서 말씀하신 의미로 작성한 것이에요. 제가 좀 글을 헷갈리게 적었네요..

현업에 계시느라 바쁘실텐데 매번 친절하게 설명해주셔서 정말 감사합니다 맛비님 !

아 그렇군요! 절반은 저도 이유를 모르겠습니다 (Xilinx 가 그랬구나, 하는 중입니다. 이유 찾기를 포기했습니다 ㅎㅎ)

나머지 부분은 이해가 되셨다니 다행이네요.

즐공하세요 :)

채널톡 아이콘