我有一个在Linux上运行的小程序(在嵌入式PC上,双核Intel Atom 1.6GHz,Debian 6运行Linux 2.6.32-5),它通过FTDI USB转串口转换器与外部硬件通信(使用ftdi_sio内核)模块和/dev/ttyUSB*设备).基本上,在我的主循环中,我运行
clock_gettime() 运用 CLOCK_MONOTONICselect() 超时为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毫秒).cron.daily当时正在执行的事实之外的信息很少).所以,我的问题是:什么因素能在这种极端的情况下参与?这只是Linux内核本身可能发生的事情,即我必须切换到RT_PREEMPT,甚至是非USB接口和Xenomai,以获得更可靠的保证吗?可能/proc/sys/kernel/sched_rt_runtime_us咬我?还有其他因素我可能错过了吗?
提出这个问题的另一种方法是,如果不切换到"更难"的实时环境,我还能做些什么来减少这些延迟异常?
更新:我观察到一个新的,"更糟糕的最坏情况",大约118.4毫秒(一次超过总共约2500万个select()电话).即使我没有使用任何实时扩展的内核,我有点担心的是,截止日期显然可能超过十分之一秒.
我刚刚使用参数依赖查找遇到了一些有趣的行为,我不完全理解:
#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) 我正在构建一个光线跟踪器,在很多情况下我需要在三个浮点数上进行加法和乘法运算.
在这种情况下,我一直在以天真的方式做到这一点:
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)
这也会发生在等价的类中,如Point或Vect3.
然后我听说了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中做到这一点(如果它甚至完全不同),我似乎无法找到任何其他方法.
我正在寻找一种生成Go源代码的方法.
我发现go/parser生成一个AST形式的Go源文件,但是找不到从AST生成Go源的方法.
所以我正在尝试创建一个弹出菜单,当用户按下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)
有谁知道为什么?
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)