打印

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

[复制链接]
4313|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
YLKS|  楼主 | 2007-9-24 14:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
现象:
HT PICC18编写的程序,在运行中,出现错误。使用ICD2仿真后,发现进入错误的断点,而断点处的bank选择是错误的。
现在所有变量加上volatile关键字后,错误消失,运行正确。源程序没有做修改。

问题:
volatile关键字到底作用是什么?英文翻译的原意是:挥发性的,可变的。。。但是PICC USER MANUAL里面的说明是:
The volatile type qualifier is used to tell the compiler that an object cannot be guaranteed to retain its value between successive accesses. This prevents the optimizer from eliminating apparently
redundant references to objects declared volatile because it may alter the behaviour of the program to do so.
大概意思应该是防止编译器误优化掉,具体应该怎么理解,请指教。

同样,STATIC关键字,怎么理解。

最后,是不是所有的程序,变量定义都要使用volatile或者static?怎么做比较好?好像在MISRA C规范里面,所有的变量定义需要static关键字的。
沙发
hjh002| | 2007-9-24 23:41 | 只看该作者

又是HT C编译器的问题?

HT 的C编译器经常出类似的错误的,或者把程序减少一部分,或者把某部分程序换个位置,错误就会消失。
嘿嘿,,,,,,,,,,,,

使用特权

评论回复
板凳
yewuyi| | 2007-9-25 08:43 | 只看该作者

BS楼上两位

HTPICC是PIC最好的编译器,不要因为自己不会耍,就说刀不锋利……



volatile和static的使用可参考张明峰先生当年的关于PIC的那本书的最后一章。

static就不说了,volatile可理解为易变型变量定义,关于这个的使用可见:P404的描述。

使用特权

评论回复
地板
3.3v| | 2007-9-25 11:05 | 只看该作者

re

volatile目的就是不让编译器把变量给优化掉了。一个铁打不动的变量。

使用特权

评论回复
5
YLKS|  楼主 | 2007-9-27 08:45 | 只看该作者

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

首先谢谢3楼的,本来就是没耍好刀,请大家一起分析下怎么样才能把刀耍好。

不过现在加了VOLATILE后,新的麻烦(不是问题)出来了。
因为调用的函数参数应该是非保留的,也就是没有关键字volatile的,但是调用函数的时候,传递下去的参数往往是有关键字volatile的(特别是数组操作,一般会把数组地址传下去,数组是volatile的,而函数传递的参数是临时的没volatile的),所以有一堆WARNING....呵呵,看着不爽。

使用特权

评论回复
6
yewuyi| | 2007-9-27 10:05 | 只看该作者

没看明白你的问题

看你的问题好象是全局变量和局部变量的问题

使用特权

评论回复
7
YLKS|  楼主 | 2007-9-27 10:36 | 只看该作者

具体说明

volatile    uchar    cArray1[16];

void    Sub_Func(uchar    *pArray_Prt);

main(void)
{
    Sub_Func(cArray1);
    while(1)
    {
    }
}

void    Sub_Func(uchar    *pArray_Prt)
{
    *pArray_Prt = 0x01;
    pArray_Prt++;
    *pArray_Prt = 0x02;
}

编译结果:
有个WARNING:
Warning[359] E:Sample_Code_1Main_Key_73.c 41 : illegal conversion between pointer types

因为pArray_Prt是临时变量(传递的形参),所以不会用volatile说明,而cArray1是使用的全局变量,用volatile说明。

改成void    Sub_Func(volatile    uchar    *pArray_Prt);后,warning消失。说明上面的分析没有问题。

看了HT PICC user manual后,根据建议做强制转换,也就是调用函数的时候。
Sub_Func((uchar *)(cArray1));
函数还是void    Sub_Func(uchar    *pArray_Prt);
WARNING也同样消失。
呵呵,估计这样做才是正解。

重新更改程序如下:
volatile    uchar    cArray1[16];

void    Sub_Func(uchar    *pArray_Prt);

main(void)
{
    Sub_Func((uchar *)(cArray1));
    while(1)
    {
    }
}

void    Sub_Func(uchar    *pArray_Prt)
{
    *pArray_Prt = 0x01;
    pArray_Prt++;
    *pArray_Prt = 0x02;
}

软仿真能够正确运行。

使用特权

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

本版积分规则

4

主题

14

帖子

1

粉丝