<div dir="ltr">Hi<div><br><div>I am recently play around with Litmus and found a strange problem when collecting the response time: The response time of tasks various when they wait for a different period. <br></div></div><div><br></div><div>Here is the code (it is actually the base_mt_task.c and runs under P-FP scheduling):</div><div><br></div><div><div><div>#include <stdio.h></div><div>#include <stdlib.h></div><div>#include <string.h></div><div>#include <sys/types.h></div><div>#include <pthread.h></div><div>#include <unistd.h></div><div>#include <litmus.h></div><div>#include <time.h></div><div><br></div><div>#define EXECUTIONS 10000</div><div><br></div><div>int cost;</div><div>int period;</div><div>int deadline;</div><div>int count_first;</div><div>long long sum;</div><div><br></div><div>void* rt_thread(void*);</div><div>int main(int argc, char** argv) {</div><div><span class="" style="white-space:pre">   </span>double avg;</div><div><span class="" style="white-space:pre">        </span>pthread_t *task;</div><div><br></div><div><span class="" style="white-space:pre">  </span>cost = atoi(argv[1]);</div><div><span class="" style="white-space:pre">      </span>period = atoi(argv[2]);</div><div><span class="" style="white-space:pre">    </span>deadline = atoi(argv[3]);</div><div><span class="" style="white-space:pre">  </span>count_first = 0;</div><div><br></div><div><span class="" style="white-space:pre">  </span>init_litmus();</div><div><span class="" style="white-space:pre">     </span>be_migrate_to_domain(1);</div><div><br></div><div><span class="" style="white-space:pre">  </span>task = malloc(sizeof(pthread_t));</div><div><span class="" style="white-space:pre">  </span>pthread_create(task, NULL, rt_thread, NULL);</div><div><span class="" style="white-space:pre">       </span>pthread_join(task[0], NULL);</div><div><br></div><div><span class="" style="white-space:pre">      </span>avg = sum / EXECUTIONS;</div><div><span class="" style="white-space:pre">    </span>printf("task executes %d times, exec_avg1: %20.5f\n", EXECUTIONS, avg);</div><div><br></div><div><span class="" style="white-space:pre"> </span>free(task);</div><div><br></div><div><span class="" style="white-space:pre">       </span>return 0;</div><div>}</div><div><br></div><div>#define NUMS 4096</div><div>static int num[NUMS];</div><div>static int loop_once(void) {</div><div><span class="" style="white-space:pre">  </span>int i, j = 0;</div><div><span class="" style="white-space:pre">      </span>for (i = 0; i < NUMS; i++)</div><div><span class="" style="white-space:pre">              </span>j += num[i]++;</div><div><span class="" style="white-space:pre">     </span>return j;</div><div>}</div><div><br></div><div>void* rt_thread(void* xxx) {</div><div><span class="" style="white-space:pre">      </span>struct rt_task param;</div><div><span class="" style="white-space:pre">      </span>int x;</div><div><span class="" style="white-space:pre">     </span>struct timespec start, end;</div><div><br></div><div><span class="" style="white-space:pre">       </span>be_migrate_to_domain(3);</div><div><span class="" style="white-space:pre">   </span>init_rt_task_param(&param);</div><div><br></div><div><span class="" style="white-space:pre">   </span>param.priority = 10;</div><div><span class="" style="white-space:pre">       </span>param.cpu = 3;</div><div><br></div><div><span class="" style="white-space:pre">    </span>param.exec_cost = cost;</div><div><span class="" style="white-space:pre">    </span>param.period = period;</div><div><span class="" style="white-space:pre">     </span>param.relative_deadline = deadline;</div><div><br></div><div><span class="" style="white-space:pre">       </span>param.budget_policy = NO_ENFORCEMENT;</div><div><span class="" style="white-space:pre">      </span>param.cls = RT_CLASS_HARD;</div><div><br></div><div><span class="" style="white-space:pre">        </span>init_rt_thread();</div><div><span class="" style="white-space:pre">  </span>set_rt_task_param(gettid(), &param);</div><div><span class="" style="white-space:pre">   </span>task_mode(LITMUS_RT_TASK);</div><div><br></div><div><span class="" style="white-space:pre">        </span>do {</div><div><span class="" style="white-space:pre">               </span>sleep_next_period();</div><div><br></div><div><span class="" style="white-space:pre">              </span>clock_gettime(CLOCK_REALTIME, &start);</div><div><span class="" style="white-space:pre">         </span>for (x = 0; x < 500; x++)</div><div><span class="" style="white-space:pre">                       </span>loop_once();</div><div><span class="" style="white-space:pre">               </span>clock_gettime(CLOCK_REALTIME, &end);</div><div><br></div><div><span class="" style="white-space:pre">          </span>sum += (end.tv_sec * 1000000000 + end.tv_nsec) - (start.tv_sec * 1000000000 + start.tv_nsec);</div><div><br></div><div><span class="" style="white-space:pre">             </span>count_first++;</div><div><span class="" style="white-space:pre">     </span>} while (count_first < EXECUTIONS);</div><div><br></div><div><span class="" style="white-space:pre">    </span>task_mode(BACKGROUND_TASK);</div><div><span class="" style="white-space:pre">        </span>return NULL;</div><div>}</div><div><br></div><div><br></div></div><div><br></div><div>In the program we have one rt thread on core 3 that execute the cpu cycle consuming function 500 times on each release and the task will be released 10000 times (EXECUTIONS). During each release, we gather the response time by clock_gettime call.</div></div><div><br></div><div>I noticed that the response time of the task various when we set different periods. Here is the result that I gathered (deadline and cost are equal to period, task is hard real-time):</div><div><br></div><div>PERIOD (nano)    RESPONSE_TIME (nano, average value)</div><div>10                       1662729</div><div>1000000              1662755</div><div>2000000              1718819</div><div>5000000              1713594</div><div>10000000            1710004</div><div><br></div><div>I assigned 5 different periods to the task and gathered its response time. As we see, under period 10 nano second and 1 millisecond, the response time is around 1.66 ms. Yet it becomes 1.71 ms if we assign the period to 2ms, 5ms and 10ms.</div><div>Also, apparently under 10 ns and 1 ms, the task will miss deadline. But this should not affect the execution time, right? </div><div><br></div><div>This is quite weird and I cannot understand. I guess there should be something that I missed up with. But I failed to see it. </div><div><br></div><div>Would you please help me and have a look at it?</div><div><br></div><div>Thanks in advance.</div><div><br></div><div>Best wishes</div><div>Shuai</div><div><br></div><div><br></div></div>