ads中指针变量定义的怪问题!

[复制链接]
2859|8
 楼主| bxb_lhj 发表于 2007-11-7 10:09 | 显示全部楼层 |阅读模式
小弟作测试,采用周立功模版,创建任务如下。其中INT32U&nbsp;*PBoxMessage;编译可以过去,进入axd后将PBoxMessage放入witch提示如下:variable&nbsp;removed&nbsp;by&nbsp;compiler(optimization)<br /><br /><br />其中<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*PBoxMessage;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+12);<br /><br />没有编译。<br />void&nbsp;Task0&nbsp;&nbsp;&nbsp;&nbsp;(void&nbsp;*pdata)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;INT8U&nbsp;err;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;*PBoxMessage;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;tempc;<br />&nbsp;&nbsp;&nbsp;&nbsp;OS_SEM_DATA&nbsp;PdemoPara;<br />&nbsp;&nbsp;&nbsp;&nbsp;INT32U&nbsp;cnt&nbsp;=&nbsp;0;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;pdata&nbsp;=&nbsp;pdata;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;Pdemo&nbsp;=&nbsp;OSSemCreate(0);<br />&nbsp;&nbsp;&nbsp;&nbsp;Pboxdemo&nbsp;=&nbsp;OSMboxCreate((void&nbsp;*)0);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;TargetInit&nbsp;();<br />&nbsp;&nbsp;&nbsp;&nbsp;OSStatInit();&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;OSTaskCreate&nbsp;(Task1,(void&nbsp;*)0,&nbsp;&TaskStk1[TaskStkLengh&nbsp;-&nbsp;1],&nbsp;3);<br />&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PBoxMessage&nbsp;=(INT32U&nbsp;*)&nbsp;OSMboxPend(Pboxdemo,1000,&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*PBoxMessage;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+12);<br />/*&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;OSSemQuery(Pdemo,&PdemoPara);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;do{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;err&nbsp;=&nbsp;OSSemAccept(Pdemo);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}while(err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OSSemPend((OS_EVENT&nbsp;*)Pdemo,1000,&err);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cnt%2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEDOFF;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LEDON;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Pdemo-&gtOSEventCnt&nbsp;=&nbsp;0;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br />
dld2 发表于 2007-11-7 10:13 | 显示全部楼层

没有什么啊

编译器认为这个变量没有意义,已经优化掉了。<br />我想你使用一下tempc,例如把tempc的值用printf之类输出出来,应该就可以看到PBoxMessage了。
 楼主| bxb_lhj 发表于 2007-11-7 11:17 | 显示全部楼层

不能理解

我定义了<br />INT32U&nbsp;*PBoxMessage;<br /><br />后面还有<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*PBoxMessage;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+8);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+12);<br /><br />为什么还优化掉了呢?
 楼主| bxb_lhj 发表于 2007-11-7 11:32 | 显示全部楼层

又有发现

INT32U&nbsp;tempc;<br /><br />也被优化掉了<br />
dld2 发表于 2007-11-7 11:33 | 显示全部楼层

我猜测是编译器太聪明了

虽然定义了变量,并且使用了该变量给tempc赋值。但由于你没有使用tempc,所以一起优化掉了,包括tempc。
 楼主| bxb_lhj 发表于 2007-11-7 11:43 | 显示全部楼层

太聪明了

5楼真是太聪明了,加了如下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(tempc&nbsp;==&nbsp;5)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt&nbsp;=&nbsp;0;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />tempc&nbsp;好使了:)<br />
 楼主| bxb_lhj 发表于 2007-11-7 17:15 | 显示全部楼层

又看了一下,2楼也是个高手呀,谢谢。:)

  
djyos 发表于 2007-11-7 17:28 | 显示全部楼层

即使有if(tempc == 5)...,下面三句仍然无效

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*PBoxMessage;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+4);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tempc&nbsp;=&nbsp;*(PBoxMessage+8);<br />给优化掉了。<br />&nbsp;&nbsp;&nbsp;&nbsp;gcc编译时,如果选择优化级别=0,这三句会给你留着,但ads不同,即使选择op=0,也会给优化掉,有自作聪明之嫌。<br />&nbsp;&nbsp;&nbsp;&nbsp;如果在定义时使用<br />volatile&nbsp;INT32U&nbsp;tempc;<br />volatile&nbsp;&nbsp;INT32U&nbsp;*PBoxMessage;<br />即使没有if(tempc&nbsp;==&nbsp;5)...,也不会被优化掉。<br /><br /><br />
 楼主| bxb_lhj 发表于 2007-11-7 17:39 | 显示全部楼层

volatile,看来我得查查了,以前没有注意呀

不好意思,原来2楼5楼是同一人呀:)<br /><br />djyos你好,非常感谢您的赐教。<br />我看了arm头文件里寄存器的定义确实如您所说<br />#define&nbsp;T0IR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;long&nbsp;*)&nbsp;0xE0004000))<br />#define&nbsp;T0TCR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*((volatile&nbsp;unsigned&nbsp;long&nbsp;*)&nbsp;0xE0004004))<br /><br />如果不这样定义的话,肯定被优化掉了。:)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

89

帖子

0

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