POSIX皮肤中的Xenomai clock_nanosleep跳转到Linux内核

时间:2013-11-06 15:27:12

标签: c linux pthreads posix xenomai

我在Xenomai测试POSIX皮肤。我正在尝试从Raspberry Pi上的一些GPIO读取和写入,当我执行程序时,有越来越多的上下文切换(在/ proc / xenomai / stat /)。

程序的主程序将GPIO映射到内存并启动pthread。制造麻烦的麻烦就是:

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 documentation中定义。它可以以某种方式改进(使用POSIX皮肤)?

1 个答案:

答案 0 :(得分:3)

当进程休眠时,它会执行自愿上下文切换。这很好,除非你实际上错过了截止日期。