小编min*_*iot的帖子

什么可以延迟我的select()调用?

我有一个在Linux上运行的小程序(在嵌入式PC上,双核Intel Atom 1.6GHz,Debian 6运行Linux 2.6.32-5),它通过FTDI USB转串口转换器与外部硬件通信(使用ftdi_sio内核)模块和/dev/ttyUSB*设备).基本上,在我的主循环中,我运行

  • clock_gettime() 运用 CLOCK_MONOTONIC
  • select() 超时为8毫秒
  • clock_gettime() 像之前一样
  • 输出两个clock_gettime()呼叫的时差

为了获得某种程度的"软"实时保证,该线程SCHED_FIFO以最高优先级运行(显示为"RT" top).它是系统中唯一以此优先级运行的线程,没有其他进程具有此类优先级.我的进程有另一个SCHED_FIFO优先级较低的线程,而其他一切都在SCHED_OTHER.这两个"实时"线程不受CPU限制,除了等待I/O和传递数据之外几乎没有.

我使用的内核没有RT_PREEMPT补丁(我将来可能会切换到该补丁).我知道如果我想要"正确"实时,我需要切换到RT_PREEMPT,或者更好的是Xenomai等.但是,我想知道"vanilla"内核的以下时序异常背后的原因:

  • 所有select()呼叫的大约0.03%的时间超过10毫秒(记住,超时为8毫秒).
  • 三个最坏的情况(超过1200万次呼叫)分别为31.7毫秒,46.8毫秒和64.4毫秒.
  • 所有这些都发生在彼此的20秒内,我认为一些cron作业可能已经干扰了(虽然系统日志除了cron.daily当时正在执行的事实之外的信息很少).

所以,我的问题是:什么因素在这种极端的情况下参与?这只是Linux内核本身可能发生的事情,即我必须切换到RT_PREEMPT,甚至是非USB接口和Xenomai,以获得更可靠的保证吗?可能/proc/sys/kernel/sched_rt_runtime_us咬我?还有其他因素我可能错过了吗?

提出这个问题的另一种方法是,如果切换到"更难"的实时环境,我还能做些什么来减少这些延迟异常?

更新:我观察到一个新的,"更糟糕的最坏情况",大约118.4毫秒(一次超过总共约2500万个select()电话).即使我没有使用任何实时扩展的内核,我有点担心的是,截止日期显然可能超过十分之一秒.

c linux real-time

10
推荐指数
1
解决办法
541
查看次数

依赖于参数的查找在从另一个名称空间别名的类型上出现意外行为

我刚刚使用参数依赖查找遇到了一些有趣的行为,我不完全理解:

#include <iostream>

namespace a {
struct Foo {
  Foo(int v1, int v2) : v1(v1), v2(v2) { }
  int v1,v2;
};
}

namespace b {
template <typename T>
struct Baz : T {
  using T::T;
};
}

namespace c {
using Foo = ::b::Baz< ::a::Foo>;

// (1) NOT FOUND BY ADL
// std::ostream& operator << (std::ostream& os, const Foo& foo)
// {
//   return os << foo.v1 << "," << foo.v2;
// }
}

namespace b {

// (2) FOUND …
Run Code Online (Sandbox Code Playgroud)

c++ language-lawyer argument-dependent-lookup

6
推荐指数
1
解决办法
93
查看次数

使用g ++在C++中使用SIMD指令的现代方法

我正在构建一个光线跟踪器,在很多情况下我需要在三个浮点数上进行加法和乘法运算.

在这种情况下,我一直在以天真的方式做到这一点:

class Color{
    float mR, mG, mB;

    ...
    Color operator+(const Color &color) const
    {
        return Color(mR + color.mR,
                     mG + color.mG,
                     mB + color.mB);
    }

    Color operator*(const Color &color) const
    {
        return Color(mR * color.mR / COLOR_MAX,
                     mG * color.mG / COLOR_MAX,
                     mB * color.mB / COLOR_MAX);
    }
}
Run Code Online (Sandbox Code Playgroud)

这也会发生在等价的类中,如PointVect3.

然后我听说了SIMD指令,它们看起来非常适合我正在做的事情.所以,当然,我用Google搜索并找到了这段代码:

typedef int v4sf __attribute__((mode(V4SF))); // Vector of three single floats

union f4vector
{
    v4sf v;
    float f[4];
};
Run Code Online (Sandbox Code Playgroud)

首先使用额外的四个我现在不需要.但是gcc警告我:

__attribute__ ((mode))不推荐使用指定向量类型

我想知道如何在C++ 14中做到这一点(如果它甚至完全不同),我似乎无法找到任何其他方法.

c++ gcc simd

6
推荐指数
0
解决办法
898
查看次数

生成Go源代码

我正在寻找一种生成Go源代码的方法.

我发现go/parser生成一个AST形式的Go源文件,但是找不到从AST生成Go源的方法.

go generated-code

5
推荐指数
1
解决办法
944
查看次数

弹出菜单崩溃在show();

所以我正在尝试创建一个弹出菜单,当用户按下ImageButton时弹出菜单会弹出.

我得到了奇怪的力量关闭错误popupMenu.show():

case R.id.action_menu_edit_biljeske_uredi:
  linearLayoutDodajBiljeskuBojeIOstalaSranja.setVisibility(View.VISIBLE);
  imageButtonBiljeskeDodajBiljeskuBojaPozadine
    = (ImageButton) findViewById(R.id.imageButtonBiljeskeDodajBiljeskuBojaPozadine);
  imageButtonBiljeskeDodajBiljeskuBojaPozadine.setOnClickListener(
    new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        PopupMenu popupMenu = new PopupMenu(getApplicationContext(),
                                            imageButtonBiljeskeDodajBiljeskuBojaPozadine);
        popupMenu.getMenuInflater().inflate(R.menu.menu_popup_biljeske_boje,
                                            popupMenu.getMenu());
        popupMenu.show();
      }
    });
}
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么?

logcat的

04-12 20:22:27.847 24594-24594/com.daroioradecic.studyandexamplannerbydario E/AndroidRuntime:
  FATAL EXCEPTION: main
  Process: com.daroioradecic.studyandexamplannerbydario, PID: 24594
  java.lang.RuntimeException: Failed to resolve attribute at index 6
      at android.content.res.TypedArray.getLayoutDimension(TypedArray.java:603)
      at android.view.ViewGroup$LayoutParams.setBaseAttributes(ViewGroup.java:6474)
      at android.view.ViewGroup$MarginLayoutParams.<init>(ViewGroup.java:6642)
      at android.widget.FrameLayout$LayoutParams.<init>(FrameLayout.java:741)
      at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:685)
      at android.widget.FrameLayout.generateLayoutParams(FrameLayout.java:62)
      at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
      at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
      at android.support.v7.view.menu.MenuPopupHelper$MenuAdapter.getView(MenuPopupHelper.java:374)
      at android.support.v7.view.menu.MenuPopupHelper.measureContentWidth(MenuPopupHelper.java:223)
      at android.support.v7.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:157)
      at android.support.v7.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:129)
      at android.support.v7.widget.PopupMenu.show(PopupMenu.java:216) …
Run Code Online (Sandbox Code Playgroud)

java xml android

0
推荐指数
1
解决办法
970
查看次数