您的位置 首页 模拟

了解(*(volatile unsigned char *)0x5F

理解#defineSREG(*(volatileunsignedchar*)0x5F)这样的定义,总是感觉很奇怪,不知道为什么,今天终于有了一点点心得,请大虾们…

了解#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;

界说未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; 不知对否,我们试一下。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/moni/264267.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部