matrx2010 发表于 2013-2-26 10:32:40

关于 static 变量求助

void send_header(Xuint32 start_addr,Xuint8 flag)
{
      static Xuint32 addr;
      Xuint32 temp;
      Xuint8tmp1;
      Xuint8last_byte=0;
      Xuint32 i=0;
      Xuint8j=0;
      //Xuint8addr_tem;
      static Xuint8 k=0;
      //static Xunit8 k=0;
      Xuint8    jump_flag=0;
   Xuint32temp_d; //
      if(flag!=0)//send file header
      {      
                        addr = start_addr;
                        k=0;
      }
}在xilinx xps中编写软件是写了上面一个子程序。其中addr用到的是static型变量,单步调试程序的时候没有问题,但是一直运行程序的时候,当flag!=0时,if{}这一段有时候不被执行,addr保持原来的值,不知道为什么。请大侠指点。

zhonggp 发表于 2013-2-26 12:49:54

跟static没有关系

Alimy 发表于 2013-2-26 14:52:39

本帖最后由 Alimy 于 2013-2-26 14:59 编辑

static 静态局部变量不被改变的话就会一直维持上一次的值。。if条件成立, addr = start_addr; 这句话执行。。if条件不成立,那么addr没有被重新赋值,addr就会维持上一次的值。。。基本逻辑就是这样。
( 当flag!=0时,if{}这一段有时候不被执行,addr保持原来的值,不知道为什么。)if条件满足还不执行那句话么?设置过断点当条件满足时也不能进入执行那句话么?
这样的话可能有三个原因: 1:start_addr传递进来没变。。。 2:if条件可能并不满足。。3:未知原因

wistarky 发表于 2013-2-26 15:17:04

不在调试时,你是怎么知道flag!=0的?

matrx2010 发表于 2013-2-26 16:04:55

wistarky 发表于 2013-2-26 15:17 static/image/common/back.gif
不在调试时,你是怎么知道flag!=0的?

调用这个函数之前加了一段延时就没问题了,不知道为什么,还在debug分析中。。。

matrx2010 发表于 2013-2-26 16:08:20

Alimy 发表于 2013-2-26 14:52 static/image/common/back.gif
static 静态局部变量不被改变的话就会一直维持上一次的值。。if条件成立, addr = start_addr; 这句话执行 ...

第一个原因,难道是实参传递给形参出问题?在调用函数之前加一段延时也没有问题,不知道作何解释

Alimy 发表于 2013-2-26 16:17:11

matrx2010 发表于 2013-2-26 16:08 static/image/common/back.gif
第一个原因,难道是实参传递给形参出问题?在调用函数之前加一段延时也没有问题,不知道作何解释 ...

如果是第一个原因的话调用时传参的问题,每次调用传参传递进来就是一样的。

不过我感觉第二个原因的可能性更大些(不清楚实际应用环境,只能用“感觉”的了)。。
看下flag是在哪里由于什么原因才能被修改,或许这是加延时才能正确解决的原因..(猜的,希望没有引你如歧途。。)

gold 发表于 2013-2-26 16:37:23

FPGA可以用C开发了吗?怎么看起来是C啊,如果是C的话,应该是把整个if优化掉了。

matrx2010 发表于 2013-2-26 17:21:15

gold 发表于 2013-2-26 16:37 static/image/common/back.gif
FPGA可以用C开发了吗?怎么看起来是C啊,如果是C的话,应该是把整个if优化掉了。 ...

c程序是在FPGA的软核上跑的,xilinx的有microblaze,Altera 有nios, 不过现在两家新的产品都开始用ARM的硬核了,ARM硬核+可编程逻辑资源应该是未来FPGA发展的方向,如果成本问题能够解决也是有可能代替ASIC的。。

matrx2010 发表于 2013-2-27 16:07:15

Alimy 发表于 2013-2-26 16:17 static/image/common/back.gif
如果是第一个原因的话调用时传参的问题,每次调用传参传递进来就是一样的。

不过我感觉第二个原因的可能 ...

经过各种debug,算是找到原因了,程序的另外一个地方用到memset函数,注释掉这个函数就ok了,看来是memset对存放静态变量内存做了什么操作,但我不理解的是memset是对特定区域进行操作怎么会影响到其他地方。。

Alimy 发表于 2013-2-27 16:13:59

本帖最后由 Alimy 于 2013-2-28 08:53 编辑

matrx2010 发表于 2013-2-27 16:07 static/image/common/back.gif
经过各种debug,算是找到原因了,程序的另外一个地方用到memset函数,注释掉这个函数就ok了,看来是memse ...

哦。。这样啊。。那是不是调用memset传参数时导致泄漏了从而改变了的了?   静态变量是独占内存不是共用或者重新分配的,溢出/泄漏是可能的原因。

中国力量 发表于 2013-2-27 17:51:54

和static 没关系 是程序调取的原因吧
页: [1]
查看完整版本: 关于 static 变量求助