不然你要我怎么样

彪悍的代码不需要注释

Archive for the ‘Embedded’ Category

【转贴】GCC编译器选项及优化提示

leave a comment

大多数程序和库在编译时默认的优化级别是”2″(使用gcc选项:”-O2″)并且在Intel/AMD平台上默认按照i386处理器来编译。如果你只想让编译出来的程序运行在特定的平台上,就需要执行更高级的编译器优化选项,以产生只能运行于特定平台的代码。

一种方法是修改每个源码包中的Makefile文件,在其中寻找CFLAGS和CXXFLAGS变量(C和C++编译器的编译选项)并修改它的值。一些源码包比如binutils, gcc, glibc等等,在每个子文件夹中都有Makefile文件,这样修改起来就太累了!

另一种简易做法是设置CFLAGS和CXXFLAGS环境变量。大多数configure脚本会使用这两个环境变量代替Makefile文件中的值。但是少数configure脚本并不这样做,他们必须需要手动编辑才行。

为了设置CFLAGS和CXXFLAGS环境变量,你可以在bash中执行如下命令(也可以写进.bashrc以成为默认值):
export CFLAGS=”-O3 -march=” && CXXFLAGS=$CFLAGS
这是一个确保能够在几乎所有平台上都能正常工作的最小设置。

“-march”选项表示为特定的cpu类型编译二进制代码(不能在更低级别的cpu上运行),Intel通常是:pentium2, pentium3, pentium3m, pentium4, pentium4m, pentium-m, prescott, nocona
说明:pentium3m/pentium4m是笔记本用的移动P3/P4;pentium-m是迅驰I/II代笔记本的cpu;prescott是带SSE3的P4(以滚烫到可以煎鸡蛋而闻名);nocona则是最新的带有EMT64(64位)的P4(同样可以煎鸡蛋)
AMD通常是:k6, k6-2, k6-3, athlon, athlon-tbird, athlon-xp, athlon-mp, opteron, athlon64, athlon-fx
用AMD的一般都是DIYer,就不必解释了吧。

如果编译时没有抱怨”segmentation fault, core dumped”,那么你设定的”-O”优化参数一般就没什么问题。否则请降低优化级别(“-O3″ -> “-O2″ -> “-O1″ -> 取消)。
个人意见:服务器使用”-O2″就可以了,它是最安全的优化参数(集合);桌面可以使用”-O3″ ;不鼓励使用过多的自定义优化选项,其实他们之间没什么明显的速度差异(有时”-O3″反而更慢)。

编译器对硬件非常敏感,特别是在使用较高的优化级别的时候,一丁点的内存错误都可能导致致命的失败。所以在编译时请千万不要超频你的电脑(我编译关键程序时总是先降频然的)。

注意:选项的顺序很重要,如果有两个选项互相冲突,则以后一个为准。比如”-O3″将打开-finline-functions选项,但是可以用”-O3 -fno-inline-functions”既使用-O3的功能又关闭函数内嵌功能。

Read the rest of this entry »

转载请注明: 转载自不然你要我怎么样
本文链接地址: 【转贴】GCC编译器选项及优化提示

Written by xiangmocheng

十二月 17th, 2009 at 11:01 下午

Posted in Embedded

Tagged with

【转贴】Linux输出信息调试信息重定向

leave a comment

在运行linux的时候,所有的调试信息可以分为三个部分

1. bootloader输出信息

U-Boot 1.3.2 (Nov 19 2016 – 22:02:08)
DRAM: 64 MB
Flash: 512 kB
NAND: 64 MiB
In: serial
Out: serial
Err: serial
Hit any key to stop autoboot: 0
[yqliu2410 #] tftp
Found DM9000 ID:90000a46 at address 10000000 !
DM9000 work in 16 bus width
bd->bi_entaddr: 08:00:3e:26:0a:5b
[eth_init]MAC:8:0:3e:26:a:5b:
TFTP from server 192.168.1.152; our IP address is 192.168.1.155
Filename ‘uImage’.
Load address: 0×30008000
Loading: TT##################################done
Bytes transferred = 1617316 (18ada4 hex)
[up-tech2410 #] bootm
## Booting image at 30008000 …
Image Name: Linux-2.6.24.4
Created: 2016-11-19 14:05:29 UTC
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 1617252 Bytes = 1.5 MB
Load Address: 30008000
Entry Point: 30008040
Verifying Checksum … OK
Starting kernel …

Read the rest of this entry »

转载请注明: 转载自不然你要我怎么样
本文链接地址: 【转贴】Linux输出信息调试信息重定向

Written by xiangmocheng

十二月 1st, 2009 at 4:07 下午

Posted in Embedded

Tagged with , ,

【转贴】代码优化-之-优化除法

leave a comment

(说明:文章中的很多数据可能在新的CPU或不同的CPU或不同的系统环境下有不同的结果,可能不能面面俱到)

x86系列的CPU对于位运算、加、减等基本指令都能在1个CPU周期内完成(现在的CPU还能乱序执行,从而使指令的平均CPU周期更小);现在的CPU,做乘法也是很快的(1个CPU周期左右,或者是需要两\三个周期,但每个周期能启动一个新的乘指令),但作为基本指令的除法却超出很多人的预料,它是一条很慢的操作,整数和浮点的除法都慢;我测试的英特尔P5赛扬CPU浮点数的除法差不多是37个CPU周期,整数的除法是80个CPU周期,AMD2200+浮点数的除法差不多是21个CPU周期,整数的除法是40个CPU周期。(改变FPU运算精度对于除法无效) (SSE指令集的低路单精度数除法指令DIVPS 18个CPU周期,四路单精度数除法指令DIVSS 36个CPU周期) (x86求余运算和除法运算是用同一条CPU指令实现的; 据说,很多CPU的整数除法都是用数学协处理器的浮点除法器完成的;有一个推论就是,浮点除法和整数除法不能并行执行)

本文将给出一些除法的优化方法或替代算法 (警告:某些替代算法并不能保证完全等价!)

Read the rest of this entry »

转载请注明: 转载自不然你要我怎么样
本文链接地址: 【转贴】代码优化-之-优化除法

Written by xiangmocheng

九月 23rd, 2009 at 9:16 上午

Posted in Embedded