程序编译后地址空间占用一头一尾;数组初始化不完整,出现Resricted Memory<br /><br />我用的是MPLAB V7.50和HI-TECH 的PICC18 V9.50,芯片是18F6527。当在Project的PICC-18 Linker中不设置Specify offset for ROM时,编译后的地址空间如图1所示,程序占用了地址空间的一头一尾;而如果给Specify offset for ROM设置一便宜量时(例如0x40)编译后占用的地址空间如图2所示,这是为什么呢?我的所有程序都会出现这样的问题。而在MPLAB V7.30和HI-TECH 的PICC18 V8.35中却不出现这样的问题。因为我的FLASH要存多套程序,所以要求各程序占用的地址空间连续。<br /><br /> 另一问题是,当在Project 的Global中设置 Complie for MPLAB ICD时,数组data[64]和data1[1500]、data1[512]都能初始化;而不设置Complie for MPLAB ICD时,数组data1[1500]只能初始化到data[1456];而将data1[1500]长度设置为512时,只能只能初始化到data[469];设置长度为64时,只能初始化到data[20],等等;并且data1最后能初始化成功的地址都是EF3。<br /> 最后是我的一各小程序,也出现了上述问题。请高手指教啊!<br />图1:<br />Psect Usage Map: Psect | Contents | Memory Range | Size ----------|------------------------------------|---------------|-------------- init | Initialization code | 0000h - 003Bh | 60 bytes end_init | Initialization code | 003Ch - 003Fh | 4 bytes text | Program and library code | B6AAh - B7A3h | 250 bytes ibigdata | Large initialized RAM variables (R | B7A4h - BD7Fh | 1500 bytes ----------|------------------------------------|---------------|-------------- param | Parameter auto blocks | 00FDh - 00FFh | 3 bytes | | | bigdata | Large initialized RAM variables | 08D7h - 0EB2h | 1500 bytes bigbss | Large RAM variables | 0EB3h - 0EF3h | 65 bytes | | | temp | Temporary RAM data | 0000h - 0001h | 2 bytes ----------|------------------------------------|---------------|--------------<br /><br />图2:<br />Psect Usage Map: Psect | Contents | Memory Range | Size ----------|------------------------------------|---------------|-------------- init | Initialization code | 0040h - 0079h | 58 bytes end_init | Initialization code | 007Ah - 007Dh | 4 bytes ibigdata | Large initialized RAM variables (R | 007Eh - 0659h | 1500 bytes text | Program and library code | 065Ah - 0753h | 250 bytes ----------|------------------------------------|---------------|-------------- param | Parameter auto blocks | 00FDh - 00FFh | 3 bytes | | | bigdata | Large initialized RAM variables | 08D7h - 0EB2h | 1500 bytes bigbss | Large RAM variables | 0EB3h - 0EF3h | 65 bytes | | | temp | Temporary RAM data | 0000h - 0001h | 2 bytes ----------|------------------------------------|---------------|-------------- <br />#include <pic18.h><br />#include <pic18fxx22.h><br /><br />void Init_SP2539(void);<br />void delay(unsigned int i);<br />void sciint(void);<br />void Send_Char(unsigned char data);<br />volatile unsigned char data[64];<br />unsigned char data1[1500]={0};<br />unsigned char temp;<br />void main ()<br />{ <br /> unsigned char i=0;<br /> unsigned char j=0; <br /> sciint();//SCI部件初始化子程序<br /> delay(1400);<br /> Init_SP2539();<br /> delay(1000);<br /> while(1)<br /> {<br /> while(RC1IF==0); //接收数据<br /> data=temp=RCREG1;<br /> while(TRMT==0); //将接收的数据发送出去<br /> TXREG1=data;<br /> if(i==64) break;i++;<br /> delay(100);<br /> } <br />}<br />void Init_SP2539()<br />{ <br /> RC5=1;<br /> RC4=0;<br /> RC3=1;<br /> delay(40);<br /> TXREG1=0X04; //禁止看门狗<br /> delay(40);<br /> TXREG1=0X15; //子串口2波特率加倍,并禁止子串口3收发数据<br /> delay(40);<br /> TXREG1=0x23; //置子串口2波特率分频系数为1<br /> delay(40);<br /> //发送地址为010B,选择子串口2<br /> RC5=0;<br /> RC4=1;<br /> RC3=0;<br /> RC2=0;<br /> RC1=1;<br /> RC0=0;<br />}<br />void delay(unsigned int i)<br />{<br /> while(i--);<br />}<br />void sciint(void)<br />{ <br /> //TRISC6=0; //RC6 为TX<br /> //TRISC7=1; //RC7 为RX<br /> TRISC=TRISC|0X47; //RC0,RC1,RC2,RC7置1,设置为输入<br /> TRISC=TRISC&0X47; //RC3,RC4,RC5,RC6置0,设置为输出<br /> SPBRG1=16; //波特率为9600<br /> TXSTA=0x24;//0010 0100 异步高速方式传输8bit数据<br /> RCSTA=0x80;//1000 0000 SPEN=1;允许串行口工作<br /> TXEN=1; //允许发送<br /> CREN=1; //允许数据接受<br /> PIR1=0X00;<br /> PIE1=PIE1|0X20;<br /> RC1IP=1;<br /> //INTCON=0;//清中断<br />}<br />void Send_Char(unsigned char data)<br />{<br /> while(!TX1IF);<br /> TXREG1=data;<br /> delay(250); <br />}<br /> |
|