我正在试图找出我正在设置的工具链的gcc选项,用于开发板:Sabre-lite,它基于飞思卡尔的iMX6q四核处理器.
现在我知道iMX6基本上是一个cortex-a9处理器,它有协处理器vfpv3和霓虹灯,还有矢量图形,2D甚至3D引擎.
但是,发行说明和使用指南文档对于如何启用可在gcc中启用的任何选项并不太清楚.
事实上,我可以"玩"的选项如下.
-march= armv7-a - ok this one is pretty obvious.
-mfpu= vfpv3/neon - i can use only the vfpv3 co-processor, or both (respectively, depends on option)
-mfloat-abi=softfp/soft/hard - I guess I can choose hard here, as there is hardware for fp operations
-mcpu=cortex-a9 - is it option even necessary? it is not clear if it just an alias for -march or something else.
Run Code Online (Sandbox Code Playgroud)
我应该启用其他选项吗?为什么工具链具有构建linux内核/ uboot/packages的默认选项:
-march= armv7-a -mfpu= vfpv3 -mfloat-abi=softfp
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
我无法更改我所从事的项目的 CMakeLists.txt,并且其中使用的 cmake 工具链文件仅声明要发布的 C 和 CXX FLAGS。
因此,为了调试,我需要强制使用自己的标志(即将 -O0 -DDEBUG 附加到 CFLAGS 和 CXXFLAGS)。
所以我尝试使用以下示例通过 cli
主要.cpp:
#include <iostream>
int main(int argc, char * argv[])
{
std::cout << "hello world\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
CMakeLists.txt:
cmake_minimum_required(VERSION 3.1)
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
#prescon settings
project(cmakecflags)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CXX_EXTENSIONS NO)
enable_testing()
add_executable(cmakecflagsapp
main.cpp
)
message(CFLAGS=${CFLAGS})
message(CXXFLAGS=${CXXFLAGS})
Run Code Online (Sandbox Code Playgroud)
调用cmake:
CFLAGS=' -O0 -DDEBUG ' CXXFLAGS=' -O0 -DDEBUG ' cmake -G 'Unix Makefiles' -DCMAKE_VERBOSE_MAKEFILE=ON -DCMAKE_BUILD_TYPE=Debug .
Run Code Online (Sandbox Code Playgroud)
结果如预期,使 2 个变量为空
-- The C compiler identification …Run Code Online (Sandbox Code Playgroud) 这段C代码在gdb中给出了分段错误
if ((seq_entry_action=malloc((seq_subphases)*sizeof(int*)))==NULL){
printf("Cannot allocate memory for seq_entry_action\n");
}
Run Code Online (Sandbox Code Playgroud)
哪里:
int **seq_entry_action=NULL;
unsigned int seq_subphases=0;
Run Code Online (Sandbox Code Playgroud)
在执行时,如果我在这段代码之前在gdb中添加一个断点(它只是另一个printf()语句),那么值是
(gdb) p seq_subphases
$3 = 88
(gdb) p seq_entry_action
$4 = (int **) 0x0
Run Code Online (Sandbox Code Playgroud)
然后我按下接下来它在malloc上的段错误
我真的不明白.....
我见过很多的博客文章和视频,并源折轴有关如何使用OpenCV的执行相机+投影机标定在互联网上,以生产camera.yml,projector.yml和projectorExtrinsics.yml文件.
我之后还没有看到有人讨论如何处理这些文件.事实上,我自己做过校准,但我不知道自己应用程序的下一步是什么.
假设我编写的应用程序现在使用相机 - 我校准的投影仪系统来跟踪对象并在其上投影.我将使用contourFind()从移动物体中抓取一些感兴趣的点,现在我想将这些点(从投影仪!)投射到物体上!
我想要做的是(例如)跟踪对象的质心(COM)并在跟踪对象的摄像机视图上显示一个点(在其COM处).然后应该在物体的COM上实时投射一个点.
这似乎projectPoints()是我在加载yml文件后应该使用的openCV函数,但我不确定如何考虑相机和投影仪的所有内在和外在校准值.即,projectPoints()需要作为参数
因此,如果我使用投影仪或相机(哪一个??)内在函数+系数projectPoints(),那么我只会'纠正'2个乐器中的一个.我在哪里/如何使用对方的内在函数?
除了load()yml文件之外我还需要使用 projectPoints()什么?(也许是不成正比的?)
非常感谢任何有关此事的帮助.如果有教程或书籍(不,O'Reilly"学习openCV"也没有谈论如何使用校准yml文件! - 仅关于如何进行实际校准),请指出我的方向.我不一定需要一个确切的答案!
我正在linux中编写一个应用程序,需要访问串口.出于调试目的,我需要查看来自和/或通过串行端口的内容.
我环顾四周,发现我可以使用strace来做到这一点.所以我尝试了以下方法:
-I打印我使用的串行设备的file_descriptor.
(重新启动我的应用程序几次后,我向自己保证,我的应用程序从内核获取的file_descriptor数字是"4"
- 如果我启动我的应用程序strace -e write=4 ./myapp,我希望在终端中获取消息,仅来自file_descriptor"4".相反,我得到输出的looots:
read(5, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0(\0\1\0\0\0\300Q\254C4\0\0\0"..., 52
fstat64(5, {st_mode=S_IFREG|0644, st_size=1448930, ...}) = 0
mmap2(0x43ab8000, 153816, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 5, 0)0
mprotect(0x43ad6000, 28672, PROT_NONE) = 0
mmap2(0x43add000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRI0
close(5) = 0
munmap(0x2ab4c000, 38409) = 0
exit(0)
Run Code Online (Sandbox Code Playgroud)
来自几个不同的file_descriptors.
如果我运行我的应用程序 strace -e trace=write -e write=4 ./myapp
我会得到更少的消息,即使它们仍然很多,或者file_descriptor"1".
write(1, "GPIO data bank:0x8, data: 0x80 a"..., 52GPIO data bank:0x8, data: 0x81) = 52
write(1, "\n", 1) = 1
write(1, "--> Version: 0677 <--\n", 22--> Version: 0677 <-- …Run Code Online (Sandbox Code Playgroud) 我正在查看一些c ++代码,我遇到了这个:
if( (size & 0x03L) != 0 )
throw MalformedBundleException( "bundle size must be multiple of four" );
Run Code Online (Sandbox Code Playgroud)
L在十六进制值之后的含义是什么?
它是如何改变价值的0x03?
我有一个bash数组OUTARRAY,我填充将处理一个值INARRAY.我经常追加到OUTARRAY特殊字符,即\t并\n
因此它可能看起来像:
OUTARRAY[j]="\n"
Run Code Online (Sandbox Code Playgroud)
要么
OUTARRAY[j]="${INARRAY[i]}\t"
Run Code Online (Sandbox Code Playgroud)
最后我将OUTARRAY文件转储到文件中
printf "%s" "${OUTARRAY[@]}" > ${OUTFILE}
Run Code Online (Sandbox Code Playgroud)
然而,我得到的结果是,单行文件中打印了所有特殊字符:
\n2771\t2899\t7624\t2911\t\n2772\t2904\t7706\t2911\t\n2771\t2909
Run Code Online (Sandbox Code Playgroud)
相反,我想要圆柱输出.就像是
2771 2899 7624 2911
2772 2904 7706 2911
Run Code Online (Sandbox Code Playgroud)
等等.我做错了什么?谢谢
我很难确定我的代码中的内存泄漏位置.
我运行的valgrind命令:
valgrind --leak-check=full --log-file=vg1.log --show-leak-kinds=all --leak-resolution=low --track-origins=yes --leak-check-heuristics=all ./enalu_dbg
Run Code Online (Sandbox Code Playgroud)
和输出
==22866== Memcheck, a memory error detector
==22866== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==22866== Using Valgrind-3.10.1 and LibVEX; rerun with -h for copyright info
==22866== Command: ./enalu_dbg
==22866== Parent PID: 21933
==22866==
==22866==
==22866== HEAP SUMMARY:
==22866== in use at exit: 47,252 bytes in 240 blocks
==22866== total heap usage: 288 allocs, 48 frees, 55,138 bytes allocated
==22866==
==22866== 4 bytes in 1 blocks …Run Code Online (Sandbox Code Playgroud) 我正在寻找一种方法来替换 makefile 中源文件变量列表中的文件夹。
有什么可以在这里工作的吗?
我首先找到我的源文件
program_C_SRCS := $(wildcard $(SRCDIR)/*.c)
program_CXX_SRCS := $(wildcard $(SRCDIR)/*.cpp)
Run Code Online (Sandbox Code Playgroud)
结果(如果我正确理解 GNU 生成文件)通常看起来像
src/main.cpp
src/sensor.cpp
然后我通过目标文件构建
program_C_OBJS := ${program_C_SRCS:.c=.o}
program_CXX_OBJS := ${program_CXX_SRCS:.cpp=.opp}
Run Code Online (Sandbox Code Playgroud)
这按预期替换了我的源文件的扩展名。
最后,我想用“obj/”替换“src/”
program_C_OBJPATH := ${subst $(SRCDIR) , $(OBJDIR) , $(program_C_OBJS)}
program_CXX_OBJPATH := ${subst $(SRCDIR) , $(OBJDIR) , $(program_CXX_OBJS)}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用。
我已经浏览了 GNU makefile 网站,但无济于事。这个解决方案Makefile 将来自不同目录的源文件的目标文件放入一个单独的目录中?接近但对象目录必须明确包含在任何地方,并且源目录不包含源路径信息。
在我的 makefile 中,源文件列表包含路径,我希望目标文件列表也包含相应的目标目录。
makefile 的其余部分也尝试使用变量
连接阶段
$(program_NAME): $(program_OBJS)
$(CXX) $(CFLAGS) $(CXXFLAGS) $(LDFLAGS) $(program_OBJS) -o "$(program_NAME)"
Run Code Online (Sandbox Code Playgroud)
编译阶段
%.opp : %.cpp | mkdirobjdir
$(CXX) $(CFLAGS) $(CXXFLAGS) $(CPPFLAGS) -c -o "$@" "$<" …Run Code Online (Sandbox Code Playgroud) 我正在研究gcc,我想知道这是否可行:
我有一个函数(NOTmain但是aLocalFn),我在其中声明了一个局部变量.然后我将此局部参数作为线程参数传递.它可行吗?或者有机会(取决于先运行的是什么)在运行threadFunction之前aLocalVar会丢失,而引用idxPtr将指向无意义?
int *threadFunction(void *idxPtr){
int rec_idx=(int) *idxPtr;
//work in the thread with this variabel rec_idx
}
int aLocalFn(){
int aLocalVar=returnsRecordIndex();
pthread_create(&thread_id,&attr_detached,threadFunction, &aLocalVar)!=0)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助
我不确定我是否正确说明了这一点.
这是我在bash脚本中的内容
ATEXT="this is a number ${i} inside a text string"
Run Code Online (Sandbox Code Playgroud)
然后我希望${i}在以下for循环中解决.
for i in {1..3}; do
echo "${ATEXT}"
done
Run Code Online (Sandbox Code Playgroud)
当然上面的方法不起作用,因为i在ATEXT读取变量时会解析.
但是,我不知道如何实现我想要的.这是获得输出:
this is a number 1 inside a text string
this is a number 2 inside a text string
this is a number 3 inside a text string
Run Code Online (Sandbox Code Playgroud) 这个线程是在这里开始的,但是由于缺乏一个完整的好例子(并且为了避免删除所有那个问题),这里重写了它.
因此,在以下示例中,void cppthread::ThreadedFunc()生成的gets作为单独的线程执行.相反,我宁愿void ThreadedWrite::ThreadedFunc()被执行.我怎样才能做到这一点?(代码后面还有一些细节)
cppthread.hpp
#ifndef CPPTHREAD_HPP
#define CPPTHREAD_HPP
#include <pthread.h>
using namespace std;
class cppthread
{
public:
cppthread();
virtual ~cppthread();
virtual void threadedFunc();
///parentObj (ie "this" pte from caller") is
///necessary in order to execute the correct
///threadedFunc() even when the derived class
///wants to spawn a thread.
int spawn(void *parentObj = NULL);
void terminate();
protected:
pthread_mutex_t mtx;
bool exitThread;
private:
/* add your private declarations */
int join();
pthread_t threadId; …Run Code Online (Sandbox Code Playgroud) 我有这个c ++结构:
struct Packet
{
uint32 MessageCount;
uint32 Length;
uint32 FieldValue;
union PacketHeader
{
uint32 typeInfo;
struct MagicVersion
{
uint8 MagicNumber[3];
uint8 Version;
};
};
Data * Payload(void) { return reinterpret_cast< Data * >(this + 1U); }
Data const * Payload(void) const { return reinterpret_cast< Data const * >(this + 1U); }
Packet * nextPacket(void) { return reinterpret_cast< Packet * >(this + 1U) + Length; }
Packet const * nextPacket(void) const { return reinterpret_cast< Packet const * >(this + 1U) …Run Code Online (Sandbox Code Playgroud)