我在使用嵌入式arm gcc编译器的链接器时遇到了问题,我在网上找到了一个教程,说我可以通过arm-none-eabi-gcc包含参数来修复我的链接器错误-specs=nosys.specs,这对我有用,并且它能够编译我的代码。
我的芯片是 ATSAM7SE256 微控制器,据我了解,它是一个arm7tdmi使用armv4t和thumb指令集的处理器,我一直在使用以下代码编译我的代码:
arm-none-eabi-gcc -march=armv4t -mtune=arm7tdmi -specs=nosys.specs -o <exe_name>.elf <input_files>
Run Code Online (Sandbox Code Playgroud)
代码编译没有问题,但我不知道它是否做了我认为它正在做的事情。
规格文件的意义是什么?您还可以使用 来设置哪些其他值-specs=,以及在什么情况下您希望这样做?nosys.specs我想要的完全嵌入式 Arm 微控制器的价值是什么?
自从我开始用 C 编码以来,我就被教导说
for(int i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)
在 C++ 中工作,但在 C 中,您必须在 for 循环之外声明变量,如下所示:
int i;
for(i=0;i<10;++i)
...
Run Code Online (Sandbox Code Playgroud)
我特别记得这是一个问题,因为当我开始用 C 编码时,我已经习惯了 C++ for 循环。
但是今天我正在阅读 2010 年 12 月的 C11 标准草案,它将 for 循环定义为
“for(子句1;表达式2;表达式3)语句”
在它的语法描述中,它指出:
“如果第 1 条是声明,则它声明的任何标识符的范围是声明的其余部分和整个循环”。
然后我做了一个测试并意识到我的 gcc(Debian 8.3.0)在 -std=c99 和 -std=c11 模式下以 C++ 风格编译 for 循环,即使使用 -Wall 标志也没有警告。
这是一个 gcc 扩展,还是 C 支持这种类型的循环有一段时间了,我只是没有注意到?
这个问题专门针对嵌入式系统的 C 编译器,但我相信它可以应用于一般的编程。
在一行中编写多步数学表达式而不是将它们分解为等效的单个操作有什么好处,反之亦然?
例如是:
int convert(int in){
return (int)(((long)in * 727) / 12) + 9;
}
Run Code Online (Sandbox Code Playgroud)
比以下更好或更差:
int convert(int in){
long out = (long)in;
out *= 727;
out /= 12;
out += 9;
return (int)out;
}
Run Code Online (Sandbox Code Playgroud)
通常来说,一般来说?
我的直觉是,单行表达式可能更容易让编译器优化,但我不编写编译器,所以我不确定。