一、类型属性:
1、存储器属性:
__data16 int 16;
__regvar 定义一个变量在工作寄存器中。例:__regvar int variable_name @R4
2、一般类型属性:
(1)函数类型属性:
__interrupt void TA0_ISR (void) 定义中断函数
__monitor 函数执行过程中禁止中断
__task 不对特殊功能寄存器进行压栈保护
__nearfunc__farfunc 用于控制数据存放,这组关键字必须在函数声明和定义的时候指定
(2)数据类型属性:
const 常量
volatile 易失性变量,编译器遇到由volatile修饰的变量就不对其优化,从而每次都从内存中读取该变量的值。
二、对象属性:
1、用于变量:
__no_int 定义变量但不初始化
2、用于函数和变量:
location
__root 保证一个函数或一个变量不管使用与否都产生目标代码。
@ 用于变量的绝对地址定位
3、用于函数:
__intrinsic,__noreturn,__raw,__save_reg20,vector
__no_init 正常情况下,应用程序启动时,IAR运行时环境将全部全局和静态变量初始化为0。IAR C编译器支持声明不初始化的变量,使用__no_init类型限定符。声明__no_init的变量不需初始化。一些关键数据在系统复位(如看门狗复位或其他原因造成的复位)时的数值是不能改变的!在这种情况下可用__no_init限定。__root 限定的函数和变量在即是没有被任何函数引用的情况下,它依然存在于目标代码中而不会被优化掉。
__task 被该关键字限定的函数在被调用时不会做寄存器保护,即没有寄存器入栈出栈操作。通常用在RTOS的启动函数中。
在IAR中实验了一下,发现编译器还是将寄存器进行了压栈操作,不知为何?
__weak 在链接阶段,一个symbol可以有多个weak定义和最多一个non-weak定义。如果symbol需要被程序引用,存在non-weak,则non-weak被引用。如果不在在non-weak,则weak中的一个会被应用。
三、 asm,__asm 插入汇编代码
推荐用法
·变量定位
__no_init int a@0x200; (注意偶地址,因为这里的a是int型的) 变量a 就定义在RAM的0x200单元,注意被定位的变量不能初始化。
__no_init char b[10]@0x207; 数组b[10]定义在0x207到(0x207+9)的地址范围内
·常量定位(无须__no_init,并且可以初始化)
const unsigned int c[4]@0x1000={1,2,3,4};(这个数组在FLASH内)
·函数定位
void Fuction(void)@"My_seg" My_seg需要在XCL文件内定义,否则编译出错。