3

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

在此处输入图像描述

输出如下

在此处输入图像描述

我的问题如下

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

这是我使用的一些资源

  1. Xenomai 中的周期性线程实时失败
  2. POSIX 皮肤中的 Xenomai clock_nanosleep 跳转到 Linux 内核
  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
4

0 回答 0