OpenEdv-开源电子网

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

请教大家,vu16和u16的区别

[复制链接]

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-10-22
在线时间
0 小时
发表于 2015-3-8 23:22:52 | 显示全部楼层 |阅读模式
5金钱

刚刚看别人的代码时,发现有几个变量是这样定义的:

vu16

_IO uint16_t

易挥发读写访问无符号16位数据

vu8

_IO uint8_t

易挥发读写访问无符号8位数据



看到这些我突然迷糊了,搞不懂“易挥发读写访问”是什么意思,百度也没搜出什么资料......
小弟愚钝,还请大家赐教,先谢谢啦~

最佳答案

查看完整内容[请看2#楼]

楼主学习下violate关键字的使用,就明白了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-3-8 23:22:53 | 显示全部楼层
楼主学习下violate关键字的使用,就明白了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-10-22
在线时间
0 小时
 楼主| 发表于 2015-3-8 23:22:53 | 显示全部楼层
刚刚又查了一下,大概明白了
查看头文件中是否有预定义 
#define     __IO    volatile                  /*!< defines 'read / write' permissions   */
volatile的作用随便一搜索都有
volatile 影响编译器编译的结果,指出,volatile 变量是随时可能发生变化的,与volatile变量有关的运算,不要进行编译优化,以免出错,(VC++ 在产生release版可执行码时会进行编译优化,加volatile关键字的变量有关的运算,将不进行编译优化。)。
例如:
volatile int i=10;
int j = i;
...
int k = i;
volatile 告诉编译器i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的可执行码会重新从i的地址读取数据放在k中。
而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在k中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问,不会出错。[/mw_shl_code]
回复

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-3-9 08:05:14 | 显示全部楼层
说明这个变量是经常变的,不能被编译器忽略
Good good study , day day up...
回复

使用道具 举报

9

主题

27

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2014-10-22
在线时间
0 小时
 楼主| 发表于 2015-3-9 12:50:38 | 显示全部楼层
那vu16可以用u16替代吗,会有什么影响呢
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-3 15:33:38 | 显示全部楼层
正点原子 发表于 2015-3-8 23:22
楼主学习下violate关键字的使用,就明白了。

violate 和 volatile 用途一样吗?有什么区别没?
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-3 15:48:23 | 显示全部楼层
jianhanpiaoying 发表于 2018-6-3 15:33
violate 和 volatile 用途一样吗?有什么区别没?

明显是笔误,不用太计较了
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-3 18:28:39 | 显示全部楼层
本帖最后由 jianhanpiaoying 于 2018-6-3 18:35 编辑
kvdong 发表于 2018-6-3 15:48
明显是笔误,不用太计较了

不是笔误,这两个关键词都查了,意思不太一样,但是作用好像是一样的,所以不明白有啥区别
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-3 18:42:43 | 显示全部楼层
jianhanpiaoying 发表于 2018-6-3 18:28
不是笔误,这两个关键词都查了,意思不太一样,但是作用好像是一样的,所以不明白有啥区别

你确定有“violate”这个关键字?是我孤陋寡闻了,请给出一个介绍的链接或者复制一段文字可否?
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-8 09:32:28 | 显示全部楼层
kvdong 发表于 2018-6-3 18:42
你确定有“violate”这个关键字?是我孤陋寡闻了,请给出一个介绍的链接或者复制一段文字可否?

volatile u32 Systemtime=0;
//这是某个项目中的一句话,意思好像是说每次都从根源读取此变量(Systemtime),防止被编译器优化,读取实时的值
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-8 09:34:29 | 显示全部楼层
kvdong 发表于 2018-6-3 18:42
你确定有“violate”这个关键字?是我孤陋寡闻了,请给出一个介绍的链接或者复制一段文字可否?

正点原子
查看完整内容[请看2#楼]
楼主学习下violate关键字的使用,就明白了。
//这个关键词好像作用跟那个一样但是不知道有啥区别
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-8 10:43:07 | 显示全部楼层
jianhanpiaoying 发表于 2018-6-8 09:32
volatile u32 Systemtime=0;
//这是某个项目中的一句话,意思好像是说每次都从根源读取此变量(Systemti ...

volatile u32 Systemtime=0;
这里不是“volatile”吗?
我是说没有在C语言中见过"violate"这个关键字,通过搜索也没有搜索到相关信息,而你说这两个关键字都有,所以请帮忙提供一个“violate”的用法例子或者网页链接
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-8 10:45:52 | 显示全部楼层
jianhanpiaoying 发表于 2018-6-8 09:34
正点原子
查看完整内容[请看2#楼]
楼主学习下violate关键字的使用,就明白了。

至于原子大神二楼的回复,姑且认为是笔误吧。因为如果在网络上搜索“violate”的话,还都是指向了"volatile",看不到任何“violate”的用法,不清楚你所说的两个用法相似是从什么地方得到的结论。
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-8 10:59:33 | 显示全部楼层
在程序中用violate定义变量的话,MDK编译通不过,见附件图
TIM图片20180608105857.png
回复

使用道具 举报

0

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
144
金钱
144
注册时间
2018-6-10
在线时间
59 小时
发表于 2018-6-10 16:07:45 | 显示全部楼层
kvdong 发表于 2018-6-8 10:59
在程序中用violate定义变量的话,MDK编译通不过,见附件图

朋友啊,看到你这个我都气的注册了一个账号来说你的不是了,你没发现你的关键词打错了吗??!!编译器提示的错误就是你这关键词名字错误。。
回复

使用道具 举报

2

主题

168

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
336
金钱
336
注册时间
2018-5-14
在线时间
69 小时
发表于 2018-6-10 16:29:39 | 显示全部楼层
神话99343441 发表于 2018-6-10 16:07
朋友啊,看到你这个我都气的注册了一个账号来说你的不是了,你没发现你的关键词打错了吗??!!编译器提 ...

朋友啊,看到你这个我都气乐了。
你难道没有看本贴前面的部分吗?
是原子大神回贴时疑似把volatile错打成violate,六楼层主问这两个关键字有没有区别,我说是估计是笔误,他告诉我说不是笔误,而是两个关键字都有,用法差不多,我让他提供一下链接或说明他提供不了,我只好在MDK里实验,就是上面的截图了,为了是向他确认一下…咋就成了我打错了,我晕。
看帖子一定要前后连贯,看明白事情的来龙去脉再发表意见……
回复

使用道具 举报

0

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
173
金钱
173
注册时间
2018-3-17
在线时间
23 小时
发表于 2018-6-11 00:04:07 | 显示全部楼层
哈哈哈,看上面的品论真有趣
回复

使用道具 举报

1

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
81
金钱
81
注册时间
2018-2-3
在线时间
16 小时
发表于 2018-6-20 15:54:34 | 显示全部楼层
kvdong 发表于 2018-6-8 10:59
在程序中用violate定义变量的话,MDK编译通不过,见附件图

OK,大哥你是对的,
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2018-1-17
在线时间
10 小时
发表于 2018-7-24 14:56:47 | 显示全部楼层
学到了,还是自己动手
回复

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2016-10-26
在线时间
7 小时
发表于 2019-11-24 09:34:02 | 显示全部楼层
vu16 和 u16有什么区别??
回复

使用道具 举报

4

主题

380

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3088
金钱
3088
注册时间
2015-10-17
在线时间
320 小时
发表于 2019-11-24 10:36:19 | 显示全部楼层
没有vu16,和u16,这是自己typedef的,你要查原始的类型,然后根据类型自己去百度。你要高兴vu16 定义代表char型都可以。这是挖坟,赚积分吗?
回复

使用道具 举报

8

主题

293

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1001
金钱
1001
注册时间
2018-8-16
在线时间
327 小时
发表于 2019-11-24 13:23:14 | 显示全部楼层
很多人不会去按一下F12吗?
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-8-10
在线时间
7 小时
发表于 2020-1-16 22:01:16 | 显示全部楼层
学到了
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2020-2-25
在线时间
4 小时
发表于 2020-3-6 15:28:20 | 显示全部楼层
  1. // 在 "stdin.h" 这个头文件的63行定义:
  2. typedef unsigned short     int uint16_t;

  3. // 在 "core_cm3.h" 这个头文件的116行定义:
  4. #define     __IO    volatile

  5. // 在 "stm32f10x.h" 这个头文件的第512行定义:
  6. typedef __IO uint16_t vu16;
复制代码

综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

2、vu16的本意就是一个无符号的短整型加volatile关键字修饰

3、vu16与u16的区别就是多了一个volatile修饰

4、现在关键点就是volatile这个东西是什么?这个英文单词的意思是易变的,不稳定的,百度解释:volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。

5、其实是个编译特性,编译器有时候会优化我们的代码,比如:

  1. int a = 1;
  2. a = 2;
  3. a = 3;
  4. a = 4;
复制代码
编译器会怎么想?他会认为你前面3句都是废话,所以在编译的时候他就直接给你生成的机器代码就是int a = 4;而我们在某些情况下,对同一个变量或寄存器这样赋值,可能是有意义的,不能直接优化成最后一句,所以我们要告诉编译器,你别自做聪明,按照我写的本意来,加volatile关键字就是这个目的。

好了,水平有限,我的理解是这样的,仅供参考。
回复

使用道具 举报

3

主题

10

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2020-1-6
在线时间
6 小时
发表于 2020-3-14 22:50:30 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

看了这么多 就你这条我看懂了
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2018-12-5
在线时间
7 小时
发表于 2020-3-17 11:37:10 | 显示全部楼层
半壶 发表于 2018-6-11 00:04
哈哈哈,看上面的品论真有趣

哈哈,我也是,原子哥的volatile笔误而已
回复

使用道具 举报

1

主题

16

帖子

0

精华

初级会员

Rank: 2

积分
128
金钱
128
注册时间
2020-6-30
在线时间
26 小时
发表于 2020-7-13 20:37:01 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

很棒啊
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2020-8-10
在线时间
5 小时
发表于 2020-8-26 17:04:47 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

看懂了,谢谢大佬
回复

使用道具 举报

2

主题

32

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
299
金钱
299
注册时间
2020-9-25
在线时间
54 小时
发表于 2020-9-26 15:30:47 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

感谢大佬
回复

使用道具 举报

7

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
309
金钱
309
注册时间
2017-6-14
在线时间
45 小时
发表于 2020-11-28 19:10:34 | 显示全部楼层
试试定义一个会被中断处理函数修改的全局变量,如果不加volatile,基本上由于编译器优化主函数的变量值在经过中断之后不会改变。加了volatile,告诉编译器去这个变量的地址读值而不是方便读取的副本值。
回复

使用道具 举报

3

主题

1907

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4106
金钱
4106
注册时间
2018-8-14
在线时间
696 小时
发表于 2020-11-29 11:56:01 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

比如有一全局变量  int rxDataRdy;

当串口接收到数据时,串口中断程序会把rxDataRdy=1;

而在主程序的大循环里通过判断rxDataRdy来做事, 比如是

while(1) {

  if (rxDataRdy){
    。。。。。串口接收数据后要做的事
}
“”
  “”
}

如果变量不加volatile, 代码很可能会被优化到不能正常工作, 所谓不能正常工作是指, 在主程序里变量rxDataRdy永远都不会是==1。

由于ARM的特性, ARM的运算都是在寄存器之间, 没有直接在RAM里运算的指令, 就算简单如检查是否等于0, 也是要通过先把变量加载到寄存器, 然后再拿寄存器的内容比较是否为0.

编译器进行优化时,在一个函数内, 或一个大循环内, 在程序的入口处, 会把变量从RAM加载到寄存器一次, 之后就拿寄存器来运算, 这就是说, 之后就不会再从RAM更新此寄存器, 因为这很浪费CPU的资源。

而把变量加上 volatile正正是可以解决这问题, 它告诉编译器碰到volatile这关键词时必须从RAM更新到寄存器。

在很多情况下, 定义是不加volatile, 只在特定处才加, 比如

int rxDataRdy;

  if ((volatile int) rxDataRdy){
    。。。。。串口接收数据后要做的事
}

因为我只想在此处才更新rxDataRdy到寄存器, 其它运算当用到rxDataRdy时就别浪费CPU资源, 直接用寄存器运算就行了。


回复

使用道具 举报

0

主题

9

帖子

0

精华

新手上路

积分
48
金钱
48
注册时间
2021-3-5
在线时间
9 小时
发表于 2021-9-14 13:21:19 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

懂了懂了
ps:前面的都是些什么玩意儿,还干起来了,自己懂别装x,你要是觉着人家的问题蠢,你就不要回答,搞的你多牛逼似的
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2021-10-15
在线时间
18 小时
发表于 2025-5-20 08:33:55 | 显示全部楼层
yusian 发表于 2020-3-6 15:28
综合以上3条可以得到以下结论:
1、vu16  =  volatile unsigned short int

点赞-------------
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-1 03:06

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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