我正在使用 Xenomai 在 BeagleBone Black 上运行 RT 程序,并试图弄清楚如何监视/理解上下文切换(我知道上下文切换的概念),以便我可以确定我的程序(在 C 中使用 POSIX 皮肤)何时从主切换和次要模式。
这是程序main_posix.c
#ifndef __XENO_SIM__
#ifndef __KERNEL__
#include <stdio.h>
#define xnarch_printf printf
#endif
#include <time.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <sys/mman.h>
#include <pthread.h>
#include <mqueue.h>
#else /* __XENO_SIM */
#include <posix/posix.h>
#endif /* __XENO_SIM */
void warn_upon_switch(){
printf("Switched to Secondary Mode \n");
}
void *threadFunc(void *arg)
{
char *str;
int i = 0;
struct timespec delay, sleep;
unsigned long over;
int ret;
str=(char*)arg;
printf("In thread \n");
sleep.tv_sec = 1;
sleep.tv_nsec = 0;
#ifdef __XENO__
ret = pthread_set_mode_np(0, 0x00040000);
printf("Warn Bit Ret %d\n", ret);
#endif /* __XENO__ */
// run this for some arbitrary time
while(i < 110000000 )
{
clock_nanosleep(CLOCK_REALTIME, 0, &sleep, NULL);
printf("threadFunc says: %s\n",str);
++i;
}
return NULL;
}
int main(void)
{
signal(SIGXCPU, warn_upon_switch);
signal(SIGKILL, warn_upon_switch);
pthread_t pth;
double i = 0;
int ret;
pthread_attr_t tattr;
struct sched_param sparam;
sparam.sched_priority = 99;
ret = pthread_attr_init(&tattr);
printf("Init Return Val %d\n", ret);
ret = pthread_setschedparam(pth,SCHED_FIFO, &sparam);
printf("SetSchedParam Ret Value %d\n", ret);
pthread_create(&pth,&tattr,threadFunc,"foo");
printf("main waiting for thread to terminate...\n");
pthread_join(pth,NULL);
return 0;
}
我也在/proc/xenomai/stat
通过持续监控watch
我看到了这一点,CSW
并且MSW
不断PID
3323
变化。
这是输出ps -e -o class,rtprio,pri,nice,cmd | grep ./main_posix
输出如下
我的问题如下
- 我如何知道我的程序是在主要模式还是次要模式下运行?
- 我得到
ret = pthread_setschedparam(pth,SCHED_FIFO, &sparam);
as16
which is的返回值EBUSY
。知道为什么吗? - 尝试使用捕获开关信号
signal(SIGXCPU, warn_upon_switch);
。该函数永远不会被调用。 - 如果程序可以在 Linux 中看到(意味着它通过 Linux 内核获得 PID),是否意味着它在辅助模式下运行?
- 在
proc/xenomai/stat
中,我看到同一程序的两个进程。是main
和线程吗?
这是我使用的一些资源