找回密码
 立即注册

QQ登录

只需一步,快速开始

打印 上一主题 下一主题
开启左侧

[M051] 全局变量 数组定义过大 单片机异常

[复制链接]
跳转到指定楼层
楼主
gcxzhz 发表于 2014-3-24 23:19:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原帖见   http://bbs.21ic.com/icview-700722-1-1.html
只要数组总的元素的个数大于某个值,不管是几个数组 roll_left(unsigned int ×p,unsigned int size); 一搞进去单片机就异常,即使将数组分成几个 分别运行也不行啊
主函数
int main(void)
{  
   
     SYS_Init();    //初始化
     IO_Init();
     P1->DOUT = 0;   //点亮上下显示的蓝灯
       delaytime=65535;
    while(    delaytime--);

            while(1)
        {
      P2->DOUT = 0xff;
          P0->DOUT = 0xff;
          delaytime=65535;
            while(    delaytime--);
            while(1)
            {
   
                //下面是花样显示函数
        //函数都是经过测试,按照自己预期的结果运行的
          roll_up(wfcsu1,wfcsu1_size);
          flash(wfcsu1,wfcsu1_size);
          roll_left(wfcsu,wfcsu_size);                //wfcsu是个数组  wfcsu_size是数组大小   以下同样
        roll_left(wfcsu5,wfcsu5_size);
         roll_left(wfcsu1,wfcsu1_size);
        }
    }        
}
   

上面是主函数   最下面3行 单独运行其中任何一个都没问题   数组定义为 uint16_t   wfcsu[] ={ /*元素个数超过1280个,芯片就异常,即使定义多个数组,数组中总的元素的个数大于1280个,芯片仍然异常*/}
芯片用的是 M0516LBN  ldrom 4k  ram 4k aprom 64k   data 4k
运行roll_left(wfcsu,wfcsu_size);               
        roll_left(wfcsu5,wfcsu5_size);
因为wfcsu5_size+wfcsu_size >1280 数组了不行
运行roll_left(wfcsu,wfcsu_size);               
        roll_left(wfcsu1,wfcsu1_size);
  或  
运行roll_left(wfcsu1,wfcsu1_size);               
        roll_left(wfcsu5,wfcsu5_size);
因为wfcsu5_size+wfcsu1_size<1280
       wfcsu_size+wfcsu1_size<1280  都可以正常运行

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 顶 踩
回复

使用道具 举报

沙发
admin 发表于 2014-3-25 09:49:04 | 只看该作者
芯片 总共4kB RAM 你uint16_t   wfcsu[] 就占 2.5K 应该是内存溢出。
牛卧堂
回复 支持 反对

使用道具 举报

板凳
 楼主| gcxzhz 发表于 2014-3-25 10:49:56 | 只看该作者
admin 发表于 2014-3-25 09:49
芯片 总共4kB RAM 你uint16_t   wfcsu[] 就占 2.5K 应该是内存溢出。

那如何解决这个问题  就是说如何将 数组存储在rom中呢 单片机用的时候直接调用就行
回复 支持 反对

使用道具 举报

地板
admin 发表于 2014-3-25 11:29:33 | 只看该作者
静态的数据 比较多的时候 是要写在ROM区
牛卧堂
回复 支持 反对

使用道具 举报

5#
 楼主| gcxzhz 发表于 2014-3-25 22:58:38 | 只看该作者
如何写在rom区呢?   有没有其他方法
我是这样解决的  const uint16_t   wfcsu[]  
在函数中roll_left((uint16_t *)wfcsu,wfcsu_size);  
运行后没有问题  除了上面的方法还有没有其他的方法??
回复 支持 反对

使用道具 举报

6#
admin 发表于 2014-3-26 08:38:45 | 只看该作者
加上const 修饰符将放置在只读区域
牛卧堂
回复 支持 反对

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

新唐MCU