搜索
bottom↓
回复: 11

关于 static 变量求助

[复制链接]

出0入0汤圆

发表于 2013-2-26 10:32:40 | 显示全部楼层 |阅读模式
  1. void send_header(Xuint32 start_addr,Xuint8 flag)
  2. {
  3.         static Xuint32 addr;
  4.         Xuint32 temp;
  5.         Xuint8  tmp1[4];
  6.         Xuint8  last_byte=0;
  7.         Xuint32 i=0;
  8.         Xuint8  j=0;
  9.         //Xuint8  addr_tem;
  10.         static Xuint8 k=0;
  11.         //static Xunit8 k=0;
  12.         Xuint8    jump_flag=0;
  13.    Xuint32  temp_d; //
  14.         if(flag!=0)//send file header
  15.         {        
  16.                         addr = start_addr;
  17.                         k=0;
  18.         }
  19. }
复制代码
在xilinx xps中编写软件是写了上面一个子程序。其中addr用到的是static型变量,单步调试程序的时候没有问题,但是一直运行程序的时候,当flag!=0时,if{}这一段有时候不被执行,addr保持原来的值,不知道为什么。请大侠指点。

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-2-26 12:49:54 | 显示全部楼层
跟static没有关系

出0入0汤圆

发表于 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:未知原因

出0入0汤圆

发表于 2013-2-26 15:17:04 | 显示全部楼层
不在调试时,你是怎么知道flag!=0的?

出0入0汤圆

 楼主| 发表于 2013-2-26 16:04:55 | 显示全部楼层
wistarky 发表于 2013-2-26 15:17
不在调试时,你是怎么知道flag!=0的?

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

出0入0汤圆

 楼主| 发表于 2013-2-26 16:08:20 | 显示全部楼层
Alimy 发表于 2013-2-26 14:52
static 静态局部变量不被改变的话就会一直维持上一次的值。。if条件成立, addr = start_addr; 这句话执行 ...

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

出0入0汤圆

发表于 2013-2-26 16:17:11 | 显示全部楼层
matrx2010 发表于 2013-2-26 16:08
第一个原因,难道是实参传递给形参出问题?在调用函数之前加一段延时也没有问题,不知道作何解释 ...

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

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

出0入0汤圆

发表于 2013-2-26 16:37:23 | 显示全部楼层
FPGA可以用C开发了吗?怎么看起来是C啊,如果是C的话,应该是把整个if优化掉了。

出0入0汤圆

 楼主| 发表于 2013-2-26 17:21:15 | 显示全部楼层
gold 发表于 2013-2-26 16:37
FPGA可以用C开发了吗?怎么看起来是C啊,如果是C的话,应该是把整个if优化掉了。 ...

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

出0入0汤圆

 楼主| 发表于 2013-2-27 16:07:15 | 显示全部楼层
Alimy 发表于 2013-2-26 16:17
如果是第一个原因的话调用时传参的问题,每次调用传参传递进来就是一样的。

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

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

出0入0汤圆

发表于 2013-2-27 16:13:59 | 显示全部楼层
本帖最后由 Alimy 于 2013-2-28 08:53 编辑
matrx2010 发表于 2013-2-27 16:07
经过各种debug,算是找到原因了,程序的另外一个地方用到memset函数,注释掉这个函数就ok了,看来是memse ...


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

出0入0汤圆

发表于 2013-2-27 17:51:54 | 显示全部楼层
和static 没关系 是程序调取的原因吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 07:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表