我正在使用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);
的返回值设为16
EBUSY
。知道为什么吗?signal(SIGXCPU, warn_upon_switch);
捕捉开关信号。该函数永远不会被调用。 proc/xenomai/stat
中,我看到同一程序的两个进程。它是main
和线程吗?以下是我使用的一些资源