首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

关于全局变量和局部变量的问题

关于全局变量和局部变量的问题

我想在程序中做一个256位的表,
当我把它定义为全局变量时,
错误显示:
L1102:Out of allocation space in segment Z_RAM at address 0x90;
当我把它定义为局部变量时,编译能通过,但程序不能运行,仿真时提示:
Error: Attempt to push or pop with SP out of allowed range
[em26][em26][em26][em26][em26][em26][em26]
请先了解Z_RAM 的定义,不要胡乱写个程序出来!
我的E文不好,请大虾帮帮忙啦,我的程序在这里: #include /* for EnableInterrupts macro */ #include /* include peripheral declarations */ #define Enable EnableInterrupts #define Disable DisableInterrupts unsigned int RT; unsigned char RTtmp; unsigned char count; unsigned char addr; unsigned char value; unsigned char Code[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x00,0xC6,0x40,0x46,0x8E}; void sysinit(void) { Disable; CONFIG1=0X01; DDRB=0xFF; PTB=0x00; DDRD=0xF0; PTD=0x00; ADICLK=0x70; ADSCR=0x28; } void delay(void) { unsigned int i; for(i=0;i<100;i++); } void Sendled(addr,value) { switch(addr) { case 1: PTD=0XE0; PTB=Code[value]; break; case 2: PTD=0XD0; PTB=Code[value]; break; case 3: PTD=0XB0; PTB=Code[value]; break; case 4: PTD=0X70; PTB=Code[value]; break; } } void Displayled(void) { Sendled(1,RT/1000%10); delay(); Sendled(2,RT/100%10); delay(); Sendled(3,RT/10%10); delay(); Sendled(4,RT%10); delay(); } void main(void) { sysinit(); delay(); Enable; while(1) { unsigned char TMP[]={0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc, 100,100,100,100,100,100,100,100,100,100,//11-20 100,100,100,100,100,100,100,100,100,100,//21-30 100,100,100,100,100,100,100,100,100,100,//31-40 100,99,98,97,96,95,94,93,92,91,//50 90,89,88,87,86,85,85,84,86,82,//60 81,81,80,79,79,78,77,77,76,75,//70 74,74,73,72,71,71,70,69,69,68,//80 68,67,67,66,66,65,65,64,64,63,//90 62,62,61,61,60,60,59,59,58,57,//100 57,56,56,55,55,54,54,53,53,52,//110 52,51,51,50,50,49,49,48,48,48,//120 47,47,46,46,45,45,44,44,43,43,//130 42,42,42,41,41,40,40,40,39,39,//140 38,38,37,37,36,36,35,35,34,34,//150 33,33,32,32,31,31,31,30,30,30,//160 28,28,27,27,26,26,25,25,24,24,//170 23,23,22,22,20,20,19,19,18,18,//180 17,17,16,16,15,15,14,14,13,13,//190 12,12,11,11,10,10, 9, 9, 8, 8,//200 7, 7, 6, 6, 5, 5, 4, 4, 3, 3,//210 2, 2, 1, 1, 1, //215 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,//225 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,//235 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,//245 0, 0, 0, 0, 0,0xcc,0xcc,0xcc,0xcc,0xcc //255 }; __RESET_WATCHDOG(); Displayled(); count++; if(count==20) { count=0; RT=TMP[ADR]; } } }
是你的存储空间分配的问题,和你的程序没有关系。
还是按二楼说的做,先把存储空间分配对了
还是按三楼说的,看清楚你自己的程式和單晶片的要求,不要胡乱写一大堆程式來測試編程器.聲明的格式也不大對.能否先看看C語言入門呢?[em24]
哎呀,竟然有人还这样说明他的程序。
大家都说了,出错的原因和你的C程序无关,是在于你的存储区大小的分配,即PRM文件中的定义。Z-RAM哪有256BYTES呢,你把Z-RAM定义得小些,把变量扔到非零区吧。堆栈也没那么大呀。
我昏~~
学后而问

[讨论]

樓上老兄不說还不知道,JK3那有256 byte RAM呢?把Z-RAM定义得小些也不能解决问题,只不過是自欺欺人的方案,最終问题是在程式变量聲明要減少一些,所有变量加堆栈不能大於128 byte. 那麽就不用昏了~~. [em20]
这么多得常数,何必非要放在数据区呢,放到程序区会更好吧

[建议][分享]

其本上胡乱写出來的程序,不應該貼出來讨论,8808beter說得對,竟然还有人認真的这样说明他的程序o不氣昏才怪呢?
返回列表