关于 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保持原来的值,不知道为什么。请大侠指点。 跟static没有关系 本帖最后由 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:未知原因 不在调试时,你是怎么知道flag!=0的? wistarky 发表于 2013-2-26 15:17 static/image/common/back.gif
不在调试时,你是怎么知道flag!=0的?
调用这个函数之前加了一段延时就没问题了,不知道为什么,还在debug分析中。。。 Alimy 发表于 2013-2-26 14:52 static/image/common/back.gif
static 静态局部变量不被改变的话就会一直维持上一次的值。。if条件成立, addr = start_addr; 这句话执行 ...
第一个原因,难道是实参传递给形参出问题?在调用函数之前加一段延时也没有问题,不知道作何解释 matrx2010 发表于 2013-2-26 16:08 static/image/common/back.gif
第一个原因,难道是实参传递给形参出问题?在调用函数之前加一段延时也没有问题,不知道作何解释 ...
如果是第一个原因的话调用时传参的问题,每次调用传参传递进来就是一样的。
不过我感觉第二个原因的可能性更大些(不清楚实际应用环境,只能用“感觉”的了)。。
看下flag是在哪里由于什么原因才能被修改,或许这是加延时才能正确解决的原因..(猜的,希望没有引你如歧途。。) FPGA可以用C开发了吗?怎么看起来是C啊,如果是C的话,应该是把整个if优化掉了。 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的。。 Alimy 发表于 2013-2-26 16:17 static/image/common/back.gif
如果是第一个原因的话调用时传参的问题,每次调用传参传递进来就是一样的。
不过我感觉第二个原因的可能 ...
经过各种debug,算是找到原因了,程序的另外一个地方用到memset函数,注释掉这个函数就ok了,看来是memset对存放静态变量内存做了什么操作,但我不理解的是memset是对特定区域进行操作怎么会影响到其他地方。。 本帖最后由 Alimy 于 2013-2-28 08:53 编辑
matrx2010 发表于 2013-2-27 16:07 static/image/common/back.gif
经过各种debug,算是找到原因了,程序的另外一个地方用到memset函数,注释掉这个函数就ok了,看来是memse ...
哦。。这样啊。。那是不是调用memset传参数时导致泄漏了从而改变了的了? 静态变量是独占内存不是共用或者重新分配的,溢出/泄漏是可能的原因。 和static 没关系 是程序调取的原因吧
页:
[1]