4322|16

481

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

有没有谁遇到过进入某个函数后,连函数代码都改变了的 [复制链接]

有没有谁遇到过进入某个函数后,连函数代码都改变了的

最新回复

  代码有60KB ……全贴上来不现实。另外会不会是仿真器的bug引起的,看看我发现一个帖子是有仿真器的bug引起的:http://hi.baidu.com/fpga_cpld/blog/item/17519c317a32e5ae5edf0ea9.html   “…… 里面网友tsb0574 阿波给出了解释 “出现这个问题一般有两种情况!! 1、确实是你的堆栈溢出了,在project->option->c/c++ Complier->system里面改大!! 2、为假相,是你的仿真器或者目标板出问题。仿真器在读取寄存器的值的时候出现问题。读过来的数据错误!! 一般来说是第2种情况,第一种情况的话很少出现,除非传递结构体之类的大参数。” 回头仔细再看我的状态栏提示: “Tue Oct 07 14:26:39 2008: The stack 'CSTACK' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90.% ”     想想我的程序很小就那么几行,1024 byte怎么会不够用呢,况且我改成了2048byte仍然提示不够用!难道是真的如阿波所言这是一个假象?目标板有问题?不太可能吧?仿真器问题?我的仿真器可是最新d版 v6 jlink啊,不管怎么样试试看吧,首先怀疑st的芯片swd模式有问题和jlink有冲突,于是改为jtag模式…嗯,很好,问题消失了。换用st linkII,依然没有问题,不过,st的芯片不至于这么烂吧? 难道是jlink的swd模式有问题?更新jlink驱动为3.92a,再试,果然…嗯,只能说问题消失。似乎可以下结论了:jlink之前的驱动3.90d在swd模式下确实存在bug… …… ”  详情 回复 发表于 2012-5-16 09:08
 
点赞 关注

回复
举报

424

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
详细描述描述啊!贴点代码什么的
 
 

回复

481

帖子

0

TA的资源

纯净的硅(中级)

板凳
 

回复 沙发 鸵鸟蝈蝈 的帖子

SD_CS_LOW();       
   SD_CheckVoltage();
  
   ret = SD_ReadOCR(recbuf);    // 读OCR寄存器,查询卡支持的电压值

SD_ReadOCR(recbuf)的函数体如下:
INT8U SD_ReadOCR(INT8U *recbuf)
{
  
  INT8U param[4] = {0, 0, 0, 0}, resp[5] = {1, 1, 1, 1, 1};
  INT8U tmp = 0;
   
  tmp = SD_SendCmd(CMD58, param, CMD58_R, resp);                  
  if (tmp != SD_NO_ERR)               
  {
       return tmp;       
        
  }                                                                                               
  if (resp[0] != 0x80)
  {
   
   return SD_ERR_CMD_RESP;       
   
  }
  
  for (tmp = 0; tmp < 4; tmp++)
  {
   
   recbuf[tmp] = resp[tmp + 1];                                                  
  }
   
  return SD_NO_ERR;
  
}

当我单步进入SD_ReadOCR(recbuf)函数体后,SD_ReadOCR(recbuf)代码所在的flash全变成FF了还一部分其它的程序flash也变成FF了,这里我想贴图的,不知道怎么贴。而没进入这个函数前,代码区的内存都是正常的。
 
 
 

回复

400

帖子

0

TA的资源

五彩晶圆(中级)

4
 
应该是你程序跑飞了,检查下你的堆栈是否有溢出,
 
 
 

回复

5015

帖子

12

TA的资源

裸片初长成(初级)

5
 
原帖由 l0700830216 于 2012-2-24 11:06 发表 SD_CS_LOW(); SD_CheckVoltage(); ret = SD_ReadOCR(recbuf); // 读OCR寄存器,查询卡支持的电压值 SD_ReadOCR(recbuf)的函数体如下: INT8U SD_ReadOCR(INT8U *recbuf) { INT8U param[ ...
应该是代码跑飞了
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(中级)

6
 
溢出了
 
 
 

回复

481

帖子

0

TA的资源

纯净的硅(中级)

7
 

回复 4楼 Triton.zhang 的帖子

我把栈改到5K也都是这个样。
不过我把栈改到160时,通过IAR观察,进入这个函数时栈是没有用完的;而把栈改成5K后,进入这个函数后,栈是被100%使用了。
所以我觉得不是堆栈溢出。可能是全局变量溢出,但是我参看了全局变量也没到我RAM的一半(我RAM是16K的)。
 
 
 

回复

481

帖子

0

TA的资源

纯净的硅(中级)

8
 

回复 5楼 wstt 的帖子

是跑飞了,当是关键这是什么原因跑飞的。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

9
 

回复 7楼 l0700830216 的帖子

你好,我和你遇到了同样的问题,是什么原因,你知道吗? 你解决了吗,折磨了好久
看到你像是找到了救星
 
 
 

回复

481

帖子

0

TA的资源

纯净的硅(中级)

10
 

回复 9楼 liangchaoxi 的帖子

嘿嘿,真是不好意思。最近在忙着画板,没能及时给你回复。

具体原因是堆栈或全局变量溢出。

不过,可能你单纯的把堆栈改大是没用的,但是你可以试试。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

11
 

原帖由 l0700830216 于 2012-5-15 08:27 发表 嘿嘿,真是不好意思。最近在忙着画板,没能及时给你回复。 具体原因是堆栈或全局变量溢出。 不过,可能你单纯的把堆栈改大是没用的,但是你可以试试。

谢谢你的回答,我的单片机有16K的RAM 我设堆栈为2K,设为1K的时候堆栈没有溢出,所以堆栈溢出应该排除,接下来是全局变量溢出,全局变量溢出不应该提示堆栈溢出吧,好像应该提示变量太多,无法容纳。

 

你的问题当时是如何解决的,望指点呀~~~~~~~~

 

你是不是出于保密原因,不愿意回答我的问题?如果怕太多人看到的话,也可以给我发信件,谢谢你。

 
 
 

回复

481

帖子

0

TA的资源

纯净的硅(中级)

12
 

回复 11楼 liangchaoxi 的帖子

嘿嘿,你这设置堆栈为2K不能排除掉堆栈溢出的。我之前也是你这样想的,其实不是这样的。

这可能是IAR的一个bug还是430的bug。这其实就是堆栈溢出。

在这里需要声明一点,这个没有声明保不保密的。你这说到不愿回答你问题,是你想太多了。是我们这些搞研发的没有那么多时间,而我最近在忙一个项目,没时间看我之前提的一些问题,而且我们遇到的这个问题不是一两句话能说的清楚的。

在这个网站上我学到了很多东西,特别非常感激那些热心的人,我有时间一定会像他们学习,为网站会员解答我所知道的问题的,以此来回报这个网站。

你需要查看,你所用的变量有没有特别大的,或者结构体中有指针的,这些用malloc分配指点的堆给它使用。
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

13
 

原帖由 l0700830216 于 2012-5-15 13:17 发表 嘿嘿,你这设置堆栈为2K不能排除掉堆栈溢出的。我之前也是你这样想的,其实不是这样的。 这可能是IAR的一个bug还是430的bug。这其实就是堆栈溢出。 在这里需要声明一点,这个没有声明保不保密的。你这说到不愿 ...

呵呵,那我就放心了,嗯,很能体会你的忙。不过你说的堆栈溢出,我觉得应该是不可能的,因为我们堆栈设成1024的时候,反倒不会出现上面的现象。反而是调大的时候出现,所以我觉得堆栈溢出是可以排除的,我变量有个地方设的很大,是全局变量数组,一个地方是:
__no_init char  UART0_RX_BUF[400];       
__no_init char  UART0_Save_BUF[2][400];
一个地方是:
 UART3_RX_BUF[500];       
不过都是全局变量,所以应该不影响栈。
而且改小之后,问题没有解决,所以我又陷入了僵局
唉……

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

14
 

原帖由 liangchaoxi 于 2012-5-15 15:03 发表 呵呵,那我就放心了,嗯,很能体会你的忙。不过你说的堆栈溢出,我觉得应该是不可能的,因为我们堆栈设成1024的时候,反倒不会出现上面的现象。反而是调大的时候出现,所以我觉得堆栈溢出是可以排除的,我变量有个 ...

希望各位路过的人,能够一起齐心合力解决掉这个问题

 
 
 

回复

4008

帖子

0

TA的资源

版主

15
 
这个一般都是程序的问题,把代码贴上来看看
 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

16
 

原帖由 huo_hu 于 2012-5-16 01:33 发表 这个一般都是程序的问题,把代码贴上来看看

 

代码有60KB ……全贴上来不现实。另外会不会是仿真器的bug引起的,看看我发现一个帖子是有仿真器的bug引起的:http://hi.baidu.com/fpga_cpld/blog/item/17519c317a32e5ae5edf0ea9.html

 

“……

里面网友tsb0574 阿波给出了解释 “出现这个问题一般有两种情况!!
1
、确实是你的堆栈溢出了,在project->option->c/c++ Complier->system里面改大!!

2
、为假相,是你的仿真器或者目标板出问题。仿真器在读取寄存器的值的时候出现问题。读过来的数据错误!! 一般来说是第2种情况,第一种情况的话很少出现,除非传递结构体之类的大参数。”

回头仔细再看我的状态栏提示:

Tue Oct 07 14:26:39 2008: The stack 'CSTACK' is filled to 100% (1024 bytes used out of 1024). The warning threshold is set to 90.%

    想想我的程序很小就那么几行,1024 byte怎么会不够用呢,况且我改成了2048byte仍然提示不够用!难道是真的如阿波所言这是一个假象?目标板有问题?不太可能吧?仿真器问题?我的仿真器可是最新dv6 jlink啊,不管怎么样试试看吧,首先怀疑st的芯片swd模式有问题和jlink有冲突,于是改为jtag模式…嗯,很好,问题消失了。换用st linkII,依然没有问题,不过,st的芯片不至于这么烂吧? 难道是jlinkswd模式有问题?更新jlink驱动为3.92a,再试,果然嗯,只能说问题消失。似乎可以下结论了:jlink之前的驱动3.90dswd模式下确实存在bug…

……

 
 
 

回复

481

帖子

0

TA的资源

纯净的硅(中级)

17
 

回复 16楼 liangchaoxi 的帖子

按他这种说法,你应该换一款仿真器试试的。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表