打印

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

[复制链接]
1733|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bxb_lhj|  楼主 | 2007-11-7 10:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
小弟作测试,采用周立功模版,创建任务如下。其中INT32U *PBoxMessage;编译可以过去,进入axd后将PBoxMessage放入witch提示如下:variable removed by compiler(optimization)


其中
        tempc = *PBoxMessage;
        tempc = *(PBoxMessage+4);
        tempc = *(PBoxMessage+8);
        tempc = *(PBoxMessage+12);

没有编译。
void Task0    (void *pdata)
{
    INT8U err;
    INT32U *PBoxMessage;
    INT32U tempc;
    OS_SEM_DATA PdemoPara;
    INT32U cnt = 0;
    
    
    pdata = pdata;
    
    Pdemo = OSSemCreate(0);
    Pboxdemo = OSMboxCreate((void *)0);
    

    TargetInit ();
    OSStatInit(); 
    OSTaskCreate (Task1,(void *)0, &TaskStk1[TaskStkLengh - 1], 3);
    while (1)
    {
        PBoxMessage =(INT32U *) OSMboxPend(Pboxdemo,1000,&err);
        tempc = *PBoxMessage;
        tempc = *(PBoxMessage+4);
        tempc = *(PBoxMessage+8);
        tempc = *(PBoxMessage+12);
/*    
        err = OSSemQuery(Pdemo,&PdemoPara);
        do{
        err = OSSemAccept(Pdemo);
        }while(err);
        OSSemPend((OS_EVENT *)Pdemo,1000,&err);
        */
        cnt++;
        if(cnt%2)
        {
            LEDOFF;
        }
        else
        {
            LEDON;
        }
        //Pdemo->OSEventCnt = 0;

    }
}

相关帖子

沙发
dld2| | 2007-11-7 10:13 | 只看该作者

没有什么啊

编译器认为这个变量没有意义,已经优化掉了。
我想你使用一下tempc,例如把tempc的值用printf之类输出出来,应该就可以看到PBoxMessage了。

使用特权

评论回复
板凳
bxb_lhj|  楼主 | 2007-11-7 11:17 | 只看该作者

不能理解

我定义了
INT32U *PBoxMessage;

后面还有

        tempc = *PBoxMessage;
        tempc = *(PBoxMessage+4);
        tempc = *(PBoxMessage+8);
        tempc = *(PBoxMessage+12);

为什么还优化掉了呢?

使用特权

评论回复
地板
bxb_lhj|  楼主 | 2007-11-7 11:32 | 只看该作者

又有发现

INT32U tempc;

也被优化掉了

使用特权

评论回复
5
dld2| | 2007-11-7 11:33 | 只看该作者

我猜测是编译器太聪明了

虽然定义了变量,并且使用了该变量给tempc赋值。但由于你没有使用tempc,所以一起优化掉了,包括tempc。

使用特权

评论回复
6
bxb_lhj|  楼主 | 2007-11-7 11:43 | 只看该作者

太聪明了

5楼真是太聪明了,加了如下
        if(tempc == 5)
        {      
            cnt = 0; 
        }

tempc 好使了:)

使用特权

评论回复
7
bxb_lhj|  楼主 | 2007-11-7 17:15 | 只看该作者

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

使用特权

评论回复
8
djyos| | 2007-11-7 17:28 | 只看该作者

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

        tempc = *PBoxMessage;
        tempc = *(PBoxMessage+4);
        tempc = *(PBoxMessage+8);
给优化掉了。
    gcc编译时,如果选择优化级别=0,这三句会给你留着,但ads不同,即使选择op=0,也会给优化掉,有自作聪明之嫌。
    如果在定义时使用
volatile INT32U tempc;
volatile  INT32U *PBoxMessage;
即使没有if(tempc == 5)...,也不会被优化掉。


使用特权

评论回复
9
bxb_lhj|  楼主 | 2007-11-7 17:39 | 只看该作者

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

不好意思,原来2楼5楼是同一人呀:)

djyos你好,非常感谢您的赐教。
我看了arm头文件里寄存器的定义确实如您所说
#define T0IR            (*((volatile unsigned long *) 0xE0004000))
#define T0TCR           (*((volatile unsigned long *) 0xE0004004))

如果不这样定义的话,肯定被优化掉了。:)

使用特权

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

本版积分规则

21

主题

89

帖子

0

粉丝