IAR之RAM的操作

本文介绍如何使用IAR编译器进行AVR单片机的RAM操作,包括使用工作寄存器、定义变量的绝对地址等技巧,并提供具体示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IAR之RAM的操作

转自:http://www.cnblogs.com/pang123hui/archive/2011/12/01/2309828.html


SARM空间是AVR单片机最重要的部分,所有的操作必须依赖该部分来完成。变量在SARM空间的存储模式有tiny,small,large 三种,也就是对应于__tiny, __near,__far三中存储属性。一旦选择为哪种存储模式,对应的数据默认属性也就确定了,但可以采用__tiny, __near,__far关键字来更改。


对于程序中的局部变量,编译器会自动处理的,我们也不可能加什么储存属性,但IAR提供了强大的外部变量定义。

 

IAR编译器内部使用了部分工作寄存器,留给用户的只有R4-R15供12个寄存器供用户使用,要使用工作寄存器必须在工程选项里打开锁定选项。
例:
定义两个变量使用工作寄存器R14,R15。

 

复制代码
#include<iom8.h>  
__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个寄存器变量,不然可能引起潜在的危险,因为建立库的时候没有锁定任何寄存器。

 

定义变量的绝对地址.没有特性的变量是随机分配的,要给变量分配地址必须加以特性修饰注意在定义地址的时候千万不要和片内寄存器地址重合了。

 

定义没有存储特性的绝对地址变量必须加__no_init 或者const对象特性
__no_init char t @ 0x65;//定义在I/O地址以外
const char t @ 0x65;//定义只读变量的地址
例:

 

#include<iom8.h>  
__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  
复制代码


带存储特性的关键字定义变量的绝对地址__io,__ext_io定义变量在i/o空间

 

#include<iom8.h>  
__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 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值