Я испытываю непостоянную задержку в системе реального времени, использующей clock_nanosleep для точного пробуждения. . Ожидается, что период пробуждения будет соответствовать интервалу 250 мкс, но фактическое время пробуждения колеблется в диапазоне +/- 10 мкс, а в некоторых случаях резко возрастает до 1 мс. Это происходит в системе с ядром Linux версии 5.14.0-533.el9.x86_64+rt.
Вот соответствующие подробности:
Код: Выделить всё
OS: Linux localhost.localdomain 5.14.0-533.el9.x86_64+rt #1 SMP PREEMPT_RT (RT patches enabled)
Thread Priority: 99 (real-time priority)
Hardware: x86_64 architecture
Код: Выделить всё
int thread_create_rt(std::thread &thandle, int stacksize, void *(*func)(void *), void *param)
{
int ret;
pthread_attr_t attr;
struct sched_param schparam;
pthread_t thread_id;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, stacksize);
cpu_set_t cpuset;
CPU_ZERO(&cpuset);
CPU_SET(0, &cpuset); // Assigning to core 0
pthread_attr_setaffinity_np(&attr, sizeof(cpu_set_t), &cpuset);
ret = pthread_create(&thread_id, &attr, func, param);
pthread_attr_destroy(&attr);
if (ret != 0) return 0;
memset(&schparam, 0, sizeof(schparam));
schparam.sched_priority = 99;
ret = pthread_setschedparam(thread_id, SCHED_FIFO, &schparam);
if (ret != 0) return 0;
thandle = std::thread([thread_id]() {
pthread_join(thread_id, nullptr); // Ensures the thread runs to completion
});
return 1; // Success
}
Код: Выделить всё
while(1){
while(i < 240000){
clock_gettime(CLOCK_MONOTONIC, &startTime);
if (i == 0) {
clock_gettime(CLOCK_MONOTONIC, &tm);
std::cout
Подробнее здесь: [url]https://stackoverflow.com/questions/79247855/clock-nanosleep-is-giving-out-inconsistent-latency-during-wakeup-in-rt-system-al[/url]