牛卧堂MCU技术交流
标题:
全局变量 数组定义过大 单片机异常
[打印本页]
作者:
gcxzhz
时间:
2014-3-24 23:19
标题:
全局变量 数组定义过大 单片机异常
原帖见
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 都可以正常运行
作者:
admin
时间:
2014-3-25 09:49
芯片 总共4kB RAM 你uint16_t wfcsu[] 就占 2.5K 应该是内存溢出。
作者:
gcxzhz
时间:
2014-3-25 10:49
admin 发表于 2014-3-25 09:49
芯片 总共4kB RAM 你uint16_t wfcsu[] 就占 2.5K 应该是内存溢出。
那如何解决这个问题 就是说如何将 数组存储在rom中呢 单片机用的时候直接调用就行
作者:
admin
时间:
2014-3-25 11:29
静态的数据 比较多的时候 是要写在ROM区
作者:
gcxzhz
时间:
2014-3-25 22:58
如何写在rom区呢? 有没有其他方法
我是这样解决的 const uint16_t wfcsu[]
在函数中roll_left((uint16_t *)wfcsu,wfcsu_size);
运行后没有问题 除了上面的方法还有没有其他的方法??
作者:
admin
时间:
2014-3-26 08:38
加上const 修饰符将放置在只读区域
欢迎光临 牛卧堂MCU技术交流 (http://nuvoton-mcu.com/)
Powered by Discuz! X3.2