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

[复制链接]
3555|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 | 显示全部楼层
非常谢谢朋友。
icecut 发表于 2012-5-10 21:05 | 显示全部楼层
3# 原野之狼
你被楼主挖的坑给坑了...

这个寄存器是rc = read clear型.所以这样就可以清零了....
原野之狼 发表于 2012-5-10 23:38 | 显示全部楼层
3# 原野之狼  
你被楼主挖的坑给坑了...

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

嗯  我孤陋寡闻了
ayb_ice 发表于 2012-5-11 09:23 | 显示全部楼层
这样的写法,很多编译器是为了消除警告,并不产生任何代码
最好是这样
volatile char x;
x = SPI0DR;

当然SPI0DR实质可能已经被定义成了volatile变量,此时(void)SPI0SR;语句就必然产生读操作,读操作可能会产生清空操作,这个取决于具体的芯片设计了
batsong 发表于 2012-5-11 15:24 | 显示全部楼层
7# ayb_ice
正解,不然直接给优化掉了
and 发表于 2012-5-11 15:39 | 显示全部楼层
read clear,很多寄存器被设计成这样
MOZATE 发表于 2012-5-11 15:59 | 显示全部楼层
要看看汇编。  这个时候知道汇编的用处了吧。
 楼主| frlop 发表于 2012-5-11 18:50 | 显示全部楼层
7# ayb_ice
额 要是这么写我就看懂了啊,这。。我想知道C语言里有这种用法吗?如果寄存器不是读清零的话,(VOID)+寄存器 有什么功能。
sunhq02 发表于 2012-5-12 09:17 | 显示全部楼层
本帖最后由 sunhq02 于 2012-5-12 09:19 编辑

(void)是强制类型转换, 强制将一个表达式转换成void类型
而void类型什么都不干,表达"显式的放弃表达式的结果", 用于避免某些副作用, 比如警告
至于清空, 应该就是read clear吧, 具体看SPI0DR的定义和芯片手册了
 楼主| frlop 发表于 2012-5-12 09:37 | 显示全部楼层
12# sunhq02 懂了 谢谢。
fly098812 发表于 2012-5-12 12:10 | 显示全部楼层
sunhq02 发表于 2012-5-13 12:59 | 显示全部楼层
哦呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:Stay foolish,stay hungry.

16

主题

835

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部