这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » GCC编译器中和ARM体系结构相关的选项解释

共4条 1/1 1 跳转至

GCC编译器中和ARM体系结构相关的选项解释

工程师
2008-04-25 14:48:27     打赏
 
和ARM体系结构相关的选项

 

这些是为ARM(Advanced RISC Machines)结构定义的“-m”开关:

-mapcs-frame

对所有函数都生成一个遵从ARM程序调用标准的堆栈帧,即使在正确执行代码无需严格这么做时。使用此开关时指定“-fomit-frame-pointer”将不产生叶函数的堆栈帧。缺省情况下是“-mno-apcs-frame”。

-mapcs
与“-mapcs-frame”相同。

-mapcs-26

产生使用26比特程序计数器的处理器代码,遵从APCS 26比特选项的函数调用标准。此开关替代了编译器早期版本中的“-m2”和“-m3”开关。

-mapcs-32

产生使用32比特程序计数器的处理器代码,遵从APCS 32比特选项的函数调用标准。此开关替代了编译器早期版本中的“-m6”。

-mapcs-stack-check

产生检查每个函数入口可用的堆栈空间大小(实际使用了一些堆栈空间)。如果可用空间不足,将按照所需堆栈空间大小调用函数 “__rt_stkovf_split_small”或者“__rt_stkovf_split_big”。运行时的系统需要提供这些函数。缺省情况下是 “-mno-apcs-stack-check”,因为这样产生的代码较小。

-mapcs-float

使用浮点寄存器传递浮点参数。这是APCS的一个变种。如果目标硬件存在浮点单元,或者代码将执行较多的浮点计算,推荐使用此开关。缺省情况下是“-mno-apcs-float”,因为使用开关“-mapcs-float”将导致只有整数的代码大小稍有增加。

-mapcs-reentrant

产生可重入的位置独立代码。等价于“-fpic”开关。缺省情况下是“-mno-apcs-reentrant”。

-mthumb-interwork

产生支持ARM和THUMB指令集间调用的代码。不使用此开关,在一个程序里就不能可靠地使用两个指令集。缺省情况下是“-mno-thumb-interwork”,因为指定了“-mthumb-interwork”产生的代码稍微大一些。

-mno-sched-prolog

禁止对函数prolog里的指令重新排序,或者把这些指令与函数体里的指令进行合并。这就意味着所有函数都以一组可识别的指令开始(实际上是一小组不同函数开端中的一个),如果函数处于可执行代码段中,可以使用此信息定位函数的起始位置。缺省情况下是“-msched-prolog”。

-mhard-float

产生包含浮点指令的输出。这是缺省情况。

-msoft-float

产生包含浮点库调用的输出。注意:所需的库不是所有ARM目标机都提供的。一般使用机器惯用的C编译器的配置,但在交叉编译时无法直接获得,必须进行一些整理为交叉编译提供合适的库函数。“-msoft-float”改变了输出文件的调用规范,所以只有程序的所有部分都使用此开关编译才起作用。特别是需要使用“-msoft-float”开关编译与GNU CC一起获得的“libgcc.a”库才行。

-mlittle-endian

产生运行在little-endian模式下的处理器代码。这是所有标准配置的缺省情况。

-mbig-endian

产生运行在big-endian模式下的处理器代码;缺省情况是产生运行在little-endian模式下的处理器代码。

-mwords-little-endian

此开关只用于为big endian处理器产生代码。产生字序为little-endian但字节顺序为big-endian的代码。也就是说,字节顺序为“32107654” 格式。注意:只有在要求与2.8之前版本编译器产生的big-endian ARM处理器代码兼容时才用到此开关。

-mshort-load-bytes

不试图通过从一个没有边界对齐的地址载入一个字的方式载入半个字(如“short”)。某些目标机的MMU被配置成用陷阱捕获没有边界对齐的载入;使用此开关产生的代码在这些环境下是安全的。

-mno-short-load-bytes

使用没有边界对齐的字载入半个字(如“short”)。此开关产生的代码效率较高,但MMU有时被配置成用陷阱捕获这些指令。

-mshort-load-words

与“-mno-short-load-bytes”相同。

-mno-short-load-words

与“-mshort-load-bytes”相同。

-mbsd

此开关只用于RISC iX。仿真原始的BSD模式编译器。这是没有指定“-ansi”时的缺省情况。

-mxopen

此开关只用于RISC iX。仿真原始的X/Open模式编译器。

-mno-symrename

此开关只用于RISC iX。不要在代码汇编后运行汇编程序随后的处理程序“symrename”。一般在准备与RISC iX C库连接时需要修改某些标准符号,此开关忽略这一过程。为交叉编译构建的编译器不运行汇编程序随后的处理程序。

-mcpu=<name>

此开关指定目标ARM处理器的名称。GCC使用这个名称来确定产生汇编代码时可用的指令类型。可用的名称是: arm2、arm250、arm3、arm6、arm60、arm600、arm610、arm620、arm7、arm7m、arm7d、 arm7dm、arm7di、arm7dmi、arm70、arm700、arm700i、arm710、arm710c、arm7100、 arm7500、arm7500fe、arm7tdmi、arm8、strongarm和strongarm110。

-march=<name>

此开关指定目标机ARM结构的名称。GCC使用这个名称来确定产生汇编代码时可用的指令类型。此开关可以同“-mcpu=”开关结合使用,也可以替代“-mcpu=”开关。可用的名称是:armv2、armv2a、armv3、armv3m、armv4和armv4t。

-mfpe=<number>

此开关指定了目标机可用的浮点仿真版本。可用值为2和3。

-mstructure-size-boundary=<n>

所有结构和联合的大小都处理成此开关设置比特数的倍数。可用值为8和32。不同的工具套件所使用的缺省值不同。对于COFF目标机使用的工具套件缺省值为8。指定较大的数字可以产生速度较快、效率较高的代码,但同时会增加程序的大小。若使用结构或联合交换信息,则使用某个值编译的代码可能不可以与使用另一个值编译的代码或库共同使用。鼓励程序员使用值32,因为工具套件未来版本可能会缺省使用值32。


Thumb开关

-mthumb-interwork

产生支持THUMB和ARM指令集间调用的代码。不使用此开关,在一个程序里就不能可靠地使用两个指令集。缺省情况下是“-mno-thumb-interwork”,因为使用“-mthumb-interwork”开关产生的代码稍微大一些。

-mtpcs-frame

对所有非叶函数都生成一个遵从Thumb程序调用标准的堆栈帧。(叶函数是不调用任何其它函数的函数)。缺省情况下是“-mno-apcs-frame”。

-mtpcs-leaf-frame

对所有叶函数都生成一个遵从Thumb程序调用标准的堆栈帧。(叶函数是不调用任何其它函数的函数)。缺省情况下是“-mno-apcs-leaf-frame”。

-mlittle-endian

产生运行在little-endian模式下的处理器代码。这是所有标准配置的缺省情况。

-mbig-endian

产生运行在big-endian模式下的处理器代码。

-mstructure-size-boundary=<n>

所有结构和联合的大小都处理成此开关设置比特数的倍数。可用值为8和32。不同的工具套件所使用的缺省值不同。对于COFF目标机使用的工具套件缺省值为8。指定较大的数字可以产生速度较快、效率较高的代码,但同时会增加程序的大小。这两个值可能不兼容。若使用结构或联合交换信息,则使用某个值编译的代码可能不可以与使用另一个值编译的代码或库共同使用。鼓励程序员使用值32,因为工具套件未来版本可能会缺省使用值32。

 

 

   原文地址 http://www.embeder.com/bbs/showthread.asp?threadid=967&goto=next



关键词: 编译器     中和     体系结构     相关     选项     解释     开关         

助工
2008-04-25 14:53:53     打赏
2楼
gcc确实强大,但是如果编译arm建议使用ADS,因为有资料和实验显示,gcc编译出来的代码比ADS执行效率低很多。

工程师
2008-04-25 15:34:51     打赏
3楼
我喜欢用KEIL!
呵呵

菜鸟
2008-05-01 15:33:59     打赏
4楼
一楼的,还ADS呢,ADS都被ARM公司放弃了,现在是KEIL的天下,当然IAR也不错。但是你如果想要用LINUX,乖乖的用GCC吧,虽然UCLINUX好像有人用KEIL+GCC编译器可以编译

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]