了解Xenomai-Linux POSIX外观中的上下文切换

时间:2017-02-13 22:07:28

标签: c linux posix beagleboneblack xenomai

我正在使用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

enter image description here

我发现CSWMSW PID 3323不断变化。

以下是ps -e -o class,rtprio,pri,nice,cmd | grep ./main_posix

的输出

enter image description here

输出如下

enter image description here

我的问题如下

  1. 如何知道我的程序是以主模式还是辅助模式运行?
  2. 我将ret = pthread_setschedparam(pth,SCHED_FIFO, &sparam);的返回值设为16 EBUSY。知道为什么吗?
  3. 尝试使用signal(SIGXCPU, warn_upon_switch);捕捉开关信号。该函数永远不会被调用。
  4. 如果可以在Linux中看到程序(意味着它通过Linux内核获得PID),它是否意味着它以辅助模式运行?
  5. proc/xenomai/stat中,我看到同一程序的两个进程。它是main和线程吗?
  6. 以下是我使用的一些资源

    1. Periodic thread fails real-time in Xenomai
    2. Xenomai clock_nanosleep in POSIX skin jumps to Linux Kernel
    3. http://xenomai.org/2014/08/porting-a-linux-application-to-xenomai-dual-kernel/#Using_the_PTHREAD_WARNSW_bit
    4. http://www.xenomai.org/documentation/xenomai-2.6/html/api/sigxcpu_8c-example.html

0 个答案:

没有答案