打印

【求助】很诡异的一条C语句

[复制链接]
2748|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
frlop|  楼主 | 2012-5-10 17:55 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 frlop 于 2014-6-13 09:09 编辑

飞思卡尔s12中一段指令如下:

  SCE = 0;   
  if (command == 0)     
  DC = 0;
  else   
   DC = 1;
  while(!SPI0SR_SPTEF);
  (void)SPI0SR;  //
  SPI0DR=dt;
  while(!SPI0SR_SPIF);
  (void)SPI0DR;  //
   SCE = 1;

其中

(void)SPI0SR;

(void)SPI0DR;  //
用途为清空该寄存器.
但我百度了很久也没找到这种用法,求大神解释,c语言中这诡异的语句究竟怎么回事!

相关帖子

沙发
frlop|  楼主 | 2012-5-10 17:55 | 只看该作者
有门有大神,求解释。

使用特权

评论回复
板凳
原野之狼| | 2012-5-10 19:40 | 只看该作者
所谓清空之说   出处在哪里   还是LZ亲自验证过了?

使用特权

评论回复
地板
myredhat| | 2012-5-10 20:40 | 只看该作者
非常谢谢朋友。

使用特权

评论回复
5
icecut| | 2012-5-10 21:05 | 只看该作者
3# 原野之狼
你被楼主挖的坑给坑了...

这个寄存器是rc = read clear型.所以这样就可以清零了....

使用特权

评论回复
6
原野之狼| | 2012-5-10 23:38 | 只看该作者
3# 原野之狼  
你被楼主挖的坑给坑了...

这个寄存器是rc = read clear型.所以这样就可以清零了....
icecut 发表于 2012-5-10 21:05

嗯  我孤陋寡闻了

使用特权

评论回复
7
ayb_ice| | 2012-5-11 09:23 | 只看该作者
这样的写法,很多编译器是为了消除警告,并不产生任何代码
最好是这样
volatile char x;
x = SPI0DR;

当然SPI0DR实质可能已经被定义成了volatile变量,此时(void)SPI0SR;语句就必然产生读操作,读操作可能会产生清空操作,这个取决于具体的芯片设计了

使用特权

评论回复
8
batsong| | 2012-5-11 15:24 | 只看该作者
7# ayb_ice
正解,不然直接给优化掉了

使用特权

评论回复
9
and| | 2012-5-11 15:39 | 只看该作者
read clear,很多寄存器被设计成这样

使用特权

评论回复
10
MOZATE| | 2012-5-11 15:59 | 只看该作者
要看看汇编。  这个时候知道汇编的用处了吧。

使用特权

评论回复
11
frlop|  楼主 | 2012-5-11 18:50 | 只看该作者
7# ayb_ice
额 要是这么写我就看懂了啊,这。。我想知道C语言里有这种用法吗?如果寄存器不是读清零的话,(VOID)+寄存器 有什么功能。

使用特权

评论回复
12
sunhq02| | 2012-5-12 09:17 | 只看该作者
本帖最后由 sunhq02 于 2012-5-12 09:19 编辑

(void)是强制类型转换, 强制将一个表达式转换成void类型
而void类型什么都不干,表达"显式的放弃表达式的结果", 用于避免某些副作用, 比如警告
至于清空, 应该就是read clear吧, 具体看SPI0DR的定义和芯片手册了

使用特权

评论回复
13
frlop|  楼主 | 2012-5-12 09:37 | 只看该作者
12# sunhq02 懂了 谢谢。

使用特权

评论回复
14
fly098812| | 2012-5-12 12:10 | 只看该作者
不错

使用特权

评论回复
15
sunhq02| | 2012-5-13 12:59 | 只看该作者
哦呵呵

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Stay foolish,stay hungry.

16

主题

835

帖子

3

粉丝