Hi, there



I am trying to make the main thread real-time and periodic through 
rt_task_shadow and rt_task_set_periodic, but after that I can not catch the 
SIGINT signal (Ctrl+C) in the main thread. I tried the rt_task_catch function, 
while the ld returns: undefined reference to ‘rt_task_catch’.





My questions are:

1. Is it possible to catch the SIGINT signal in a realtime task other than 
rt_task_catch?


2. Why the rt_task_catch can no be linked? Did I miss some necessary lib?





                                                                                
    yours: Kira Yamato

                                                                                
         2018-04-19


************************************************************************************************************************************

The environment is:

Ubuntu 14.04 x86_64 + Kernel 3.14.17 + Xenomai 2.6.4


The build command I used is:


************************************************************************************************************************************

gcc  -I/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -D__XENO__    
XenomaiPeriodic.c -Xlinker -rpath -Xlinker /usr/xenomai/lib -lnative 
-L/usr/xenomai/lib -lxenomai -lpthread -lrt -o XenomaiPeriodic

************************************************************************************************************************************

The skeleton of the XenomaiPeriodic.c is as following:


************************************************************************************************************************************

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>

#include <native/task.h>
#include <native/timer.h>

RT_TASK demo_task;
#define _PERIOD_NS_ 1000000

void demo(void *arg) {

    rt_task_set_periodic(NULL, TM_NOW, _PERIOD_NS_);


    while (1) {
        rt_task_wait_period(NULL);
    }
}

void catch_signal(int sig) {
}

void* my_catch_signal(rt_sigset_t sig) {
    return NULL;
}

void handler(rt_sigset_t sigset){
    return NULL;
}
int main(int argc, char* argv[]) {

    signal(SIGTERM, catch_signal);
    signal(SIGINT, catch_signal);

    /* Avoids memory swapping for this program */
    mlockall(MCL_CURRENT | MCL_FUTURE);

    RT_TASK main_task;
    int main_prio = 99;
    int main_mode = T_FPU | T_CPU(1);
    int ret = rt_task_shadow(&main_task, "maintask", main_prio, main_mode);
    rt_task_catch ( handler );


    rt_task_create(&demo_task, "trivial", 0, 99, T_CPU(3));
    rt_task_start(&demo_task, &demo, NULL);

    RTIME set_period = 4000000;
    ret = rt_task_set_periodic( NULL, TM_NOW, set_period);


    signal(SIGTERM, catch_signal);
    signal(SIGINT, catch_signal);

    while (1) {
        rt_task_wait_period(NULL);
    }

    pause();
    rt_task_delete(&demo_task);
    return 0;
}


************************************************************************************************************************************


_______________________________________________
Xenomai mailing list
Xenomai@xenomai.org
https://xenomai.org/mailman/listinfo/xenomai

Reply via email to