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

2024-05-10

我正在创建一个周期性线程,它在模拟输出上输出方波信号。我正在使用 Xenomai API 中的 Posix Skin 和 Analogy。

我使用示波器测试了代码的实时性能,并查看了方波信号(频率为 1kHz)的延迟。我应该实现 250us 延迟),例如移动鼠标、启动新程序等。

我的 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);
}

我强烈怀疑(通过查看 Xenomai 调度程序)我的程序以某种方式进入辅助模式。我尝试删除“assert”语句以及相关的 printf,但这没有成功。知道如何修复它吗?


一如既往,细节决定成败。

我在 gcc 中启用了 -Wall 选项,它显示了所有警告。事实证明 pthread_* 的标头未正确加载,这使我无法看到 pthread_setschedparam 的第一个参数是错误的,并且应该是线程而不是 &thread。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Xenomai 中的周期性线程实时失败 的相关文章

随机推荐

  • 从哪里可以获得 Microsoft.SqlServer.ManagedDTS 版本 15?

    我有一个 SSIS 项目 dtproj 可以在 VS 2017 中正常打开 我正在尝试在 Visual Studio 2019 中打开它 我安装了 SQL Server Integration Services Projects 扩展 并且
  • 我怎样才能制作自己的惰性迭代器?

    我正在创建一个生成大量数据的 C 11 类 该数据当前来自数据库 无法完全放入内存中 我想为用户提供一个行为类似于常规 STL 迭代器的迭代器 但这会很懒 更准确地说 我可以做这样的事情 for auto item big bunch of
  • 多重处理:如何从子进程重定向标准输出?

    注意 我见过multiprocessing Process 的日志输出 https stackoverflow com questions 1501651 log output of multiprocessing process 不幸的是
  • 您可以将文本文件中的信息导入/引用到 Markdown 文件中吗?

    我找不到这方面的示例 但是是否可以通过引用将文本导入到 Markdown 文件中 例如 假设我有我的README md Markdown 可以导入吗somefile txt进入自述文件 就像图像参考一样 简单回答 不 Markdown 不支
  • Python3+Kivy+Plyer 推送通知图标问题

    我在使用 Android 的简单通知测试应用程序时遇到了一个奇怪的错误 错误 python AttributeError type object notification org notificator R drawable has no
  • 从边界框确定文本坐标 a 的正确方法是什么?

    鉴于调用的结果imagettfbbox https www php net manual en function imagettfbbox php 什么是正确的 像素完美的点提供给imagettftext https www php net
  • C#、Visual Basic.NET 和托管 C++ 之间的字符串文字有何区别?

    我指的是在代码中编写字符串的语法 包括多行字符串和逐字字符串 上下文 我正在开发一个扫描代码的工具 确定令牌何时位于字符串内非常重要 Thanks 这是语言之间的快速细分 托管 C 以与普通 C C 或 C 类似的方式支持字符串文字 也就是
  • 编译时和运行时转换 C#

    我想知道为什么 C 中的某些强制转换会在编译时进行检查 而在其他情况下则将责任转嫁给 CLR 如上所述 两者都是不正确的 但处理方式不同 class Base class Derived Base class Other static vo
  • 在应用程序启动期间更改主题的最快方法

    目前 我确实在我的应用程序中根据用户最后的选择提供了 2 个主题 深色主题和浅色主题 在主要活动启动期间 我将执行以下操作 public class MyFragmentActivity extends FragmentActivity O
  • C# 中的继承树和受保护的构造函数

    给定以下继承树 以有效的方式实现它的最佳方法是什么 abstract class Foo
  • bash 函数保留制表符补全

    我把函数 make color make 1 ccze A in bashrc获得彩色的 make 输出 他的作品很好 但是make用于选择目标的制表符补全功能丢失 有什么方法可以保留函数中命令的制表符完成 或者我可以做其他事情来实现制表符
  • 方法不必要地被调用?

    我有一个 BaseActivity 它可以通过其他所有活动进行扩展 问题是 每当用户离开 暂停 活动时 我都会将音乐静音 我也不再接听电话 问题是 onPause每当用户在活动之间切换时就会被调用 这意味着应用程序不必要地静音和停止tele
  • 如何从 JavaScript 触发 ASP.NET Core 客户端验证

    有没有办法从 JavaScript 触发 ASP NET Core 客户端验证 我有一个 Razor Pages 页面 其中包含
  • 从控制台应用程序隐藏控制台窗口[重复]

    这个问题在这里已经有答案了 我有一个使用控制台的应用程序 但我更改了所有代码以写入文件而不是控制台 我现在希望在运行应用程序时控制台停止出现 我该怎么做呢 我不知道是什么首先打开了控制台 即使代码中没有写入任何内容 我查看了应用程序引用 但
  • 同时调用多个支持 bean 方法

    有没有办法从 JSF 中的不同支持 bean 调用多个方法 我有一个存储用户信息的应用程序 我有多个支持 bean 它们分为时间表 地址 电话等 当应用程序最初加载时 一切正常 但由于我的所有视图都是类型 ViewScope即使显示新用户
  • Visual Studio退出调试,没有任何异常或错误

    我有一个TCP CLIENT游戏服务器项目在视觉工作室2010 当我在调试模式下启动项目时 需要一段时间 有时 1 天 有时 1 周 视觉工作室退出调试 没有任何异常或错误 我检查了窗口和应用程序日志 没有什么意外的 如何找出真正的问题是什
  • 生成的表的行跨度导致额外的单元格

    HTML table border 1 cellspacing 1 width 100 thead tr td class csstextheader width 70px td td class csstextheader width 7
  • jQuery 无法在外部 JavaScript 中工作

    我是 jQuery 新手 遇到了一些奇怪的问题 我正在使用 jQuery 的change and click方法 在我的 HTML 文件中使用时它们工作正常
  • Python 2.7 布尔运算符逻辑

    我目前正在学习Python 2 7 并且遇到了相等和布尔运算符 我的问题是 Why False and 1 is False but True and 1 is 1 同样地 False or 1 is 1 but True or 1 is
  • Xenomai 中的周期性线程实时失败

    我正在创建一个周期性线程 它在模拟输出上输出方波信号 我正在使用 Xenomai API 中的 Posix Skin 和 Analogy 我使用示波器测试了代码的实时性能 并查看了方波信号 频率为 1kHz 的延迟 我应该实现 250us