OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
楼主: yaocp86

(*(volatile unsigned long *)详解

  [复制链接]

0

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2013-3-16
在线时间
7 小时
发表于 2013-5-8 21:39:04 | 显示全部楼层
正点原子逻辑分析仪DL16劲爆上市
回复 支持 反对

使用道具 举报

3

主题

34

帖子

0

精华

初级会员

Rank: 2

积分
139
金钱
139
注册时间
2013-1-12
在线时间
27 小时
发表于 2013-5-26 19:40:21 | 显示全部楼层
回复 支持 反对

使用道具 举报

7

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-3-3
在线时间
12 小时
发表于 2013-5-29 12:19:23 | 显示全部楼层
指针并不难,因为老师教的时候先告诉我们指针很难,所以我们就认为它很难来学的,其实指针完全可以认为是一种新的数据类型,变量之所以有了类型概念,只是方便我们对真实的无力内存进行很好的应用于管理,只是一种抽象而已
回复 支持 反对

使用道具 举报

15

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
366
金钱
366
注册时间
2012-5-23
在线时间
123 小时
发表于 2013-7-23 09:18:02 | 显示全部楼层
学习了   收藏了
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
发表于 2013-7-23 13:13:15 | 显示全部楼层
强制类型,特别是强制类型指针,确实是C语言比较精髓的地方。早期写程序的时候把一个16位数用串口接收过来,总是要先发高8位再发低8位:
u16 rdata;
rdata = UDR;
rdata = (rdata<<8)+UDR;
现在却总是先发低8位再发高8位:
u16 rdata;
u8 buf[2];
buf[0]=UDR;
buf[1]=UDR;
rdata=*(u16*)buf;
不知哪种代码效率高些,反正现在都是用后者方法,习惯了。。。
回复 支持 反对

使用道具 举报

20

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2012-12-22
在线时间
24 小时
发表于 2013-7-23 13:52:16 | 显示全部楼层
回复【14楼】baiydcwy:

回复【楼主位】yaocp86:
---------------------------------
请的比较深刻哈,呵呵,学习了,不知道能不能讲一下const这个修饰符呢?我好像理解的不是很清楚哦,平时也没用过,能不能也像上面一样,把const也讲一下,清楚、深刻一点,呵呵。。。。。。

---------------------------------
const这个修饰符比volatile要好理解一些,意思就是:不变的静态的,被它修饰的变量叫做静态变量,不过要记住他还是变量而不是常量,只是不会发生变化而已。其实我们应该关注的是编译器到底会把const的变量存储在哪里,对于不同的单片机不同的编译器也是不一样的。比如51,const就是存放在RAM里面,code才是存放在ROM或flash里。但是stm32的编译器则是认为const应该存放在flash里面。不同的编译器也可能不一样,至少IAR for ARM是这样的。
还有就是const指针的用法要特别注意,u8 const*和const u8*是不同的,具体你可以上网搜一下,我也不太记得了
回复 支持 反对

使用道具 举报

7

主题

165

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
213
金钱
213
注册时间
2013-6-18
在线时间
0 小时
发表于 2013-7-23 13:59:33 | 显示全部楼层
学习了。。。
只求每天都能把小事做好。
回复 支持 反对

使用道具 举报

4

主题

36

帖子

0

精华

初级会员

Rank: 2

积分
73
金钱
73
注册时间
2013-7-22
在线时间
0 小时
发表于 2013-7-25 13:30:24 | 显示全部楼层
学习!
回复 支持 反对

使用道具 举报

35

主题

152

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
312
金钱
312
注册时间
2013-6-26
在线时间
0 小时
发表于 2013-7-25 15:33:29 | 显示全部楼层
volatile 我之前甚至没有见过。类型转换加define实现一种异名式的便利,在C++中倒是很常见
回复 支持 反对

使用道具 举报

11

主题

78

帖子

0

精华

初级会员

Rank: 2

积分
142
金钱
142
注册时间
2012-8-21
在线时间
0 小时
发表于 2013-9-11 21:40:28 | 显示全部楼层
太强了,貌似看懂了,还在理解提升阶段。
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-8-20
在线时间
6 小时
发表于 2013-9-23 12:20:28 | 显示全部楼层
那么你的问题就可解答了,(*(volatile unsigned char *)0x20)可看作是一个普通变量,这个变量有固定的地址,指向0x20。而0x20只是个常量,不是指针更不是变量.
   我不理解的的是既然0x20是个地址,为什么最后一句说,“不是指针”,指针不就是地址吗??????????
回复 支持 反对

使用道具 举报

3

主题

56

帖子

0

精华

初级会员

Rank: 2

积分
111
金钱
111
注册时间
2013-8-20
在线时间
6 小时
发表于 2013-9-23 12:21:54 | 显示全部楼层
指针和地址是不是同一个感念呢???
回复 支持 反对

使用道具 举报

3

主题

46

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2013-3-28
在线时间
38 小时
发表于 2013-10-31 11:20:35 | 显示全部楼层
学习了~~~~~~~~·
回复 支持 反对

使用道具 举报

2

主题

27

帖子

2

精华

中级会员

Rank: 3Rank: 3

积分
371
金钱
371
注册时间
2013-11-19
在线时间
2 小时
发表于 2013-11-20 11:51:08 | 显示全部楼层
学习了
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2014-4-17
在线时间
0 小时
发表于 2014-4-17 18:49:42 | 显示全部楼层
标记下。。。
回复 支持 反对

使用道具 举报

4

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-10-17
在线时间
9 小时
发表于 2014-4-23 11:21:51 | 显示全部楼层
标记
回复 支持 反对

使用道具 举报

2

主题

20

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2014-2-26
在线时间
0 小时
发表于 2014-12-24 17:50:42 | 显示全部楼层
学习了,这写的真的很详细
回复 支持 反对

使用道具 举报

5

主题

26

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
307
金钱
307
注册时间
2014-4-2
在线时间
85 小时
发表于 2015-1-6 09:43:03 | 显示全部楼层
这个真不错,指针又明白的深点了!
回复 支持 反对

使用道具 举报

1

主题

108

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
352
金钱
352
注册时间
2012-11-8
在线时间
44 小时
发表于 2015-1-6 13:15:46 | 显示全部楼层
c语言基础,顶一个,果断学习了~
回复 支持 反对

使用道具 举报

72

主题

2711

帖子

2

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3505
金钱
3505
注册时间
2014-8-4
在线时间
696 小时
发表于 2015-1-9 13:55:28 | 显示全部楼层
回复【66楼】498650771:
---------------------------------
你是怎么躲过回帖六字禁制的?
以我资质之鲁钝,当尽平心静气、循序渐进、稳扎稳打之力。
回复 支持 反对

使用道具 举报

4

主题

84

帖子

0

精华

初级会员

Rank: 2

积分
155
金钱
155
注册时间
2013-10-17
在线时间
9 小时
发表于 2015-1-9 21:45:09 | 显示全部楼层
回复【70楼】龙之谷:
---------------------------------
呵呵,这个我也不知道哦
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
发表于 2015-1-10 21:13:34 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
原子哥 你能帮我分析下关于继电器的那篇文章吗?
回复 支持 反对

使用道具 举报

14

主题

338

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
464
金钱
464
注册时间
2013-6-15
在线时间
15 小时
发表于 2015-1-10 21:32:03 | 显示全部楼层
回复【61楼】京江自动化:
---------------------------------
指针是用来指向地址的
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
发表于 2015-1-10 21:33:22 | 显示全部楼层
写的非常好 我记得如果使用了CORTEX的位绑定技术的话 会涉及到这个方面的内容,如下:
#define MEM_ADDR(addr)   *((volatile unsigned long *)(addr)) //首先将addr强制转换成为一个无符号长整形的指针[地址],*指针=*地址,就是该地址对应的变量的数值。
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2014-12-10
在线时间
0 小时
发表于 2015-1-10 21:35:25 | 显示全部楼层
回复【73楼】as564335sa:
---------------------------------
指针就是地址,地址就是指针,而指针变量是用来存放指针的,也就是指针变量是用来存放地址的,貌似说起来有点怪。应该说是指针变量中存放的指针是指向某个变量的地址。
回复 支持 反对

使用道具 举报

6

主题

39

帖子

0

精华

初级会员

Rank: 2

积分
103
金钱
103
注册时间
2014-10-21
在线时间
7 小时
发表于 2015-2-10 14:45:36 | 显示全部楼层
usb学习了!
爱电子,爱科技,爱新技术
回复 支持 反对

使用道具 举报

2

主题

38

帖子

0

精华

初级会员

Rank: 2

积分
87
金钱
87
注册时间
2015-7-23
在线时间
9 小时
发表于 2015-7-23 15:16:53 | 显示全部楼层
23楼和48楼理解正确
回复 支持 反对

使用道具 举报

15

主题

786

帖子

5

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
3223
金钱
3223
注册时间
2015-7-26
在线时间
811 小时
发表于 2015-8-10 08:30:53 | 显示全部楼层
mark!!!!!!!!!!!!!!!!!!!1
我的博客:http://blog.csdn.net/itdo_just
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2015-12-30
在线时间
10 小时
发表于 2016-2-3 16:58:05 | 显示全部楼层
mark~~~
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-3-16 22:27:32 | 显示全部楼层
楼主去年圣诞节来了一次之后就再也没又来了
最近爱上了stm32
回复 支持 反对

使用道具 举报

74

主题

334

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
436
金钱
436
注册时间
2015-5-28
在线时间
144 小时
发表于 2016-3-16 23:03:01 | 显示全部楼层
我来根据我刚刚看的一次简单概述下我的理解。  (*(volatile unsigned char *)0x20) ,首先将0x20这个十六进制强制转换成指向unsigned char 类型的指针(( unsigned char *)0x20),也就是说,0x20代表的是地址。毕竟它是寄存器的地址,寄存器的内容会变,加个volatile 意思一下((volatile unsigned char *)0x20)。然后再加个*,呵呵,不就是地址前面加个*号嘛,就是代表地址为0x20上寄存器的值啊。。。。
最近爱上了stm32
回复 支持 反对

使用道具 举报

6

主题

17

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2016-3-31
在线时间
19 小时
发表于 2016-4-25 17:57:51 | 显示全部楼层
字体太大,over。
内容有用,以上。
回复 支持 反对

使用道具 举报

5

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
69
金钱
69
注册时间
2016-4-10
在线时间
26 小时
发表于 2016-5-5 21:58:42 | 显示全部楼层
#define     __O     volatile                  /*!< defines 'write only' permissions     */ #define     __IO    volatile                  /*!< defines 'read / write' permissions   */ 这两个区别是什么? 求楼主解答
回复 支持 反对

使用道具 举报

3

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
233
金钱
233
注册时间
2016-4-24
在线时间
62 小时
发表于 2016-10-25 19:54:23 | 显示全部楼层
这个解答非常漂亮
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
160
金钱
160
注册时间
2016-9-12
在线时间
32 小时
发表于 2016-10-25 20:34:58 | 显示全部楼层
mark!!!!!
回复 支持 反对

使用道具 举报

5

主题

90

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
282
金钱
282
注册时间
2016-8-5
在线时间
158 小时
发表于 2016-10-25 22:53:59 | 显示全部楼层
这百度一下就知道了。。意思是每次访问都在这个地址访问。而不是拷贝内存访问
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
64
金钱
64
注册时间
2016-9-6
在线时间
11 小时
发表于 2016-12-10 15:50:57 | 显示全部楼层
MARK  
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
190
金钱
190
注册时间
2017-2-9
在线时间
15 小时
发表于 2017-2-15 11:35:11 | 显示全部楼层
很多头文件里都能找到这个,这下算是理解较深了
回复 支持 反对

使用道具 举报

20

主题

123

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2015-10-2
在线时间
59 小时
发表于 2017-2-15 11:40:14 | 显示全部楼层
帮顶!!!!!!!!!!!!!!
回复 支持 反对

使用道具 举报

7

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
402
金钱
402
注册时间
2016-12-10
在线时间
73 小时
发表于 2017-2-17 01:22:24 | 显示全部楼层
学习啦
回复 支持 反对

使用道具 举报

8

主题

145

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
462
金钱
462
注册时间
2016-12-14
在线时间
75 小时
发表于 2017-2-17 08:31:46 | 显示全部楼层
学习了。谢谢
书山有路勤为径,学海无涯苦作舟!
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2017-7-20
在线时间
4 小时
发表于 2017-7-20 14:26:02 | 显示全部楼层
受教了!!
回复 支持 反对

使用道具 举报

0

主题

13

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2017-8-23
在线时间
2 小时
发表于 2017-8-23 15:07:33 | 显示全部楼层
谢谢,解释得很详细
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-8-23
在线时间
3 小时
发表于 2017-8-23 17:25:07 | 显示全部楼层
mark!
回复 支持 反对

使用道具 举报

10

主题

232

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2288
金钱
2288
注册时间
2012-8-24
在线时间
247 小时
发表于 2017-8-23 20:59:29 | 显示全部楼层
谢谢,学习了,顶起来
单片机技术交流请加127034610
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-8-16 11:15:06 | 显示全部楼层
#define p   (unsigned char *)0x20  就像是uint8_t  *p;中的p,只不过此时是p没有指定固定的值,具体地址是多少由单片机分配,而
(unsigned char *)0x20是一个固定值,表示p的地址就是0x20
而要是对指针赋值就相当于  *p = 55;或者*(unsigned char *)0x20 = 55;这两句话效果是一样的,在这里55存放在那里是固定的。
uint8_t *p;    *p=55;这里也是对指针赋值,只不过这里的55所存放的地址是随即的不固定的,通过查看p的值来知道地址是多少
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-9-27 15:37:47 | 显示全部楼层
Tardis 发表于 2011-11-1 23:37
回复【楼主位】yaocp86:
---------------------------------

回复【5楼】正点原子:
--------------------- ...

不对
*(volatile unsigned char *)0x20 = 0x80
能理解成这样就对了
回复 支持 反对

使用道具 举报

7

主题

188

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
385
金钱
385
注册时间
2018-7-19
在线时间
126 小时
发表于 2018-9-27 15:39:45 | 显示全部楼层
fenglei1126 发表于 2012-12-20 21:01
那么(volatile&nbsp;unsigned&nbsp;char&nbsp;*)0x20是一个固定的指针,是不可变的,不是变量。而char&nbsp ...

似乎是这么个道理
但是我有个疑惑是这个地址的内容可以被硬件修改,还是这个地址可以被修改
回复 支持 反对

使用道具 举报

0

主题

17

帖子

0

精华

初级会员

Rank: 2

积分
132
金钱
132
注册时间
2018-1-3
在线时间
39 小时
发表于 2018-10-13 15:00:59 | 显示全部楼层
指针 C语言的精华,mark!
回复 支持 反对

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2018-10-13 16:30:16 | 显示全部楼层
篮板痴汉玩蛋片 发表于 2016-5-5 21:58
#define     __O     volatile                  /*!< defines 'write only' permissions     */ #define   ...

__IO 跟volatile是同一回事
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 20:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表