文档详情

MPLABC编译器介绍.doc

发布:2017-04-06约1.61万字共20页下载文档
文本预览下载声明
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
显示全部
相似文档