5.volatile ●在任何情况下,优化器会通过分析数据流来避免存储 器访问。如下例中*ctrl被优化成只读一次存储器单元, 即*ctrl在循环中值将不变(即使储器单元值变化了): unsigned int *ctrl; while (*ctrl !=0xFF) ,若*ctrl=OxFF则退出循环 若程序依靠存储器访问,则必须使用volatile关键字来 指明这些访问。编译器将不会优化任何对volatile变 量的引用。为纠正上例中错误,可加volatile: volatile unsigned int *ctrl; 19
5. volatile ⚫在任何情况下, 优化器会通过分析数据流来避免存储 器访问。如下例中*ctrl被优化成只读一次存储器单元, 即*ctrl在循环中值将不变(即使储器单元值变化了): unsigned int *ctrl; while (*ctrl !=0xFF) ;若*ctrl =0xFF则退出循环 19 ⚫若程序依靠存储器访问, 则必须使用volatile关键字来 指明这些访问。编译器将不会优化任何对volatile变 量的引用。为纠正上例中错误, 可加volatile: volatile unsigned int *ctrl;
6.2.3寄存器变量和参数 寄存器变量就是用register:关键字声明的变量。 ●依是否用优化器,C编译器对寄存器变量用不同的处理方式: ◆ 当使用优化器进行编译时,编译器忽略任何寄存器声明,通过一种 最有效使用寄存器的代价算法,把寄存器分配给变量和临时量。 ◆ 不用优化器时,编译器尽量将registerf修饰的变量分配到用来存放 临时表达式结果的寄存器中. ●编译器会尽量分配好所有声明的寄存器变量。 若编译器运行超出了合适的寄存器,它将通过移动寄存器内容到存 储器来释放寄存器。若定义了太多的寄存器变量,则会限制编译器 用来存放临时表达式结果的寄存器数目。这个限制会引起过量的从 寄存器到存储器的移动动作。 标量型(整型、浮点型和指针类型)对象都可声明为寄存 器变量,而像数组等其它类型对象不行。 20
6.2.3 寄存器变量和参数 ⚫寄存器变量就是用register关键字声明的变量。 ⚫依是否用优化器, C编译器对寄存器变量用不同的处理方式: ◆当使用优化器进行编译时, 编译器忽略任何寄存器声明, 通过一种 最有效使用寄存器的代价算法, 把寄存器分配给变量和临时量。 ◆不用优化器时, 编译器尽量将register修饰的变量分配到用来存放 临时表达式结果的寄存器中. 若编译器运行超出了合适的寄存器, 它将通过移动寄存器内容到存 储器来释放寄存器。若定义了太多的寄存器变量, 则会限制编译器 用来存放临时表达式结果的寄存器数目。这个限制会引起过量的从 寄存器到存储器的移动动作。 20 ⚫ 编译器会尽量分配好所有声明的寄存器变量。 ⚫标量型(整型、浮点型和指针类型)对象都可声明为寄存 器变量,而像数组等其它类型对象不行
6.2C55xC/C++语言编程基础 ■ 6.2.1数据类型 ■6.2.2关键字 ■6.2.3寄存器变量和参数 ■6.2.4asm指令 ■6.2.5 Pragma指令 ■6.2.6标准ANSIC语言模式的改变(-pk,-pr和-ps选项) 6.2.7存储器模式 ■6.2.8存储器分配 ■6.2.9中断处理 ■6.2.10运行时间支持算法及转换程序 ■6.2.11系统初始化 21
◼ 6.2.1 数据类型 ◼ 6.2.2 关键字 ◼ 6.2.3 寄存器变量和参数 ◼ 6.2.4 asm指令 ◼ 6.2.5 Pragma指令 ◼ 6.2.6标准ANSIC语言模式的改变(-pk,-pr和-ps选项) ◼ 6.2.7 存储器模式 ◼ 6.2.8 存储器分配 ◼ 6.2.9 中断处理 ◼ 6.2.10 运行时间支持算法及转换程序 ◼ 6.2.11 系统初始化 6.2 C55x C/C++语言编程基础 21
6.2.4asm指令 ●C55x编译器可直接将C55x汇编语言指令嵌入到编译器的 汇编语言输出中,就像是对叫做asm函数(即asm指令)的 调用,这样可实现C不能提供的对硬件的访问。 指令格式: asm ("assembler text"); 例:as"BCLR INTM今;//引号内若无标号必须以空格开头 asm(“nop),//插入一条汇编指令nop asm("STR:.string"abc”");//指令可含引号 ●插入的代码必须是合法的汇编语言指令: ◆像其它汇编语言指令一样,包含引用的代码行必须 用标号、空格、星号、分号开头。编译器不检查字 符串。如果有错,汇编器会将其检测出来。 12 asm("nop");/插入- 13 asm("BCLR INTM"); D
6.2.4 asm指令 ⚫C55x编译器可直接将C55x汇编语言指令嵌入到编译器的 汇编语言输出中,就像是对叫做asm函数(即asm指令)的 调用, 这样可实现C不能提供的对硬件的访问。 ⚫指令格式: asm (“assembler text”); 22 例:asm(“ BCLR INTM”);//引号内若无标号必须以空格开头 asm (“ nop”) ; //插入一条汇编指令nop asm(”STR: .string \”abc\” ”); //指令可含引号 ⚫ 插入的代码必须是合法的汇编语言指令: ◆像其它汇编语言指令一样,包含引用的代码行必须 用标号、空格、星号、分号开头。编译器不检查字 符串。如果有错,汇编器会将其检测出来
6.2.4asm指令 。使用asm指令存在的问题: ◆它容易破坏C环境,因为C编译器在编译嵌入了 汇编语言的C程序时并不检查或分析嵌入的汇 编语句。 ◆当使用带asm指令的优化器时必须小心。虽然 优化器不会移除asm指令,但它可能重新改变 周围代码顺序并可能引起不可预知的结果。 23
⚫ 使用asm指令存在的问题: ◆它容易破坏C环境,因为C编译器在编译嵌入了 汇编语言的C程序时并不检查或分析嵌入的汇 编语句。 ◆当使用带asm指令的优化器时必须小心。虽然 优化器不会移除asm指令,但它可能重新改变 周围代码顺序并可能引起不可预知的结果。 23 6.2.4 asm指令