我正在编程主机 - 加速器系统的主机端.主机在Ubuntu Linux下的PC上运行,并通过USB连接与嵌入式硬件通信.通过将存储器块复制到嵌入式硬件的存储器和从嵌入式硬件的存储器复制来执行通信.
在主板的内存中有一个内存区域,我用它作为邮箱,我在其中写入和读取数据.邮箱定义为结构,我使用相同的定义在主机空间中分配镜像邮箱.
我过去成功地使用了这种技术,所以现在我将主机Eclipse项目复制到我当前项目的工作区,并进行了相应的名称更改.奇怪的是,在构建主机项目时,我现在收到以下消息:
构建目标:fft2d_host
调用:GCC C链接器
gcc -L/opt/adapteva/esdk/tools/host/x86_64/lib -o"fft2d_host"./ src /fft2d_host.o -le_host -lrt./src/fft2d_host.o:在函数`main'中:
fft2d_host.c :(.text + 0x280):重定位被截断以适合:R_X86_64_PC32对./src/fft2d_host.o中COMMON部分中定义的符号`Mailbox'
这个错误意味着什么以及为什么它不会建立在当前项目上,而旧项目是否可以?
在Octave中,当在命令行中键入命令时,有时我需要擦除整行并重新启动新命令.在Matlab中,删除文本将使用ESC密钥完成.在Octave,这不起作用.我发现丢弃输入文本的唯一方法是使用Ctrl-C.这有效,但它很难看,因为它留在屏幕上.
是否有一个关键组合来清除Octave中的线?
在我的程序中,我有一个功能,可以添加一个简单的向量c[0:15] = a[0:15] + b[0:15].功能原型是:
void vecadd(float * restrict a, float * restrict b, float * restrict c);
Run Code Online (Sandbox Code Playgroud)
在我们的32位嵌入式架构中,有一个加载/存储双字加载/存储选项,如:
r16 = 0x4000 ;
strd r0,[r16] ; stores r0 in [0x4000] and r1 in [0x4004]
Run Code Online (Sandbox Code Playgroud)
GCC优化器识别循环的向量性质并生成代码的两个分支 - 一个用于3个数组是双字对齐的情况(因此它使用双重加载/存储指令)而另一个用于数组的情况是字对齐的(它使用单个加载/存储选项).
问题是地址对齐检查相对于加法部分是昂贵的,我想通过暗示编译器a,b和c始终是8对齐来消除它.是否有一个修饰符添加到指针声明以告诉编译器?
用于调用此函数的数组具有aligned(8)属性,但它不会反映在函数代码本身中.是否可以将此属性添加到函数参数?
我有一个C程序,它返回一个整数值.我很惊讶地发现,当从shell提示符检查返回值时,我得到的值为模数256.
/* prog.c */
int main(...) { return 257; }
Run Code Online (Sandbox Code Playgroud)
-
> ./prog.e
> echo $?
1
Run Code Online (Sandbox Code Playgroud)
在我们的嵌入式架构中,我们有一个64位IAB(指令对齐缓冲器).为了优化获取序列,需要循环体开始与8字节边界对齐.
使用该.balign指令很容易在汇编中实现这一点,但我找不到一个会暗示C编译器对齐代码的语法.
尝试在for循环与内联汇编之前使用该.balign指令不起作用,因为它对齐for循环prolog(设置)而不是循环体本身.
asm()在循环内部执行相同操作时,将nop-s 添加到循环体中,这需要花费宝贵的周期.
编辑1:假设代码:
__asm__ volatile("nop");
__asm__ volatile("nop");
for (j0=0; j0<N; j0+=4)
{
c[j0+ 0] = a[j0+ 0] + b[j0+ 0];
c[j0+ 1] = a[j0+ 1] + b[j0+ 1];
c[j0+ 2] = a[j0+ 2] + b[j0+ 2];
c[j0+ 3] = a[j0+ 3] + b[j0+ 3];
}
Run Code Online (Sandbox Code Playgroud)
我希望第一个c=a+b与8字节地址对齐.我可以nop在初步编译后添加类似上面的-s,但这是一个特殊的解决方案,它会破坏第一个代码更改.
编辑2:感谢@R ..,解决方案是使用-falign-loops=8编译器选项.
我试图比较两个汇编文件,其中一个是全部大写,另一个是小写.许多行与case和whitespace完全相同.
我尝试了以下,而diff模式下有两个缓冲区:
:set diffopt+=icase
:set diffopt+=iwhite
:diffupdate
Run Code Online (Sandbox Code Playgroud)
空白的东西似乎运作良好,但忽略的情况不起作用.例如,在以下两行中:
I0=R0; // ADDRESS OF INPUT ARRAY
i0 = r0; // address of input array
Run Code Online (Sandbox Code Playgroud)
[第一行以12个空格开头,第二行以单个标签开头]
为什么?我能做什么?
更新:刚刚注意到在这两行中忽略了所有差异OK:
// MULTIPLY R1 BY 4 TO FETCH DATA OF WORD LENGTH
// multiply r1 by 4 to fetch data of word length
Run Code Online (Sandbox Code Playgroud) 我有一个makefile项目,包含许多源,头和其他文件,我试图将其转换为Eclipse"本机"项目.Indexer报告对目录中存在但从构建中排除的文件的错误和警告的问题.因此,我的目录树的大部分都标有红色x标记.
如何使Indexer忽略特定的文件和/或目录?
注意:将目录定义为"派生"时,将其排除在进一步搜索之外,但遗憾的是,不会从代码分析中排除.使用项目资源过滤器也无法解决问题.
值得庆幸的是,complex类型修饰符被引入C99标准.我不明白为什么决定省略对定点运算的支持(特别是支持分数类型,如1.15 {signed}或0.32 {unsigned}),这些类型对于DSP编程是如此重要?
GCC是否通过扩展支持这些?
在现代处理器中,可以从存储器加载寄存器,然后将索引指针后修改所需的值.例如,在我们的嵌入式处理器中,这将通过以下方式完成:
ldr r0, [r1], +12
Run Code Online (Sandbox Code Playgroud)
这意味着 - 将r1指向的值加载到r0,然后将r1递增12:
r0 = [r1]
r1 = r1 + 12
Run Code Online (Sandbox Code Playgroud)
在C语言中,使用指针算术,可以使用指针分配值,然后将指针前进1:
char i, *p, a[3]={10, 20, 30};
p = &(a[0]);
i = *p++;
// now i==10 and p==&(a[1]).
Run Code Online (Sandbox Code Playgroud)
我正在寻找一种取消引用指针的方法,同时用1以外的偏移量对其进行后期修改.这是否可以在C中进行,因此它可以很好地映射到类似的asm指令?
注意:
i = *p+=2;
Run Code Online (Sandbox Code Playgroud)
增加[0] w/o修改指针的值,并且:
i = *(p+=2);
Run Code Online (Sandbox Code Playgroud)
预修改指针,所以在这种情况下i==30.
我试图在C中创建一个"单行注释"宏,根据一些全局宏定义,这有条件地用于注释掉代码行.这与本文中表达的观点相同.
尝试这段代码的许多排列,我不断收到编译器的错误消息.
例如,直接关注该页面的代码示例:
#define COMMENT SLASH(/)
#define SLASH(s) /##s
#define DEBUG_ONLY COMMENT
DEBUG_ONLY a = b; // <-- line #83
Run Code Online (Sandbox Code Playgroud)
GCC给出以下错误:
prog.c:83:1:错误:粘贴"/"和"/"没有给出有效的预处理标记
prog.c:83:错误:'/'标记之前的预期表达式
如上所述,我玩过这个主题并尝试了很多变化,但都没有给出类似的诊断.
我做错了什么,为什么文章中的代码编写得不好?
c ×7
gcc ×6
alignment ×2
c99 ×2
eclipse ×2
bash ×1
command-line ×1
ds-5 ×1
eclipse-cdt ×1
embedded ×1
fixed-point ×1
for-loop ×1
ignore-case ×1
indexer ×1
macros ×1
octave ×1
pointers ×1
return-value ×1
ubuntu-10.04 ×1
vim ×1
vimdiff ×1