5.volatile ●在任何情况下,优化器会通过分析数据流来避免存储 器访问。如下例中*ctrl被优化成只读一次存储器单元, 即*ctrl在循环中值将不变(即使储器单元值变化了): unsigned int *ctrl; while (*ctrl !=0xFF) 若*ctrl=OxFF则退出循环 若程序依靠存储器访问,则必须使用volatile关键字来 指明这些访问。编译器将不会优化任何对volatile变 量的引用。为纠正上例中错误,可加volatile: volatile unsigned int *ctrl 18
5. volatile ⚫在任何情况下, 优化器会通过分析数据流来避免存储 器访问。如下例中*ctrl被优化成只读一次存储器单元, 即*ctrl在循环中值将不变(即使储器单元值变化了): unsigned int *ctrl; while (*ctrl !=0xFF) ;若*ctrl =0xFF则退出循环 18 ⚫若程序依靠存储器访问, 则必须使用volatile关键字来 指明这些访问。编译器将不会优化任何对volatile变 量的引用。为纠正上例中错误, 可加volatile: volatile unsigned int *ctrl;
6.2.3寄存器变量和参数 寄存器变量就是用register:关键字声明的变量。 ●依是否用优化器,C编译器对寄存器变量用不同的处理方式: ◆ 当使用优化器进行编译时,编译器忽略任何寄存器声明,通过一种 最有效使用寄存器的代价算法,把寄存器分配给变量和临时量。 ◆ 不用优化器时,编译器尽量将registerf修饰的变量分配到用来存放 临时表达式结果的寄存器中. ●编译器会尽量分配好所有声明的寄存器变量。 若编译器运行超出了合适的寄存器,它将通过移动寄存器内容到存 储器来释放寄存器。若定义了太多的寄存器变量,则会限制编译器 用来存放临时表达式结果的寄存器数目。这个限制会引起过量的从 寄存器到存储器的移动动作。 标量型(整型、浮点型和指针类型)对象都可声明为寄存 器变量,而像数组等其它类型对象不行。 19
6.2.3 寄存器变量和参数 ⚫寄存器变量就是用register关键字声明的变量。 ⚫依是否用优化器, C编译器对寄存器变量用不同的处理方式: ◆当使用优化器进行编译时, 编译器忽略任何寄存器声明, 通过一种 最有效使用寄存器的代价算法, 把寄存器分配给变量和临时量。 ◆不用优化器时, 编译器尽量将register修饰的变量分配到用来存放 临时表达式结果的寄存器中. 若编译器运行超出了合适的寄存器, 它将通过移动寄存器内容到存 储器来释放寄存器。若定义了太多的寄存器变量, 则会限制编译器 用来存放临时表达式结果的寄存器数目。这个限制会引起过量的从 寄存器到存储器的移动动作。 19 ⚫ 编译器会尽量分配好所有声明的寄存器变量。 ⚫标量型(整型、浮点型和指针类型)对象都可声明为寄存 器变量,而像数组等其它类型对象不行
6.2.4asm指令 ●asm指令可直接将C55x汇编语言指令嵌入到编译器 的汇编语言输出中,就像是对叫做asm的函数的调用。 o指令格式: asm ("assembler text") 例:asm(BCLR INTM"): asm(“nop);//插入一条汇编指令nop asm("STR:.string\"abc\”)://指令可含引号 ●插入的代码必须是合法的汇编语言指令: ◆像其它汇编语言指令一样,包含引用的代码行必须 用标号、空格、星号、分号开头。编译器不检查字 符串。如果有错,汇编器会将其检测出来。 20
6.2.4 asm指令 ⚫asm指令可直接将C55x汇编语言指令嵌入到编译器 的汇编语言输出中,就像是对叫做asm的函数的调用。 ⚫指令格式: asm (“assembler text”); 20 例: asm(“BCLR INTM"); asm (“nop”) ; //插入一条汇编指令nop asm(”STR: .string \”abc\” ”); //指令可含引号 ⚫ 插入的代码必须是合法的汇编语言指令: ◆像其它汇编语言指令一样,包含引用的代码行必须 用标号、空格、星号、分号开头。编译器不检查字 符串。如果有错,汇编器会将其检测出来
6.2.4asm指令 ●使用asm指令存在的问题: ◆它容易破坏C环境,因为C编译器在编译嵌入了 汇编语言的C程序时并不检查或分析嵌入的汇 编语句。 ◆当使用带asm指令的优化器时必须小心。虽然 优化器不会移除asm指令,但它可能重新改变 周围代码顺序并可能引起不可预知的结果。 21
⚫ 使用asm指令存在的问题: ◆它容易破坏C环境,因为C编译器在编译嵌入了 汇编语言的C程序时并不检查或分析嵌入的汇 编语句。 ◆当使用带asm指令的优化器时必须小心。虽然 优化器不会移除asm指令,但它可能重新改变 周围代码顺序并可能引起不可预知的结果。 21 6.2.4 asm指令
例:short x[10]参考.align2 6.2.5 Pragma指令 #pragma DATA_ALIGN(X,2); Pragma告诉编译器的预处理器如何处理函数(或符号)。 须在函数体外使用pragma,且出现在对函数、符号的 任何声明、定义或引用之前。否则,编译器会输出警告。 C55xC编译器支持如下pragma指令: CODE SECTION FUNC IS PURE C54X CALL FUNC IS SYSTEM C54X FAR CALL FUNC NEVER RETURNS DATA ALIGN FUNC NO GLOBAL ASG DATA SECTION FUNC NO IND ASG FUNC CANNOT INLINE MUST ITERATE FUNC EXT CALLED UNROLL 22
6.2.5 Pragma指令 ⚫Pragma告诉编译器的预处理器如何处理函数(或符号)。 ⚫须在函数体外使用pragma, 且出现在对函数、符号的 任何声明、定义或引用之前。否则, 编译器会输出警告。 ⚫C55x C编译器支持如下pragma指令: 22 CODE_SECTION C54X_CALL C54X_FAR_CALL DATA_ALIGN DATA_SECTION FUNC_CANNOT_INLINE FUNC_EXT_CALLED FUNC_IS_PURE FUNC_IS_SYSTEM FUNC_NEVER_RETURNS FUNC_NO_GLOBAL_ASG FUNC_NO_IND_ASG MUST_ITERATE UNROLL 例: short x[10]; #pragma DATA_ALIGN(x,2); 参考 .align 2