用" #include<absacc.h> “ 即可使用其中定义的宏来访问绝对地址
来源:互联网 发布:用superscan扫描端口 编辑:程序博客网 时间:2024/05/21 06:34
当51单片机通过8255和锁存器74LS273来扩展IO时,经常用到头文件absacc.h。
在程序中,用“#include<absacc.h>”即可使用其中定义的宏来访问绝对地址,包括:CBYTE、XBYTE、
PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
例如:
rval=CBYTE[0x0002];指向程序存贮器的0002h地址
rval=XWORD [0x0002];指向外RAM的0004h地址
================================================================================
KEIL中ABSACC.H定义如下:
#ifndef __ABSACC_H__
#define __ABSACC_H__
#define CBYTE ((unsigned char volatile code *) 0)
#define DBYTE ((unsigned char volatile data *) 0)
#define PBYTE ((unsigned char volatile pdata *) 0)
#define XBYTE ((unsigned char volatile xdata *) 0)
#define CWORD ((unsigned int volatile code *) 0)
#define DWORD ((unsigned int volatile data *) 0)
#define PWORD ((unsigned int volatile pdata *) 0)
#define XWORD ((unsigned int volatile xdata *) 0) /* 外部 RAM */
#ifdef __CX51__
#define FVAR(object, addr) (*((object volatile far *) (addr)))
#define FARRAY(object, base) ((object volatile far *) (base))
#define FCVAR(object, addr) (*((object const far *) (addr)))
#define FCARRAY(object, base) ((object const far *) (base))
#else
#define FVAR(object, addr) (*((object volatile far *) ((addr)+0x10000L)))
#define FCVAR(object, addr) (*((object const far *) ((addr)+0x810000L)))
#define FARRAY(object, base) ((object volatile far *) ((base)+0x10000L))
#define FCARRAY(object, base) ((object const far *) ((base)+0x810000L))
#endif
#endif
========================================================================
xdata是large存储类型,volatile是通过硬件来改变指针指向的内容。
#define XBYTE ((unsigned char volatile xdata *) 0)定义 XBYTE为指向
xdata地址空间unsigned char数据类型的指针,指针值为0这样,
可以直接用XBYTE[0xnnnn]或*(XBYTE+0xnnnn)访问外部RAM了。
/**********************************CBYTE********************************/
Q:
absacc.h里的宏
#define CBYTE ((unsigned char volatile code *) 0)
value = CBYTE[0x002];
这句该如何理解?
A1:
结果是将程序空间(code)地址为0x002单元的内容放到变量value中。
A2:
替换一下考虑
value = ((unsigned char volatile *) 0)[0x02];
替换一下考虑
unsigned char volatile *CBYTE = 0/*NULL*/;
这里CBYTE[0x02]= 1和*(CBYTE+0x02) = 1等价
#define CBYTE ((unsigned char volatile code *) 0)
是把CBYTE是指针,即code地址0
在这里,数组和指针是可以互用的。CBYTE[0x02]也就是*(CBYTE+0x02),都
是指的是地址0x02里的内容,并是unsignedchar 类型的。
#defineCBYTE ((unsigned char volatile code *) 0)
考虑下这个define定义的内容
1、把CBYTE定义成一个0(0);
2、这个0是个地址(*号);
3、这个地址是代码段的地址(code);
4、并是unsignedchar类型的地址(unsigned char);
5、并这个地址的内容是易逝性的(volatile);
本质上是定义了一个地址(CBYTE)。指针就是地址。地址是内存的序号。
指针通过指向内存的序号访问内存。替换点是都是地址。
内部的括号用来强制类型转换用的,外部的的括号用来防止宏定义展开时错误的用法。
/*************************************************************************************/
再如:
#define COM8255 XBYTE[0X060FF] //后面若出现COM8255,
则单片机端口P0和P2联合输出0X060FF绝对物理地址(地址指向82C55指令寄存器)
#define PA8255 XBYTE[0X000FF] //后面若出现PA8255,
则单片机端口P0和P2联合输出0X000FF绝对物理地址(地址指向82C55的A组端口寄存器)
#define PB8255 XBYTE[0X020FF] //后面若出现PB8255,
则单片机端口P0和P2联合输出0X020FF绝对物理地址(地址指向82C55的B组端口寄存器)
#define PC8255 XBYTE[0X040FF] //后面若出现PC8255,
则单片机端口P0和P2联合输出0X040FF绝对物理地址(地址指向82C55的C组端口寄存器)
- 用" #include<absacc.h> “ 即可使用其中定义的宏来访问绝对地址
- C如何使用固定地址来访问函数
- C51中的ABSACC.H
- 使用OTL来访问数据库
- 使用TortoiseGit来访问GitHub
- 使用SwitchySharp来访问google
- 使用Hive来访问HBase
- 使用configobj 来访问配置文件
- 使用属性——用属性来访问类的私有成员
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用HttpContext来访问Page的Request,Response等对象
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 如何使用java代码来访问managed-bean 的属性?
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 使用 /proc 文件系统来访问 Linux 内核的内容
- 32位window7的CUDA编译环境配置
- cin cout
- MyEclipse Resource is out of sync with the file system
- 矩阵链乘法
- 让你的应用支持新iPad的Retina显示屏
- 用" #include<absacc.h> “ 即可使用其中定义的宏来访问绝对地址
- 构建自动化mochiweb-nitrogen
- 中国部队总动员截图!
- C++学习的好网站
- WinObject回放时无法识别
- (最新)HttpClient4模拟登录腾讯微博
- Linux下移植OpenCV + Qt 到ARM(Tiny6410)总结
- 缓存淘汰算法系列之2——LFU类
- 抽象编程语言(APL)是什么?