<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic GPT tick problem in IMX6SX in Embedded Software and Tools Clinic</title>
    <link>https://community.nxp.com/t5/Embedded-Software-and-Tools/GPT-tick-problem-in-IMX6SX/m-p/1806368#M446</link>
    <description>&lt;P&gt;&lt;SPAN&gt;hello&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I want to make timer using GPT.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Using pthread, we are going to check the event every 50ms and time measurement.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CPU : IMX6XS&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;OS : QNX&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;timer_create example code&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * Demonstrate how to set up a timer that, on expiry,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * sends us a pulse. This example sets the first&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * expiry to 0.05 seconds and the repetition interval&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * to 0.05 seconds.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;time.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;pthread.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;sys/netmgr.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;sys/neutrino.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MY_PULSE_CODE _PULSE_CODE_MINAVAIL&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;typedef union {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;struct _pulse pulse;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* /* your other message structures would go&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;here too */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&amp;nbsp; my_message_t;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;int main()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; struct sigevent event;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; struct itimerspec itime;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; timer_t timer_id;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; int chid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; int rcvid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; my_message_t msg;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; struct sched_param scheduling_params;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; int prio;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; chid = ChannelCreate(0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; /* Get our priority. */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (SchedGet( 0, 0, &amp;amp;scheduling_params) != -1)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;prio = scheduling_params.sched_priority;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;else&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; prio = 10;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_notify = SIGEV_PULSE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0,&lt;/SPAN&gt;&lt;SPAN&gt;chid,&lt;/SPAN&gt;&lt;SPAN&gt;_NTO_SIDE_CHANNEL, 0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_priority = prio;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_code = MY_PULSE_CODE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;timer_create(CLOCK_MONOTONIC, &amp;amp;event, &amp;amp;timer_id);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_value.tv_sec = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/* 50 million nsecs = .05 secs */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_value.tv_nsec = 50000000;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_interval.tv_sec = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/* 50 million nsecs = .05 secs */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_interval.tv_nsec = 50000000;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;timer_settime(timer_id, 0, &amp;amp;itime, NULL);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;* * As of the timer_settime(), we will receive our pulse&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;* * in 0.05 seconds (the itime.it_value) and every 0.05&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;* * seconds thereafter (the itime.it_interval)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;calulateTick(START);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;for (;;) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; rcvid = MsgReceive(chid, &amp;amp;msg, sizeof(msg), NULL);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (rcvid == 0) { /* we got a pulse */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (msg.pulse.code == MY_PULSE_CODE) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;calulateTick(END);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} /* else other pulses ... */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} /* else other messages ... */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;return(EXIT_SUCCESS);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;0x02098024 : GPT_CNT register address&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;clockValue = 24MHz / 2^3 = 3Mhz&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;calculateTick(int startEnd)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;if(START == startEnd){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; startTime = ReadReg(0x02098024);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; }else if(END == startEnd){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; endTime = ReadReg(0x02098024);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; diffTimeToMs = (endTime - startTime) / (clockValue);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; startTime = endTime;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;in action&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The difference between DiffTimeToMs is not exactly 50ms.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The difference between the values is about 49947 to 49968us.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;However, using the function of clock_getime shows a difference of exactly 50 ms.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I would like to know why the difference between reading directly from the register and clock_getime, which is the qnxos function.&lt;/SPAN&gt;&lt;/P&gt;</description>
    <pubDate>Wed, 21 Feb 2024 07:56:21 GMT</pubDate>
    <dc:creator>piljae</dc:creator>
    <dc:date>2024-02-21T07:56:21Z</dc:date>
    <item>
      <title>GPT tick problem in IMX6SX</title>
      <link>https://community.nxp.com/t5/Embedded-Software-and-Tools/GPT-tick-problem-in-IMX6SX/m-p/1806368#M446</link>
      <description>&lt;P&gt;&lt;SPAN&gt;hello&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I want to make timer using GPT.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Using pthread, we are going to check the event every 50ms and time measurement.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;CPU : IMX6XS&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;OS : QNX&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;timer_create example code&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * Demonstrate how to set up a timer that, on expiry,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * sends us a pulse. This example sets the first&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * expiry to 0.05 seconds and the repetition interval&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;* * to 0.05 seconds.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;stdio.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;time.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;pthread.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;sys/netmgr.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;#include &amp;lt;sys/neutrino.h&amp;gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;#define MY_PULSE_CODE _PULSE_CODE_MINAVAIL&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;typedef union {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;struct _pulse pulse;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;/* /* your other message structures would go&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;here too */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&amp;nbsp; my_message_t;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;int main()&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; struct sigevent event;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; struct itimerspec itime;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; timer_t timer_id;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; int chid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; int rcvid;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; my_message_t msg;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; struct sched_param scheduling_params;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; int prio;&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; chid = ChannelCreate(0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; /* Get our priority. */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; if (SchedGet( 0, 0, &amp;amp;scheduling_params) != -1)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;prio = scheduling_params.sched_priority;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;else&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; prio = 10;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_notify = SIGEV_PULSE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_coid = ConnectAttach(ND_LOCAL_NODE, 0,&lt;/SPAN&gt;&lt;SPAN&gt;chid,&lt;/SPAN&gt;&lt;SPAN&gt;_NTO_SIDE_CHANNEL, 0);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_priority = prio;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;event.sigev_code = MY_PULSE_CODE;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;timer_create(CLOCK_MONOTONIC, &amp;amp;event, &amp;amp;timer_id);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_value.tv_sec = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/* 50 million nsecs = .05 secs */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_value.tv_nsec = 50000000;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_interval.tv_sec = 0;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/* 50 million nsecs = .05 secs */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;itime.it_interval.tv_nsec = 50000000;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;timer_settime(timer_id, 0, &amp;amp;itime, NULL);&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;/*&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;* * As of the timer_settime(), we will receive our pulse&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;* * in 0.05 seconds (the itime.it_value) and every 0.05&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;* * seconds thereafter (the itime.it_interval)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;*/&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;calulateTick(START);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;for (;;) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; rcvid = MsgReceive(chid, &amp;amp;msg, sizeof(msg), NULL);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; if (rcvid == 0) { /* we got a pulse */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (msg.pulse.code == MY_PULSE_CODE) {&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;calulateTick(END);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} /* else other pulses ... */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;} /* else other messages ... */&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;return(EXIT_SUCCESS);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;0x02098024 : GPT_CNT register address&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;clockValue = 24MHz / 2^3 = 3Mhz&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;calculateTick(int startEnd)&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;{&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp;if(START == startEnd){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; startTime = ReadReg(0x02098024);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; }else if(END == startEnd){&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; endTime = ReadReg(0x02098024);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; diffTimeToMs = (endTime - startTime) / (clockValue);&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; startTime = endTime;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;--------------------------------------------------------------&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;in action&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The difference between DiffTimeToMs is not exactly 50ms.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The difference between the values is about 49947 to 49968us.&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;However, using the function of clock_getime shows a difference of exactly 50 ms.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I would like to know why the difference between reading directly from the register and clock_getime, which is the qnxos function.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 21 Feb 2024 07:56:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Embedded-Software-and-Tools/GPT-tick-problem-in-IMX6SX/m-p/1806368#M446</guid>
      <dc:creator>piljae</dc:creator>
      <dc:date>2024-02-21T07:56:21Z</dc:date>
    </item>
  </channel>
</rss>

