您的位置: OpenADSP社区论坛 -> Blackfin专区 -> 新手上路 -> 奇怪的指针值自加问题?
本帖共有573个阅读者
发表帖子 发表投票 回复主题
奇怪的指针值自加问题?
笑溜溜(论坛游民)
笑溜溜
头衔:社区公民
帮派:无帮无派
帖数:84
金钱:819
积分:107
注册时间:2012/12/13
楼主信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
奇怪的指针值自加问题?
我才开始定义了两个全局变量DDRdata_1_E和DDRdata,如下程序框架

volatile unsigned short*DDRdata_1_S,*DDRdata_1_E;
volatile unsigned short*DDRdata;


void main(void)
{
   //初始化
  DDRdata=0x01000000;

  while(1)
   {
       EP2_start=0x01;
       DDRdata_1_S= DDRdata + 22;
       rece_act=rece_num>>1;
       while(rece_usb<rece_act)//小于规定字节数目
        {
           //是否要加上若干的延时???以及所收字节数现时反馈
         }
       
       EP2_start=0x00;
       DSP_rece=rece_usb;
       rece_usb=0x00000000;
     
       DDRdata_1_E=DDRdata;
       DDRdata++;                   
       process_rece_num(0x01, DSP_rece);
       //反馈给上位机所收字节数
       PC_Recive(send_rece_num,0x08);
   }
}

EX_INTERRUPT_HANDLER(FlagA_ISR)
{
   if((*pPORTFIO&PF2) == PF2) // 控制命令信息中断
   {
    }
   else if((*pPORTFIO&PF4) == PF4)
    {
        if(EP2_start==0x01)
          {
             while((*pPORTFIO & PF4)==PF4)
               {
                  *DDRdata=*READ_EP2;
                   DDRdata++;
                   rece_usb++;
                }
           }
     }
   *pPORTFIO_CLEAR = PF4|PF2;  
  
  }
可以看我所上传的附件中的图片,在图片一中运行到107行,DDRdata=0x0105dc5a,在运行完110行时,我觉的DDRdata_1_E=0x0105dc5a,但是程序运行完是0x01000000,再运行111行,DDRdata就是0x0100002(如图片三所示),这个是为什么?

上传的图片
  201371623383639.png [ 36.55 KB 1171×583 ] (缩略时请点击查看原图)

 



上传的图片
  20137162339839.png [ 36.54 KB 1168×590 ] (缩略时请点击查看原图)

 


上传的图片
  201371623391739.png [ 36.59 KB 1170×580 ] (缩略时请点击查看原图)

 



后来我发现在第93行,DDRdata_1_S= DDRdata + 22;处执行完后,这个DDRdata_1_S指针值指向了0x0100002c处,后来我改了一下110行和111行,如下:
DDRdata_1_E = DDRdata_1_S - 22 + DSP_rece;
DDRdata = DDRdata_1_E + 1;
那这样就没问题了,我就是不明白为什么先前不行?



「该帖子被 笑溜溜 在 2013-07-18 14:22:40 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2013/7/16 23:37:50
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
1信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你的指针定义的为short,所以执行+1后,指针增加2,
DDRdata_1_S= DDRdata + 22;处执行完后,
指向了0x0100002c处是正确的,你查一下
DDRdata值何时变成
0x0105dc5a,代码中看不到。你看看这个值是否为上电默认的冗余值,就是优化器更改了代码的运行你的
DDRdata=0x01000000;此时并没有生效。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/7/18 9:47:15
笑溜溜(论坛游民)
笑溜溜
头衔:社区公民
帮派:无帮无派
帖数:84
金钱:819
积分:107
注册时间:2012/12/13
2信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
“DDRdata值何时变成0x0105dc5a”
我的程序先是初始化,后来进入了while(1)循环中,再运行到while(rece_usb<rece_act)中,只要rece_usb小于规定数目,就一直循环中,我设置这个循环就是在检测PF4的引脚中断,假若有PF4的引脚中断,我就接收数据就开始读,那么DDRdata的指针位置开始不断的增加。当接收完中断后推出,rece_usb大于了规定值,就推出了while(rece_usb<rece_act)循环,就如我第一副图所示,当时DDRdata还是0x0105dc5a,可是接着运行,就如第二副和第三幅图,这个DDRdata和DDRdata_1_E就不是所理想值????
“上电默认的冗余值“
初始化时我的DDRdata=0x01000000;
”优化器更改了代码的“
这个看哪个地方?


「该帖子被 笑溜溜 在 2013-07-18 15:44:06 编辑过」

这家伙很懒,什么也没有留下!
等级:论坛游民 参考IP地址:*.*.*.*
2013/7/18 15:43:08
尊贵身份标志
andy(论坛版主)
andy
头衔:社区公民
帮派:无帮无派
帖数:2287
金钱:11132
积分:2263
注册时间:2011/6/8
3信息 | 留言 | Email | 主页 | 编辑 | 管理 | 离线
你看看你工程优化开关打开没,如果开了,把这个开关关掉,你代码中有没有中断之类的,会修改这个值。或者 你再用一个变量,把这个值在正确的地方读出来,然后通过这个变量传递。
还有一种可能,你使用的内存有叠加现象,这个值出现更改可能是别的数组包含DDRdata 变量这个存值的地址,数组更改,导致DDRdata数据更改。

这家伙很懒,什么也没有留下!
等级:论坛版主 参考IP地址:*.*.*.*
2013/7/19 9:38:33
Powered by OpenADSP Copyright © 2010 www.Openadsp.com. All rights reserved.159355 Call, 1 Queries, Processed in 0.031250 second(s),