理解#define SREG (*(volatile unsigned char *)0x5F)
来源:互联网 发布:mac病毒 编辑:程序博客网 时间:2024/04/29 13:46
【转】理解#define SREG (*(volatile unsigned char *)0x5F)
这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们多多批砖~~~
嵌入式系统编程,要求程序员能够利用C语言访问固定的内存地址。既然是个地址,那么按照C语言的语法规则,这个表示地址的量应该是指针类型。所以,知道要访问的内存地址后,比如0x5F,
第一步是要把它强制转换为指针类型
(unsigned char *)0x5F,AVR的SREG是八位寄存器,所以0x5F强制转换为指向
unsigned char类型。
volatile(可变的)这个关键字说明这变量可能会被意想不到地改变,这样编译器就不会去假设这个变量的值了。这种“意想不到地改变”,不是由程序去改变,而是由硬件去改变——意想不到。
第二步,对指针变量解引用,就能操作指针所指向的地址的内容了
*(volatile unsigned char *)0x5F
第三步,小心地把#define宏中的参数用括号括起来,这是一个很好的习惯,所以#define SREG (*(volatile unsigned char *)0x5F)
类似的,如果使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义#define RAM_ADDR (*(volatile unsigned long *)0x0000555F)
然后就可以用C语言对这个内存地址进行读写操作了
读:tmp = RAM_ADDR;
写:RAM_ADDR = 0x55;
zhiwei 发表于 2005-4-30 18:59 AVR 单片机
定义未volatile是因为它的值可能会改变,大家都知道为什么改变了;
如果在一个循环操作中需要不停地判断一个内存数据,例如要等待SREG的I标志位置位,因为SREG也是映射在SRAM空间,为了加快速度,编译器可能会编译出这样的代码:把SREG读取到Register中,然后不停地判断Register相应位。而不会再读取SREG,这样当然是不行了,因为程序或其它事件(中断等)会改变SREG,结果很可能是一个死循环出不来了。如果定义成volatile型变量,编译的代码是这样的:每次要操作一个变量的时候都从内存中读取一次。
#define SREG (*(volatile unsigned char *)0x5F) 之后,可以进行如下基本操作,
unsigned char temp,*ptr;
temp=SREG;把SREG值保存到temp中
SREG=temp;把temp的值赋给SREG
ptr = & SREG; 不知对否,大家试一下。
- #define SREG (*(volatile unsigned CHAR *)0x5F)
- 理解#define SREG (*(volatile unsigned char *)0x5F)
- 如何理解 #define SREG (*(volatile unsigned char *)0x5F
- 理解#define SREG (*(volatile unsigned char *)0x5F
- 理解#define SREG (*(volatile unsigned char *)0x5F)
- 理解#define SREG (*(volatile unsigned char *)0x5F)
- 理解(*(volatile unsigned char *)0x5F[转]
- 理解(*(volatile unsigned char *)0x5F[转]
- 理解(*(volatile unsigned char *)0x5F[转]
- 理解(*(volatile unsigned char *)0x5F[转]
- 转_(*(volatile unsigned char *)0x5F
- #define rUTXH0 (*(volatile unsigned char *)0x1d00020)
- #define NFSTAT (*(volatile unsigned long *)0x4e000020) 与#define NFSTAT (*(volatile unsigned char *)
- #define XREG(addr) ((unsigned char volatile __xdata *) 0 )[addr]
- #define XBYTE ((unsigned char volatile xdata * 收藏
- #define XBYTE ((unsigned char volatile xdata *)
- 关于#define rGPACON(*(volatile unsigned long *)0x56000000)的理解
- #define GPBCON (*(volatile unsigned *)0x56000010) 的理解
- 如何能做一个好的用户权限管理呢
- return "enum" error
- 第一部分 基本语言元素
- 辅助说明书
- 杂谈
- 理解#define SREG (*(volatile unsigned char *)0x5F)
- 杂
- 实验三、2栈实现括号匹配问题
- IIS(World Wide Web Publishing Service) 无法响应的解决方法
- 学的很努力但 不知道对错
- 3G启动 淘金移动互联网成各方力量紧盯目标
- 无线互联网站圈地3G忙 两三年内或超越互联网(转载)
- 第2章 变量和基本类型
- 看好一个域名被法国人抢注了,有这方面特长的同学请留言 s