Xenomai clock_nanosleep в оболочке POSIX переходит на ядро ​​Linux

Я тестирую кожу POSIX в Xenomai. Я пытаюсь читать и писать из некоторых GPIO на Raspberry Pi, и когда я запускаю программу, все большее число переключений контекста (в /proc/xenomai/stat/).

Основная часть программы отображает GPIO в память и запускает pthreads. Вот что делает неприятность:

void *productive_thread(void *arg)
{
    struct timespec delay, sleep;
    unsigned long over;

    delay.tv_sec = 0;
    delay.tv_nsec = 10000; // 10 usec

    sleep.tv_sec = 0;
    sleep.tv_nsec = *(long *)arg;

    while(1)
    {
            // This are the read and write macros (gpio is the address of the GPIO mapping):
            // #define GPIO_SET *(gpio+7)
            // #define GPIO_CLR *(gpio+10)
            // #define GPIO_READ(g) (*(gpio + 13)&(1<<(g)))>>4
        while(GPIO_READ(4) != 1);
        GPIO_SET = 1 << 17;
        clock_nanosleep(CLOCK_REALTIME, 0, &delay, NULL);
        GPIO_CLR = 1 << 17;
        clock_nanosleep(CLOCK_REALTIME, 0, &sleep, NULL);
    }
    return NULL;
}

Количество переключений контекста увеличивается с каждым циклом. Я подозреваю, что проблема в clock_nanosleep, потому что все другие операции являются арифметическими, но clock_nanosleep определен в документации Xenomai. Можно ли это как-то улучшить (используя скин POSIX)?

1 ответ

Решение

Когда процесс спит, он выполняет произвольное переключение контекста. Это хорошо, если вы на самом деле не видите, что ваши сроки не соблюдены.

Другие вопросы по тегам