我正在 Xenomai 中测试 POSIX 皮肤。我正在尝试从 Raspberry Pi 上的一些 GPIO 读取和写入,当我执行程序时,上下文切换的数量越来越多(在 /proc/xenomai/stat/ 中)。
程序的主要部分将 GPIO 映射到内存并启动 pthread。造成麻烦的 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 文档中定义的。可以以某种方式改进(使用 POSIX 皮肤)吗?