众所周知,以下代码将由所有合理的编译器优化:
const int a = 3;
const int b = 42;
if (a == b)
{
do_something();
}
Run Code Online (Sandbox Code Playgroud)
如果两个常量相同,if
则省略并始终调用函数,如果它们不同,则省略整个块.
但是,在某些情况下,重要的是不要优化此代码,因为程序本身可以在运行之前进行修改.例如,二进制文件位于闪存中,可由外部程序访问,当然两者的地址const
是固定的.(在嵌入式中有意义).
我正在考虑使用#pragma
,但这不是C标准的一部分.
另一种方法是使用const volatile
.这是否可以保证适用于所有符合标准的编译器?
我已经看到了关于结构的字节序的一些问题和答案,但它们是关于检测系统的字节序,或者在两个不同的字节序之间转换数据.
但是,如果有一种方法可以强制执行给定结构的特定字节顺序,那么我现在想要的是什么.是否有一些好的编译器指令或其他简单的解决方案,除了重写操作在位域上的很多宏的整个事情?
一般的解决方案会很好,但我也会对特定的gcc解决方案感到满意.
编辑:
感谢所有评论指出为什么强制执行endianness不是一个好主意,但在我的情况下,这正是我需要的.
特定处理器生成大量数据(永远不会改变,它是带有自定义硬件的嵌入式系统),并且必须由在未知处理器上运行的程序(我正在处理)读取.对数据进行字节评估会非常麻烦,因为它包含数百种不同类型的结构,这些结构非常庞大且深入:它们中的大多数都有许多其他巨大的结构层.
改变嵌入式处理器的软件是不可能的.源是可用的,这就是为什么我打算使用该系统的结构而不是从头开始并按字节方式评估所有数据.
这就是为什么我需要告诉编译器它应该使用哪个字节序,无论效率与否都无关紧要.
它不一定是字节序的真正变化.即使它只是一个接口,物理上所有东西都是在处理器自己的字节序中处理的,但我完全可以接受.
我有一个QThread
定期生成相当大量的数据(每秒几兆字节),并且需要将其传输到父(GUI)线程.
我担心我在内部工作中并不确定,QThread
所以我想要求最佳实践.
显然,传输数据的最直接方式是仅emit
使用数组.但是,这有多高效?Qt是否知道它的使用位置并避免在发送和接收时对其进行深度复制?
如果没有,我很乐意只在主线程中分配内存并给出一个指向子线程的指针,它将写入数据(并且只有emit
关于进度的短消息).这对我来说似乎不是最优雅的解决方案,这就是我要问的原因.
如果Qt避免在发送和接收时复制多个缓冲区中的数据,是否可以在所有系统中保证?我没有资源在各种操作系统下尝试对其进行基准测试.
作为任何非零值意味着真实的,但是>
,<
,==
等运营商回归1
真正的,我如果有任何显着的C编译器,当这些运营商可能会导致的值大于好奇1
.
换句话说,是否有任何编译器int i = (a==b)
; 如果我打算不使用i
不作为布尔值,而是作为一个整数,并假设它将是0
或者1
?会导致未定义的行为
OpenCV最近升级了它的显示窗口,当它在Qt中使用时.它看起来非常好,但我没有发现它嵌入现有Qt GUI窗口的任何可能性.唯一的可能性似乎是创建一个cvNamedWindow
或cv::namedWindow
,但它创建了一个自由浮动的独立窗口.
是否有可能在现有GUI中创建OpenCV窗口?我在OpenCV论坛上找到的所有内容都是一个悬而未决的问题,有点类似于我自己的问题.
在Qt中显示OpenCV图像是一种直接的可能性,但它有两个主要问题:
cvNamedWindow
,它运行速度非常流畅,甚至为多部影片的同时,但如果我去通过IplImage
- > QImage
- > QPixmap
- > QLabel
航线,即使是一个视频也有严重的延迟)cvNamedWindow
.在C
标准库函数中,字符串的元素是char
s.是否有一个很好的理由来决定它而不是unsigned char
?
使用unsigned char
8位字符串有一些虽然小的优点:
默认情况下,Qt使用一种非常简单,快速和丑陋的缩放图像方式Qt::FastTransformation
,可能是最近邻插值或类似的东西.
在处理a时QPixmap
,可以选择视觉上更好的缩放,例如,
pixmap = pixmap.scaledToHeight(height, Qt::SmoothTransformation);
Run Code Online (Sandbox Code Playgroud)
但是,如果图像不在QPixmap
对象中,而只是按钮的背景或其他小部件,我们可以做什么?
例如,以下是一种非常简单的方法,可以创建自动调整大小,完全自定义的按钮,非常适合与分辨率无关的应用程序,当与布局和使用时setStretch()
.
ui->pushButton->setStyleSheet(
"QPushButton { border-image: url(:/img/button.png) 0 0 0 0 stretch stretch; }"
"QPushButton:checked { border-image: url(:/img/button_checked.png) 0 0 0 0 stretch stretch; }"
"QPushButton:pressed { border-image: url(:/img/button_pressed.png) 0 0 0 0 stretch stretch; }"
"QPushButton:checked:pressed { border-image: url(:/img/button_checked_pressed.png) 0 0 0 0 stretch stretch; }"
);
Run Code Online (Sandbox Code Playgroud)
我使用border-image
而不是background-image
由于Qt样式表的缺陷.
如何使用样式表中使用的图像进行更平滑的缩放?
使用pixmaps实现相同的功能更不优雅.我将不得不总是捕获调整大小事件,重新计算我所有小部件的新大小,并手动重新绘制它们.
编辑:
有趣的是,如果图像被放大,则平滑缩放与样式表一起使用,但在缩小图像时则不适用.
在以下示例中,在第一行中,使用32*32图标,在第二行中,使用大于2000*2000的统一网格.
我的代码中有一个奇怪的错误,当我尝试调试时会消失.
在我的计时器中断(总是运行系统自动收报机)我有这样的事情:
if (a && lot && of && conditions)
{
some_global_flag = 1; // breakpoint 2
}
Run Code Online (Sandbox Code Playgroud)
在我的主循环中我有
if (some_global_flag)
{
some_global_flag = 0;
do_something_very_important(); // breakpoint 1
}
Run Code Online (Sandbox Code Playgroud)
当计时器中的条件(我认为)满足时,主循环中的这种情况永远不会被调用.条件是外部的(portpins,ADC结果等).首先,我在位置1处放置一个断点,它永远不会被触发.
为了检查它,我把断点nr.2在线some_global_flag = 1;
,在这种情况下代码工作:当条件为真时触发两个断点.
更新1:
要研究是否有一些时间条件负责,并且if
如果在没有调试的情况下运行,则永远不会输入计时器,我在计时器中添加了以下内容:
if (a && lot && of && conditions)
{
some_global_flag = 1; // breakpoint 2
}
if (some_global_flag)
{
#asm("NOP"); // breakpoint 3
}
Run Code Online (Sandbox Code Playgroud)
该标志不会在代码中的任何其他位置使用.它在RAM中,RAM在开始时清零.
现在,当所有断点都被禁用时(或者只启用了main中的断点1),代码无法正常工作,则不执行该功能.但是,如果我只在NOP上启用断点3,则代码可以正常工作!断点被触发,继续后,执行该功能.(它有可见和可听的输出,所以它很明显,如果它运行)
更新2:
定时器中断通过其开头的"SEI"是可中断的.我删除了该行,但行为没有以任何明显的方式改变.
更新3:
我没有使用任何外部存储器.因为我非常接近flash中的限制,所以我在编译器中进行了最大化优化.
编译器(CodeVision)可以负责,还是我做错了什么?
正如在这个问题中所讨论的,C++ 11优化了无限循环.
然而,在具有单一目的的嵌入式设备中,无限循环是有意义的并且实际上经常被使用.即使是完全空的while(1);
也适用于看门狗辅助复位.终止但空循环在嵌入式开发中也很有用.
是否有一种优雅的方式来专门告诉编译器不要删除空循环或无限循环,而不完全禁用优化?
我正在使用Qt编写一个Android应用程序,使用opencv.我设置了所有内容,以便我的应用程序无需opencv即可正常运行.但是,在我包含opencv 3.2(通过下载最新的sdk并设置库路径)之后,编译失败了数百个未定义的引用错误,所有这些都涉及到carotene_o4t
.
C:/opencv/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): error: undefined reference to 'carotene_o4t::isSupportedConfiguration()'
C:/opencv/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): error: undefined reference to 'carotene_o4t::cmpGE(carotene_o4t::Size2D const&, unsigned char const*, int, unsigned char const*, int, unsigned char*, int)'
C:/opencv/OpenCV-android-sdk/sdk/native/libs/armeabi-v7a/libopencv_core.a(arithm.cpp.o):arithm.cpp:function cv::hal::cmp8u(unsigned char const*, unsigned int, unsigned char const*, unsigned int, unsigned char*, unsigned int, int, int, void*): …
Run Code Online (Sandbox Code Playgroud)