SARM数据类型的详细操作办法
SARM空间是AVR单片机最重要的部分,一切的操作有必要依靠该部分来完结。变量在SARM空间的存储形式有tiny ,small large 三种,也便是对应于__tiny, __near __far三中存储特点。一旦挑选为哪种存储形式,对应的数据默许特点也就确认了,但可以选用__tiny, __near __far关键字来更改。
关于程序中的局部变量,编译器会主动处理的,咱们也不或许加什么贮存特点,但IAR供给了强壮的外部变量界说。
5.1.界说变量在作业寄存器
IAR编译器内部运用了部分作业寄存器,留给用户的只要R4-R15供12个寄存器供用户运用,要运用作业寄存器有必要在工程选项里翻开确定选项。
例:
界说两个变量运用作业寄存器R14,R15。
#i nclude
__regvar __no_init char g @ 15;
__regvar __no_init char P @ 14;
void main(void)
{
g++;
P++;
}
在工程选项里c/c++ complier>code里翻开要运用的寄存器R14-R15。
编译成果就如下,看看是不是直接运用了寄存器做为数据运用
// 4 void main(void)
main:
CFI Block cfiBlock0 Using cfiCommon0
CFI Function main
// 5 { g++;
REQUIRE ?Register_R14_is_global_regvar
REQUIRE ?Register_R15_is_global_regvar
INC R15
// 6 P++; }
INC R14
RET
留意:界说在寄存器里变量不能带有初始值。最好不要运用超越9个寄存器变量,否则或许引起潜在的风险,由于树立库的时分没有确定任何寄存器。
5.2.界说变量的肯定地址.没有特性的变量是随机分配的,要给变量分配地址有必要加以特性润饰留意在界说地址的时分千万不要和片内寄存器地址重合了。
5.2.1界说没有存储特性的肯定地址变量有必要加__no_init 或许const目标特性
__no_init char t @ 0x65;//界说在I/O地址以外
const char t @ 0x65;//界说只读变量的地址
例:
#i nclude
__no_init char u @ 0x65 ;
void main(void)
{u++;}
对应汇编:
void main(void)
\ main:
{u++;}
\ 00000000 E6E5 LDI R30, 101
\ 00000002 E0F0 LDI R31, 0
\ 00000004 8100 LD R16, Z
\ 00000006 9503 INC R16
\ 00000008 8300 ST Z, R16
\ 0000000A 9508 RET
5.2.2带存储特性的关键字界说变量的肯定地址__io,__ext_io界说变量在i/o空间
#i nclude
__io char u @ 0x65 ;
void main(void)
{u++;}
对应汇编:
void main(void)
\ main:
{u++;}
\ 00000000 91000065 LDS R16, 101
\ 00000004 9503 INC R16
\ 00000006 93000065 STS 101, R16
\ 0000000A 9508 RET
从5.2.1和5.2.2比照,发现用5.2.2办法界说代码小多了。
5.3.关键字volatile确保从最原始的方位读取变量。在IAR编译器里,除了__no_init和__root界说的变量外,其他的类型的变量都包括有volatile和__no_init特性