<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=us-ascii">
<META NAME="Generator" CONTENT="MS Exchange Server version 16.0.10366.20016">
<TITLE>clock_gettime function doesn't scale to real time.. and changing CNTFRQ_EL0 doesn't make any change..(arm64)</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/rtf format -->

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">H</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">ello</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">linux</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">experts and newbies,</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New"> have ported linux</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">on</FONT> <FONT SIZE=2 FACE="Courier New">our arm64</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">fpga</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">board</FONT><FONT SIZE=2 FACE="Courier New">. B</FONT><FONT SIZE=2 FACE="Courier New">oth</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">5</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2>.</FONT><FONT SIZE=2 FACE="Courier New">10.0 and 5.15.xx works ok</FONT><FONT SIZE=2 FACE="Courier New"> with mini</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">m</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">al config.</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I</FONT><FONT SIZE=2 FACE="Courier New"> have run a simple application and timed the processing time</FONT><FONT SIZE=2 FACE="Courier New"> using clock_gettime function.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">t felt like it took almost 2</FONT><FONT SIZE=2 FACE="Courier New">.3 s</FONT><FONT SIZE=2 FACE="Courier New">econds but the program say it</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New"> took only 0.36 seconds.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">H</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">ere is how I di</FONT><FONT SIZE=2 FACE="Courier New">d  it in the app</FONT><FONT SIZE=2 FACE="Courier New">lication.</FONT></SPAN></P>
<UL DIR=LTR>
<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I</FONT><FONT SIZE=2 FACE="Courier New">nt</FONT> <FONT SIZE=2 FACE="Courier New">main(</FONT><FONT SIZE=2 FACE="Courier New">) {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">struct timespec start, stop;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    float exec_time_sec, exec_time_nsec;</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">//check start time</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    if (clock_gettime(CLOCK_REALTIME, &start) == -1 )  {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">        perror ("clock_gettime");</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">        exit(EXIT</FONT><FONT SIZE=2 FACE="Courier New">_FAILURE);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    }</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">D</FONT><FONT SIZE=2 FACE="Courier New">o</FONT> <FONT SIZE=2 FACE="Courier New">something...</FONT><FONT SIZE=2 FACE="Courier New"> (</FONT><FONT SIZE=2 FACE="Courier New">calculate</FONT><FONT SIZE=2 FACE="Courier New"> fibonacc</FONT><FONT SIZE=2 FACE="Courier New">i</FONT> <FONT SIZE=2 FACE="Courier New">value for 1 ~ 30)</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">//check end time</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    if (clock_gettime(CLOCK_REALTIME, &stop) == -1 )  {</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">        perror ("c</FONT><FONT SIZE=2 FACE="Courier New">lock_gettime");</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">        exit(EXIT_FAILURE);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    }</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    //Normalize to mili second</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    exec_time_sec = (float)(stop.tv_sec - start.tv_sec);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    exec_time_nsec = (float)((double)(stop.tv_nsec - start.tv_nsec)/(double)BILLION);</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">    printf("Execution time : %</FONT><FONT SIZE=2 FACE="Courier New">f sec\n", exec_time_sec + exec_time_nsec);</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">r</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">eturn 0;</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2>}</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>
</UL>
<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I used u-boot program</FONT> <FONT SIZE=2 FACE="Courier New">for loading linux kernel</FONT><FONT SIZE=2 FACE="Courier New"> and</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">the u-boot program sets the CNTFRQ_EL0 register with 5000000.</FONT></SPAN><SPAN LANG="en-us"> </SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">(</FONT><FONT SIZE=2 FACE="Courier New">wh</FONT><FONT SIZE=2 FACE="Courier New">ich is</FONT> <FONT SIZE=2 FACE="Courier New">5MHz</FONT><FONT SIZE=2 FACE="Courier New">, I heard t</FONT><FONT SIZE=2 FACE="Courier New">he system clock runs at 5MHz in the board</FONT><FONT SIZE=2 FACE="Courier New">).</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">The desc</FONT><FONT SIZE=2 FACE="Courier New">ription of the</FONT><FONT SIZE=2 FACE="Courier New"> register in armv8 arch manual says :</FONT></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="TimesNewRomanPSMT">This register is provided so that software can discover the frequency of the system counter. It must</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="TimesNewRomanPSMT">be programmed with this value as part of system initialization. The value of the register is not</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="TimesNewRomanPSMT">interpreted by</FONT> <FONT SIZE=2 FACE="TimesNewRomanPSMT">hardware.</FONT></SPAN><SPAN LANG="en-us"></SPAN><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New"> tried setting the CNTFRQ_EL0 with 20Mhz, expe</FONT><FONT SIZE=2 FACE="Courier New">cting the</FONT> <FONT SIZE=2 FACE="Courier New">execution</FONT> <FONT SIZE=2 FACE="Courier New">to be</FONT></SPAN><SPAN LANG="en-us"> <FONT SIZE=2 FACE="Courier New">dis</FONT><FONT SIZE=2 FACE="Courier New">played 4 times shorter</FONT><FONT SIZE=2 FACE="Courier New"> but it is the same!</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">I</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New"> couldn't find how linux uses clock_gettime.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">H</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">ow can I solve this proble</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">m?</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">A</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">ny advice w</FONT><FONT SIZE=2 FACE="Courier New">ill be deeply app</FONT><FONT SIZE=2 FACE="Courier New">reciated.</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">T</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">hank you!</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">C</FONT></SPAN><SPAN LANG="en-us"><FONT SIZE=2 FACE="Courier New">han Kim</FONT></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

<P DIR=LTR><SPAN LANG="en-us"></SPAN></P>

</BODY>
</HTML>