关于HT PICC的volatile关键字和static关键字

[复制链接]
5806|6
 楼主| YLKS 发表于 2007-9-24 14:40 | 显示全部楼层 |阅读模式
现象:<br />HT&nbsp;PICC18编写的程序,在运行中,出现错误。使用ICD2仿真后,发现进入错误的断点,而断点处的bank选择是错误的。<br />现在所有变量加上volatile关键字后,错误消失,运行正确。源程序没有做修改。<br /><br />问题:<br />volatile关键字到底作用是什么?英文翻译的原意是:挥发性的,可变的。。。但是PICC&nbsp;USER&nbsp;MANUAL里面的说明是:<br />The&nbsp;volatile&nbsp;type&nbsp;qualifier&nbsp;is&nbsp;used&nbsp;to&nbsp;tell&nbsp;the&nbsp;compiler&nbsp;that&nbsp;an&nbsp;object&nbsp;cannot&nbsp;be&nbsp;guaranteed&nbsp;to&nbsp;retain&nbsp;its&nbsp;value&nbsp;between&nbsp;successive&nbsp;accesses.&nbsp;This&nbsp;prevents&nbsp;the&nbsp;optimizer&nbsp;from&nbsp;eliminating&nbsp;apparently<br />redundant&nbsp;references&nbsp;to&nbsp;objects&nbsp;declared&nbsp;volatile&nbsp;because&nbsp;it&nbsp;may&nbsp;alter&nbsp;the&nbsp;behaviour&nbsp;of&nbsp;the&nbsp;program&nbsp;to&nbsp;do&nbsp;so.<br />大概意思应该是防止编译器误优化掉,具体应该怎么理解,请指教。<br /><br />同样,STATIC关键字,怎么理解。<br /><br />最后,是不是所有的程序,变量定义都要使用volatile或者static?怎么做比较好?好像在MISRA&nbsp;C规范里面,所有的变量定义需要static关键字的。
hjh002 发表于 2007-9-24 23:41 | 显示全部楼层

又是HT C编译器的问题?

HT&nbsp;的C编译器经常出类似的错误的,或者把程序减少一部分,或者把某部分程序换个位置,错误就会消失。<br />嘿嘿,,,,,,,,,,,,
yewuyi 发表于 2007-9-25 08:43 | 显示全部楼层

BS楼上两位

HTPICC是PIC最好的编译器,不要因为自己不会耍,就说刀不锋利……<br /><br /><br /><br />volatile和static的使用可参考张明峰先生当年的关于PIC的那本书的最后一章。<br /><br />static就不说了,volatile可理解为易变型变量定义,关于这个的使用可见:P404的描述。
3.3v 发表于 2007-9-25 11:05 | 显示全部楼层

re

volatile目的就是不让编译器把变量给优化掉了。一个铁打不动的变量。<br />
 楼主| YLKS 发表于 2007-9-27 08:45 | 显示全部楼层

恩,恩,张老师的书上面确实对VOLATILE关键字明示了。

首先谢谢3楼的,本来就是没耍好刀,请大家一起分析下怎么样才能把刀耍好。<br /><br />不过现在加了VOLATILE后,新的麻烦(不是问题)出来了。<br />因为调用的函数参数应该是非保留的,也就是没有关键字volatile的,但是调用函数的时候,传递下去的参数往往是有关键字volatile的(特别是数组操作,一般会把数组地址传下去,数组是volatile的,而函数传递的参数是临时的没volatile的),所以有一堆WARNING....呵呵,看着不爽。
yewuyi 发表于 2007-9-27 10:05 | 显示全部楼层

没看明白你的问题

看你的问题好象是全局变量和局部变量的问题
 楼主| YLKS 发表于 2007-9-27 10:36 | 显示全部楼层

具体说明

volatile&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;&nbsp;&nbsp;&nbsp;cArray1[16];<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(uchar&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt);<br /><br />main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(cArray1);<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(uchar&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;pArray_Prt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt&nbsp;=&nbsp;0x02;<br />}<br /><br />编译结果:<br />有个WARNING:<br />Warning[359]&nbsp;E:Sample_Code_1Main_Key_73.c&nbsp;41&nbsp;:&nbsp;illegal&nbsp;conversion&nbsp;between&nbsp;pointer&nbsp;types<br /><br />因为pArray_Prt是临时变量(传递的形参),所以不会用volatile说明,而cArray1是使用的全局变量,用volatile说明。<br /><br />改成void&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(volatile&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt);后,warning消失。说明上面的分析没有问题。<br /><br />看了HT&nbsp;PICC&nbsp;user&nbsp;manual后,根据建议做强制转换,也就是调用函数的时候。<br />Sub_Func((uchar&nbsp;*)(cArray1));<br />函数还是void&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(uchar&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt);<br />WARNING也同样消失。<br />呵呵,估计这样做才是正解。<br /><br />重新更改程序如下:<br />volatile&nbsp;&nbsp;&nbsp;&nbsp;uchar&nbsp;&nbsp;&nbsp;&nbsp;cArray1[16];<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(uchar&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt);<br /><br />main(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func((uchar&nbsp;*)(cArray1));<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1)<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}<br /><br />void&nbsp;&nbsp;&nbsp;&nbsp;Sub_Func(uchar&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt&nbsp;=&nbsp;0x01;<br />&nbsp;&nbsp;&nbsp;&nbsp;pArray_Prt++;<br />&nbsp;&nbsp;&nbsp;&nbsp;*pArray_Prt&nbsp;=&nbsp;0x02;<br />}<br /><br />软仿真能够正确运行。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

14

帖子

1

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