Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Xenomai中的周期线程实时失败_C_Linux_Linux Kernel_Posix_Xenomai - Fatal编程技术网

C Xenomai中的周期线程实时失败

C Xenomai中的周期线程实时失败,c,linux,linux-kernel,posix,xenomai,C,Linux,Linux Kernel,Posix,Xenomai,我正在创建一个周期线程,它在模拟输出上输出一个平方信号。我使用的是Posix皮肤和Xenomai API中的类比 我用示波器测试了代码的实时性能,并观察了方形信号(频率为1kHz)的延迟。我应该达到250秒(延迟),受常见中断信号干扰,如移动鼠标、启动新程序等 我的makefile中的标志设置如下: gcc -I/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -D__XENO__ -I/usr/xenomai/include/posix

我正在创建一个周期线程,它在模拟输出上输出一个平方信号。我使用的是Posix皮肤和Xenomai API中的类比

我用示波器测试了代码的实时性能,并观察了方形信号(频率为1kHz)的延迟。我应该达到250秒(延迟),受常见中断信号干扰,如移动鼠标、启动新程序等

我的makefile中的标志设置如下:

gcc  -I/usr/xenomai/include -D_GNU_SOURCE -D_REENTRANT -D__XENO__ -I/usr/xenomai/include/posix    
main_posix.c -Xlinker -rpath -Xlinker /usr/xenomai/lib -Wl,@/usr/xenomai/lib/posix.wrappers 
-L/usr/xenomai/lib -lpthread_rt -lxenomai -lpthread -lrt  -lanalogy -lrtdm -o main_posix
这是代码:

#define PERIOD 1e6 
#define FILENAME "analogy0"
#define ANALOG_SUBD 1
#define CHANNEL 0
#define SCAN_SIZE 2
#define DELAI 5

static char *filename = FILENAME;
static int idx_subd = ANALOG_SUBD;
static int idx_chan = CHANNEL;
static int valueUp = 450000;
static int valueDown = 98500;

void *TaskCode(void *arg)
{
   unsigned char sgnl = 0;
   unsigned long overruns_r = 0;

   a4l_desc_t dsc = { .sbdata = NULL };
   a4l_chinfo_t *chinfo;
   int err = 0;
   unsigned int scan_size = SCAN_SIZE;

   err = a4l_open(&dsc, filename);
   if (err < 0) {
        fprintf(stderr,
            "insn_write: a4l_open %s failed (err=%d)\n",
            filename, err);
        return NULL;
   }    

   while(1) {
        pthread_wait_np( &overruns_r );
    if(sgnl)
        err = a4l_sync_write(&dsc,
                 idx_subd, CHAN(idx_chan), 0, &valueUp, scan_size);
    else
        err = a4l_sync_write(&dsc,
                 idx_subd, CHAN(idx_chan), 0, &valueDown, scan_size);
    if (err < 0) {
        fprintf(stderr,
            "insn_write: a4l_sync_write failed (err=%d)\n", err);
        goto out_insn_write;
    }

    sgnl = (sgnl + 1) % 2;
   }

   out_insn_write:

    if (dsc.sbdata != NULL)
        free(dsc.sbdata);

    a4l_close(&dsc);

    return NULL;

}

int main(void)
{
   mlockall( MCL_CURRENT | MCL_FUTURE );

   pthread_t thread;
   int rc, i;
   int prio = 99;
   struct timespec rqtp, rmtp;
   rqtp.tv_sec = 0;
   rqtp.tv_nsec = PERIOD;

   struct sched_param sparam;
   sparam.sched_priority = 99;

   rc = pthread_create(&thread, NULL, TaskCode, NULL);
   assert(0 == rc);

   rc = pthread_setschedparam(&thread, SCHED_FIFO, &sparam);
   assert(0 == rc);

   rc = clock_gettime( CLOCK_REALTIME, &rmtp );
   assert(0 == rc);
   rmtp.tv_sec = rmtp.tv_sec + DELAI;   

   rc = pthread_make_periodic_np(thread, &rmtp, &rqtp);
   if(rc == ETIMEDOUT) printf("Début dépassé \n");
   else if(rc == ESRCH) printf("Thread invalide \n");
   assert(0 == rc);

   rc = pthread_join(thread, NULL);

   exit(EXIT_SUCCESS);
}
#定义时段1e6
#定义文件名“analogy0”
#定义模拟_SUBD 1
#定义通道0
#定义扫描大小2
#定义DELAI 5
静态字符*文件名=文件名;
静态int idx_subd=模拟_subd;
静态int idx_chan=通道;
静态int值up=450000;
静态int值向下=98500;
void*TaskCode(void*arg)
{
无符号字符sgnl=0;
无符号长溢出\u r=0;
a4l_desc_t dsc={.sbdata=NULL};
a4l_chinfo_t*chinfo;
int err=0;
无符号整数扫描大小=扫描大小;
err=a4l_打开(&dsc,文件名);
如果(误差<0){
fprintf(标准,
“insn\u写入:a4l\u打开%s失败(错误=%d)\n”,
文件名,err);
返回NULL;
}    
而(1){
pthread_wait_np(&溢出);
if(sgnl)
err=a4l\U同步\U写入(&dsc),
idx_-subd、CHAN(idx_-CHAN)、0和valueUp、扫描大小;
其他的
err=a4l\U同步\U写入(&dsc),
idx_-subd、CHAN(idx_-CHAN)、0和值向下、扫描_-size);
如果(误差<0){
fprintf(标准,
“insn\u写入:a4l\u同步\u写入失败(错误=%d)\n”,错误;
出去写吧;
}
sgnl=(sgnl+1)%2;
}
请写出:
如果(dsc.sbdata!=NULL)
免费(dsc.sbdata);
a4l_关闭(&dsc);
返回NULL;
}
内部主(空)
{
mlockall(MCL_当前| MCL_未来);
pthread\u t线程;
int rc,i;
int prio=99;
结构timespec rqtp,rmtp;
rqtp.tv_sec=0;
rqtp.tv_nsec=周期;
结构sched_param sparam;
sparam.sched_优先级=99;
rc=pthread_create(&thread,NULL,TaskCode,NULL);
断言(0==rc);
rc=pthread_setschedparam(&thread、SCHED_FIFO和sparam);
断言(0==rc);
rc=clock\u gettime(clock\u REALTIME和rmtp);
断言(0==rc);
rmtp.tv_sec=rmtp.tv_sec+DELAI;
rc=pthread\u make\u periodic\u np(线程,&rmtp,&rqtp);
如果(rc==ETIMEDOUT)printf(“Début Dépassén”);
如果(rc==ESRCH)printf(“线程无效\n”);
断言(0==rc);
rc=pthread_join(线程,NULL);
退出(退出成功);
}

我强烈怀疑(通过查看Xenomai调度程序),我的程序不知何故进入了辅助模式。我试图删除“assert”语句以及相关的printf语句,但没有成功。知道怎么解决吗?

像往常一样,魔鬼在细节中


我在gcc中启用了-Wall选项,它显示了所有警告。结果是pthread_*的头没有正确加载,这使我看不到pthread_setschedparam的第一个参数是错误的,应该是thread而不是&thread。

您能成功地使它工作吗?我有一个类似的程序,它总是在辅助模式下执行。我尝试删除所有
pthreads
,只运行了
while
循环,我可以看到它在Linux中显示为一个进程。