打印
[AVR单片机]

对C代码优化时,对AVR的寄存器分布有疑问。

[复制链接]
2467|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoxiong|  楼主 | 2007-4-4 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近时开始对自己的项目进行减肥。

在看文档“AVR035.pdf”时,发现
“From ATmega169, ATmega48/88/168 and ATtiny2313, all AVR devices includes a number of General Purpose I/O registers, both below and above the 0x1F address limit. These registers are used as any other free I/O register, and could potentially increase performance and reduce code size for your design.”

我再找了其它文档看了一下。

我的理解是:0x00~0x5F属于通用I/O寄存器区;通用I/O寄存器可用来作全局变量的位操作,且效果非常好,尤其是低于0x20的I/O寄存器;

但是,低于0x20的只有一个GPIOR0(0x1E)可用,其他空间跟系统紧密相关,几乎不能使用,高于0X1F的且可用的也寥寥无几,这样是不是太“穷”了点?

各位高手,我的理解是否正确?

相关帖子

沙发
zhiwei| | 2007-4-4 20:15 | 只看该作者

是这样的

用它做全局变量能极大地提高速度和效率,特别是用作位域。如果觉得不够可以申请寄存器。EWAVR和ICCAVR都允许全局寄存器变量的。

使用特权

评论回复
板凳
xiaoxiong|  楼主 | 2007-4-4 20:38 | 只看该作者

如果觉得不够可以申请寄存器

1、“如果觉得不够可以申请寄存器”
这是什么意思?

2、“EWAVR和ICCAVR都允许全局寄存器变量的”
这又是什么意思?我用的是IAR哦!

使用特权

评论回复
地板
zhiwei| | 2007-4-5 12:44 | 只看该作者

这样的

ICC的选项卡里面有Do not use R20..R23,选择之后这几个寄存器就不归编译器管了,你可以用#pragma global_registers var1:20 var2:21... 来定义变量
然后用extern unsigned char var1,var2,...来通知编译器。这些变量需要你自己初始化。变量用法同一般的全局变量一样的。
iar类似,不过最多允许12个全局寄存器变量,你可以参考文档,里面关键字好像是_lockregister 。
用全局寄存器变量可以大大提高访问和运算效率。但是如果你的程序本省比较复杂,那么就要少用寄存器变量,因为这可能会造成程序编译不能通过(缺少寄存器)。
个人感觉avr的寄存器比较多,而内存访问占用的较大的时间和空间,所以可以适当地设置一些非常常用的变量到全局寄存器变量以提高速度,节省空间。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

8

主题

20

帖子

1

粉丝