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特性
关键字:IAR AVR SRAM操作
引用地址:
IAR for AVR 学习笔记(5)--SRAM操作
推荐阅读最新更新时间:2024-03-16 15:05
AVR TWI读写范例程序(AT24C02)
本程序简单的示范了如何使用ATMEGA16的TWI 读写AT24C02 IIC EEPROM TWI协议 (即IIC协议,请认真参考IIC协议的内容,否则根本就不能掌握) 一主多从的应用,M16作主机 (M16做从机和多主多从的应用不多,请自行参考相关文档) 中断模式 (因为AVR的速度很高,而IIC的速度相对较低, 采用查询模式会长时间独占CPU,令CPU的利用率明显下降。 特别是IIC速度受环境影响只能低速通讯时,对系统的实时性产生严重的影响。 查询模式可以参考其它文档和软件模拟IIC的文档) AT24C02/04/08的操作特点 出于简化程序考虑,各种数据没有对外输出,学习时
[单片机]
基于AVR单片机的通用USB接口模块设计
1 引言 USB接口以其数据传输快、连接简单、易于扩展、支持热插拔等特点已成为外设与PC通信的主要方式之一。随着嵌入式系统的发展,嵌入式微处理器需增加通用的USB接口,以便实现与PC等USB主机系统的通信。针对这样的需求,这里采用PHILIPS公司的USB接口器件PDIUSBD12和Atmel公司的AVR系列单片机ATmega8设计一种通用的USB接口模块。该模块可方便为各种嵌入式微处理器增加USB接口,从而实现与USB主机系统的高速通信。 2 系统硬件设计 该系统模块的控制核心是AVR高速单片机ATmega8。AVR单片机是新一代基于哈佛结构的高速RISC微控制器,具有速度快、价格低、可靠性高,I
[单片机]
基于AVR单片机的轮胎模具内径测量系统设计
轮胎模具用于成型轮胎,其加工质量对轮胎的生产非常重要。为了生产出好的轮胎,必须对轮胎模具加工质量提出高的要求。传统的加工质量检测法主要是靠百分表,人为采集数据后分析得出加工质量报告。这种办法的局限性是需要操作者有一定的工作经验,而且取样过程人为控制,精度受到一定影响。近几年来,轮胎模具工业随着轮胎的大量需求而得到了快速发展,传统的检测方法不能满足市场需求。光栅尺是一种数字位移测量设备,测量范围可达几十米,测量精确在微米级;激光测距仪是一种非接触测量设备,可以对不规则表面的目标位移进行测量,但是测量距离较小。将大范同的光栅尺和非接触测量的激光测距仪结合起来就可以实现对不规则面的目标距离进行测量。将光栅尺读头与激光测距仪固定在机械
[单片机]
C51、PIC和AVR单片机性能比较
传统51:适合菜鸟入门,容易上手,价格一般(从性价比方面说)。IDE环境推荐keil。 缺点:解密容易,一般功能也有,但AD、eeprom等功能要靠扩展,增加硬件和软件负担。 PIC:pic的好处就是各个型号的兼容性强,学好了PIC16f877a,16系列的就OK了,别的型号要用的时候拿出2分钟看看数据手册就行了。12系列、16系列、18系列也是充分的向下兼容。功能全,型号多,适于选型分析,抗干扰能力强。 缺点:解密容易,单片机价格贵(从性价比方面说)。 IDE环境:推荐picc+mplab。 avr mega系列:价格便宜(从性价比方面说),硬件结构适合C语言编程,功能齐全,不容易解密。抗干扰能力强。型号之间兼容性一般。应
[单片机]
基于AVR单片机的舵机驱动电路详解
舵机( servo motor),又名伺服电机,主要是由外壳、电路板、马达、减速齿轮和电位器构成。舵机主要适用于那些需要角度不断变化并可以保持的控制系统,比如人形机器人的手臂和腿,车模和航模的方向控制。目前,市面上的成熟的舵机工业产品都来自日本、韩国和我国台湾地区。本文基于舵机工作的基本原理,选用Atmega8L单片机作为舵机电路板控制芯片,对舵机控制进行了一系列实验,并取得了很好的实验效果。 舵机工作原理 控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱
[单片机]
uPD6121 avr红外解码程序
#include iom16v.h #include macros.h #define uint unsigned int #define uchar unsigned char #define ulong unsigned long /*------------------------------显示-----------------------------------*/ #define LED _DATA PORTB const uchar tab ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x7
[单片机]
基于PLD与AVR总线通信接口VHDL设计与实现
1、引言 嵌入式系统在日常生活中的大量使用,人们也对其性能和速度提出了更高的要求。微控制器和可编程逻辑器件的结合,更能充分发挥嵌入式系统的优势。本文设计和实现的微控制器与可编程逻辑器件之间总线读写方式通信比传统的串行通信更可靠、速度更快。下面是一些相关术语的说明。
总线:任何一个微处理器都要与一定数量的部件和外围设备连接,但如果将各部件和每一种外围设备都分别用一组线路与CPU直接连接,那么连线将会错综复杂,甚至难以实现。为了简化硬件电路设计、简化系统结构,常用一组线路,配置以适当的接口电路,与各部件和外围设备连接,这组共用的连接线路被称为总线 。采用总线结构便于部件和设备的扩充,尤其制定了统一的总线标准则容易使不同设
[嵌入式]
AVR开发 Arduino方法(六) 内存子系统
Arduino UNO R3主处理器ATMega328P的芯片内部拥有3种存储器:数据存储器,程序存储器和电可擦写可编程存储器;它们各自有不同的用途。 1.数据存储器 数据存储器是一块2KB大小的静态随机存储器(SRAM)。其中一部分空间分配给了通用寄存器和I/O寄存器,其余部分一般用于存储全局变量,堆栈数据和支持动态内存分配。它的存取速度快,但掉电后数据会丢失。 2.程序存储器 程序存储器是一块32KB大小的闪存(Flash),其中0.5KB用于引导程序。它可以多次擦写,掉电后数据不会丢失,一般用于存储程序。 3.电可擦可编程只读存储器 电可擦写可编程只读存储器(EEPROM)是一块1KB大小的独立数据存储空间。它和程序存储器一
[单片机]