一、类型属性:

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文件内定义,否则编译出错。