STM32学习笔记之地址 (*(volatile unsigned int *)(x))分析

       学习STM32有很多关于地址直接操作函数和指针这里分析一下,在程序中看到这样一句话:

                            if((*(vu32*)(0X20001000+4))&0xFF000000)==0x08000000)

其中:

*(vu32*)(0X20001000+4))== (*(__IO uint32_t*)(0X20001000+4))==(*(volatile unsigned int*)(0X20001000+4))

(*(vu32*)(0X20001000+4)) 通过内存寻址访问地址为(0x20001000 + 4)中的值

(0X20001000+4)只是一个常量;

(volatile unsigned int*)(0X20001000+4) 0x20001000 + 4这个常量强制转化成volatile unsigned int类型的指针;

(*(volatile unsigned int*)(0X20001000+4)) 相对于取0x20001000 + 4地址处的值。


为什么要将0x20001000 + 4这个常量强制转化成volatile unsigned int类型的指针呢?

       假设定义*P   取地址符 &P 得到P地址,这个地址是随机的系统分配空闲地址,我们不能直接给P赋地址值,因为那样是不合法的,我们只能给指针赋值为NULL。

但是现在必须让指针指向一个已知地址(0X20001000+4),必须转换类型,在地址前面加上指针转换的类型我们这里用的volatile unsigned int*,如果不转换,不成功。

在具体研究一下指向指针的指针看程序和输出:


现在我们来一行一行的看:

第一个printf语句 a,这个大家都知道啦,输出肯定是63啊,因为十进制99,十六进制就是63啊!

第二个printf语句 pa, pa是不是就代表0x0012ff40啊呵呵!一个变量的本质就是避免程序员和地址打交到啦!04的话就是0012ff44啦!对吧!

第三个printf语句 *pa, *pa就是第二句中的0012ff44取内容啊,当然就是63啦!

第四个printf语句 ppa, ppa呢!通过前面的笔记一看就知道它显示出的值是0012ff40啦!

第五个printf语句,*ppa, *ppa呢!唉!现在看来真是太简单了,显示出0012ff44

第六个printf语句,**ppa, **ppa呢就是0012ff44再取内容嘛!63啦!

通过这么一分析,有木有更清晰一点、绝对不会头晕吧!


假如使用一个32位处理器,要对一个32位的内存地址进行访问,可以这样定义:

    #define RAM_ADDR     (*(volatile unsigned long *)0x01234567)
   
 然后就可以用C语言对这个内存地址进行读写操作了。
   
 读:tmp = RAM_ADDR
   
 写:RAM_ADDR = 0x55


这里使用  volatile关键字的好处就是:

1.volatile是一个类型饰符typespecifier;

2.volatile关键字声明的变量,编译器对访问该变量的代码就不再进行优化;

3.volatile 关键字声明的变量,对变量的存取不能缓存到寄存器,每次使用时需要在内存中重新存取。


  • 9
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值