guew 发表于 2013-4-19 23:13:09

关于地址映射

在一些单片机的头文件里,有是用 sfrb来定义寄存器地址,像是sfrb DDRG=0x13,也有用宏定义#define PRR (*(unsigned char *) 0x64) 来做的,高级一些的甚至有自己的CMD文件,我这样的菜鸟看的糊里糊涂。

阿莫论坛卧虎藏龙,大家能说说上面这几种方法背后的原理么?

machao 发表于 2013-4-20 14:48:34

可以简单理解如下
sfrb DDRG=0x13 定义是寄存器(字节)变量,#define PRR (*(unsigned char *) 0x64)定义的是普通字节变量。
区别在于:
1、告诉编译器,对于DDRG采用I/O操作指令,对于PRR使用对RAM操作的指令。前者专用I/O操作指令,指令代码段短,执行速度快。
2、只能对于在硬件上是寄存器的,才能使用SFRB定义,这样的变量还可以进行位操作(当然该寄存器支持位操作的)。

实际例子:AVR的I/O寄存器,定义为sfrb(类似),实现DDRG = 0X5A;使用I/O赋值指令,长度16位,单周期;同时支持 DDRG.1 = 1的位操作(CVAVR系统)
而定义成PRR变量,PRR = 0X5A,赋值采用对RAM的操作指令,长度32位,2个周期,不支持位操作。

成为单片机高手,不懂硬件是不行的。
页: [1]
查看完整版本: 关于地址映射