搜索
bottom↓
回复: 5

lpc2368RAM的缩减问题,请教!

[复制链接]

出0入0汤圆

发表于 2014-9-17 15:07:10 | 显示全部楼层 |阅读模式
我最近在使用lpc2368片子,在用二分法查找nan flash中历史记录的应用中出现了这样的问题,二分法查找子函数中我定义了个130字节的数组,
程序每次调用这函数2~3次就直接跑到PAbt_Handler    B       PAbt_Handler。把该数组定义为全局变量后,一切正常,这个该怎么理解!虽然
现在问题解决了,可是......! 目前整个工程RAM占用了23K, 该片中32K ram的。请大侠们帮我分析下!
  1. ulong Left_check(uchar flag,uchar *key,ulong *low,ulong *high,uchar *outstatus)
  2. {
  3.         ulong low_addr =0,high_addr =0,mid_addr =0;
  4. //         uchar Tbuf[2][130];    //此处变量一定要定义为全局,为什么??????????????
  5.         ulong mid =0;
  6.         *outstatus=0;
  7.         WDTFeed();
  8.         memset(Tbuf,0,sizeof(Tbuf));

  9.         low_addr =  *low%CREC_MAX_NUM;
  10.         high_addr = *high%CREC_MAX_NUM;
  11.        

  12.         mid_addr = (low_addr + high_addr)/2;
  13.        
  14.         if(mid_addr == 0 || low_addr == high_addr)
  15.                 return mid_addr;
  16.         mid = mid_addr%CREC_MAX_NUM; //相对位置
  17.        
  18.         if(mid > 0)
  19.         {
  20.                 crec_get_zerostart(mid+1,Tbuf[0]);
  21.                 crec_get_zerostart(mid,Tbuf[1]);
  22.                 if(memcmp(Tbuf[0]+4,"\x83\x00",2)!=0 || memcmp(Tbuf[1]+4,"\x83\x00",2)!=0)
  23.                         goto label1;
  24.                 time1 = timestr2long(&Tbuf[0][12]);
  25.                 time2 = timestr2long(&Tbuf[1][12]);
  26.                 time3 = timestr2long(key+1);
  27.                 if((time1 > time3 && time2 < time3) || time2 == time3)
  28.                 {                       
  29.                         *outstatus = 1;
  30.                         *((char *)&mid_addr+LONG_HIGH3)=Tbuf[0][18];                                //终端交易流水号
  31.                         *((char *)&mid_addr+LONG_HIGH2)=Tbuf[0][19];
  32.                         *((char *)&mid_addr+LONG_HIGH1)=Tbuf[0][20];
  33.                         *((char *)&mid_addr+LONG_HIGH0)=Tbuf[0][21];                               
  34.                         return mid_addr;
  35.                 }
  36.                 else if(time1 == time3)
  37.                 {                       
  38.                         *outstatus = 1;
  39.                         *((char *)&mid_addr+LONG_HIGH3)=Tbuf[0][18];                                //终端交易流水号
  40.                         *((char *)&mid_addr+LONG_HIGH2)=Tbuf[0][19];
  41.                         *((char *)&mid_addr+LONG_HIGH1)=Tbuf[0][20];
  42.                         *((char *)&mid_addr+LONG_HIGH0)=Tbuf[0][21];                               
  43.                         return (mid_addr+1);
  44.                 }
  45.                        
  46.         }
  47.         if(time2 > time3)    //左移       
  48.         {               
  49. label1:               
  50.                 *low =low_addr;
  51.                 *high =mid_addr;
  52.     return 1;
  53.         }
  54.         else                                       //右移               
  55.         {
  56.                 *low =mid_addr;
  57.                 *high =high_addr;       
  58.     return 2;               
  59.         }
  60. }
复制代码

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2014-9-17 15:13:44 | 显示全部楼层
局部变量暂存在堆栈里面,你确定你的堆栈大小够?

出0入0汤圆

发表于 2014-9-17 15:26:43 | 显示全部楼层
你那个数组很大,有2x130=260byte 放堆栈里头,确实不合适

出0入0汤圆

 楼主| 发表于 2014-9-17 16:59:02 | 显示全部楼层
Cavsle 发表于 2014-9-17 15:26
你那个数组很大,有2x130=260byte 放堆栈里头,确实不合适

别的子函数我用过更大的数组

出0入0汤圆

 楼主| 发表于 2014-9-19 13:10:32 | 显示全部楼层
USR_Stack_Size  EQU     0x00001800        
这个还不够吗?

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-5-19 14:59

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

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