<meta http-equiv="Content-Type" content="text/html; charset=GB18030"><div><div>Dear Etherlab users,</div><div><span style="white-space:pre">  </span>I use the lateset igh with unofficial patchset under Linux-3.18.20 and Xenomai-2.6.5. My NIC is Intel i211.My question is, when I run a simple sample, there is no error even if the running time is very long. I just use QtCreator and make the configuration of slave and igh real-time cycling thread to a dynamic library, I find there is a big latency of calling ecrt_master_receive. My testing method is like this:</div><div><br></div><div>RTIME begin=rt_time_read();</div><div>ecrt_master_receive(master);</div><div>ecrt_domain_process(domain);</div><div>RTIME end=rt_time_read();</div><div><br></div><div>The latency (end-begin) will reach 1.5ms about 30 minutes after starting the program. Except this error, almost latency is under 10us. At the same time, I execute ¡°cat /proc/xenomai/faults¡± and find there will be page fault. I alse execute ¡°cat /proc/xenomai/stat¡± and find MSW of the real-time thread increases. And there will also be ¡°UNMATCHED Datagram¡± and ¡°Datagram XXX (domain0-0-main) was SKIPPED XX times¡± message log.</div><div><br></div><div>My real-time thread is:</div><div>    while(1) {</div><div>        wakeupTime = timespec_add(wakeupTime, cycletime);</div><div>        clock_nanosleep(CLOCK_TO_USE, TIMER_ABSTIME, &wakeupTime, NULL);</div><div><br></div><div>        begin_r=rt_timer_read();</div><div>        ecrt_master_receive(master);</div><div>        ecrt_domain_process(domain1);</div><div>        end_r=rt_timer_read();</div><div>        receive_time=end_r-begin_r;</div><div>        if(receive_time>max_receive_time)</div><div>            max_receive_time=receive_time;</div><div><br></div><div><span style="white-space:pre">            </span>temp[0]=EC_READ_U16(domain1_pd + offset.status_word_6041_0);</div><div>        temp[1]=EC_READ_U32(domain1_pd + offset.position_actual_value_6064_0);</div><div><span style="white-space:pre">         </span></div><div><span style="white-space:pre">              </span>if(once<=800) {target_position=temp[1];once++;}</div><div><span style="white-space:pre">            </span>if(temp[0] == 0x218){</div><div>            EC_WRITE_U16(domain1_pd+offset.control_word_6040_0, 0x0080 );</div><div>        } </div><div>        else if( (temp[0]&0x004f) == 0x0040  ){  //temp[0]==0x250</div><div>            EC_WRITE_U16(domain1_pd+offset.control_word_6040_0, 0x0006 );</div><div>            //printf("1.state = %x\n",temp[0]);</div><div>        }</div><div>        else if( (temp[0]&0x006f) == 0x0021){ //temp[0]==0x231</div><div>            EC_WRITE_U16(domain1_pd+offset.control_word_6040_0, 0x0007 );</div><div>            //printf("2.state = %x\n",temp[0]);</div><div>        }</div><div>        else if( (temp[0]&0x06f) == 0x023){ //temp[0]==0x233</div><div>            EC_WRITE_U8(domain1_pd+offset.modes_operation_6060_0, 8);//csp mode</div><div>            EC_WRITE_S32(domain1_pd+offset.target_position_607a_0,target_position);</div><div>            EC_WRITE_U16(domain1_pd+offset.control_word_6040_0, 0x000f);</div><div>        }</div><div>        else if( (temp[0]&0x06f) == 0x027){//temp[0]=0x237</div><div>            EC_WRITE_S32(domain1_pd+offset.target_position_607a_0,target_position); </div><div><span style="white-space:pre">   </span>        EC_WRITE_U16(domain1_pd+offset.control_word_6040_0, 0x001f);</div><div>        }</div><div><span style="white-space:pre">          </span>target_position+=0;</div><div>        if (sync_ref_counter) {</div><div>            sync_ref_counter--;</div><div>        } else {</div><div>            sync_ref_counter = 1; // sync every cycle</div><div><span style="white-space:pre">                        </span>clock_gettime(CLOCK_TO_USE,&time);    //added by me<span style="white-space:pre">            </span></div><div><span style="white-space:pre">                      </span>ecrt_master_sync_reference_clock_to(master, TIMESPEC2NS(time));</div><div>        }</div><div>        ecrt_master_sync_slave_clocks(master);</div><div><br></div><div>        begin_s=rt_timer_read();</div><div>        //send process data</div><div>        ecrt_domain_queue(domain1);</div><div>        //ecrt_domain_queue(domain2);</div><div>        ecrt_master_send(master);</div><div>        end_s=rt_timer_read();</div><div>        send_time=end_s-begin_s;</div><div><span style="white-space:pre">          </span></div><div>        if(send_time>max_send_time)</div><div>            max_send_time=send_time;</div><div>    }</div><div><br></div><div>I check all the possible problem I think:</div><div>1. Using libethercat_rtdm.so and ec_igb.</div><div>2. Make sure calling ecrt_master_receive after a period of time after calling ecrt_master_send. Sometimes,I find I use an elapsed time to call clock_nanosleep, that is because the latency of ecrt_master_receive.</div><div>3. Calling mlockall(MCL_CURRENT | MCL_FUTURE)</div><div><br></div><div>Does anyone know how to solve this problem?</div><div><br></div><div>Best regards</div><div>Zhou Yang</div></div><div><br></div>