IAR RAM的操作
扫描二维码
随时随地手机看文章
SARM空间是AVR单片机最重要的部分,所有的操作必须依赖该部分来完成。变量在SARM空间的存储模式有tiny,small,large 三种,也就是对应于__tiny, __near,__far三中存储属性。一旦选择为哪种存储模式,对应的数据默认属性也就确定了,但可以采用__tiny, __near,__far关键字来更改。
对于程序中的局部变量,编译器会自动处理的,我们也不可能加什么储存属性,但IAR提供了强大的外部变量定义。
IAR编译器内部使用了部分工作寄存器,留给用户的只有R4-R15供12个寄存器供用户使用,要使用工作寄存器必须在工程选项里打开锁定选项。
例:
定义两个变量使用工作寄存器R14,R15。
#include__regvar__no_initcharg@15;__regvar__no_initcharP@14;voidmain(void){g++;P++;}
在工程选项里c/c++ complier>code里打开要使用的寄存器R14-R15。
编译结果就如下,看看是不是直接使用了寄存器做为数据应用
//4voidmain(void)main:CFIBlockcfiBlock0UsingcfiCommon0CFIFunctionmain//5{g++;REQUIRE?Register_R14_is_global_regvarREQUIRE?Register_R15_is_global_regvarINCR15//6P++;}INCR14RET
注意:定义在寄存器里变量不能带有初始值。最好不要使用超过9个寄存器变量,不然可能引起潜在的危险,因为建立库的时候没有锁定任何寄存器。
定义变量的绝对地址.没有特性的变量是随机分配的,要给变量分配地址必须加以特性修饰注意在定义地址的时候千万不要和片内寄存器地址重合了。
定义没有存储特性的绝对地址变量必须加__no_init 或者const对象特性
__no_init char t @ 0x65;//定义在I/O地址以外
const char t @ 0x65;//定义只读变量的地址
例:
#include
__no_initcharu@0x65;voidmain(void){u++;}
对应汇编:
voidmain(void)main:{u++;} 0000000E6E5LDIR30,101 0000002E0F0LDIR31,0 00000048100LDR16,Z 00000069503INCR16 00000088300STZ,R16 000000A9508RET
带存储特性的关键字定义变量的绝对地址__io,__ext_io定义变量在i/o空间
#include__iocharu@0x65;voidmain(void){u++;}
对应汇编:
void main(void)
main:{u++;} 000000091000065LDSR16,101 00000049503INCR16 000000693000065STS101,R16 000000A9508RET