MPLABC编译器介绍.doc
文本预览下载声明
MPLAB C32编译器介绍
第1 章 语言相关信息
1.1 简介
本章讨论MPLAB C32 C 编译器命令行的使用、属性、pragma 伪指令和数据表示。
1.2 数据存储
1.2.1 MPLAB C32 C 编译器以小尾数格式存储多字节值。即,最低有效字节存储在最低地址。
1.2.2 整型表示
MPLAB C32 C 编译器中的整型值以2 的补码形式表示,长度为8 到64 位。这些值可在通过limits.h 编译后的代码中使用。
1.2.3 有符号和无符号字符类型
默认情况下,不带修饰符的char 类型的值是有符号值。根据C 标准,这是由实现定义的操作,有一些环境将不带修饰符的char 值定义为无符号值。
1.2.4 浮点型表示
MPLAB C32 C 编译器使用IEEE-754 浮点格式。float.h 中提供了对于翻译单元的实现限制的详细信息。
1.2.5 指针
MPLAB C32 C 编译器中的指针长度均为32 位。
1.2.6 limits.h
limits.h 头文件定义了可以使用整型表示的值的范围。
1.3 预定义宏
1.3.1 MPLAB C32 C 编译器宏
MPLAB C32 C 编译器定义了许多宏,大多数都带有前缀“_MCHP_”,它们定义了各种目标特定选项、目标处理器和主机环境其他方面的特性。
1.3.2 SDE 兼容性宏
MIPS SDE(软件开发环境)定义了许多宏,大多数带有前缀“_MIPS_”,它们定义了各种目标特定选项的特性,其中一些由命令行选项决定(例如, -mint64)。在适用时,这些宏将由MPLAB C32 C编译器定义,以方便将应用程序和中间件从SDE移植到MPLAB C32 C编译器。
1.4 属性和PRAGMA 伪指令
1.4.1 函数属性
always_inline
如果函数声明为inline,则始终内联函数,即使是未指定任何优化级别。
longcall
始终通过以下方式调用函数:首先将其地址装入一个寄存器,然后使用该寄存器的内容进行调用。这使得可以调用位于直接调用指令28 位寻址范围之外的函数。
far
在功能上等价于longcall。
near
始终使用绝对调用指令来调用函数,即使是指定了-mlong-calls 命令行选项。
mips16
以MIPS16 指令集为函数生成代码。
nomips16
始终以MIPS32 指令集为函数生成代码,即使是编译带有-mips16 命令行选项的翻译单元。
interrupt
为用作中断处理程序的函数生成序言(prologue)和尾声(epilogue)代码。
vector
在所指示的异常向量(其目标为一个函数)处生成一条转移指令。
at_vector
将函数体放到所指示的异常向量地址处。
naked
不为函数生成序言或尾声代码。
section (“name”)
将函数放入由“name”指定的段。
例如,
void __attribute__ ((section (“.wilma”))) baz () {return;}
函数baz 将被放入.wilma 段。
-ffunction-sections 命令行选项对使用section 属性定义的函数不起作用。
unique_section
将函数放入唯一指定的段中,就如同指定了-ffunction-sections。如果函数还具有section 属性,那么将使用相应的段名作为前缀来生成唯一的段名。
例如,
void __attribute__ ((section (“.fred”), unique_section) foo (void) {return;}
函数foo 将被放入.fred.foo 段。
noreturn
向编译器指示,函数将永不返回。在一些情况下,这将使编译器可以在调用函数中生成效率更高的代码,因为在执行优化时可以无需考虑函数确实会返回时的行为。声明为noreturn 的函数的返回类型应始终为void。
noinline
始终不考虑将函数内联。
pure
如果某个函数除了对其返回值之外没有任何其他副面影响,并且返回值仅依赖于参数和/ 或(非易变)全局变量,那么对于该函数的调用,编译器可以执行更积极的优化。此类函数可以使用pure 属性指示。
const
如果一个pure 函数仅根据其参数决定其返回值(即,不检查任何全局变量),那么可以将其声明为const,以允许更积极的优化。请注意,对指针参数进行解引用的函数不属于const,因为指针解引用使用了不属于参数的值,虽然指针本身是一个参数。
format (type, format_index, first_to_check)
for
显示全部