程序编译后地址空间占用一头一尾;数组初始化不完整,出现Resricted Memory
我用的是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要存多套程序,所以要求各程序占用的地址空间连续。
另一问题是,当在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。 最后是我的一各小程序,也出现了上述问题。请高手指教啊! 图1: 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 ----------|------------------------------------|---------------|--------------
图2: 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 ----------|------------------------------------|---------------|-------------- #include <pic18.h> #include <pic18fxx22.h>
void Init_SP2539(void); void delay(unsigned int i); void sciint(void); void Send_Char(unsigned char data); volatile unsigned char data[64]; unsigned char data1[1500]={0}; unsigned char temp; void main () { unsigned char i=0; unsigned char j=0; sciint();//SCI部件初始化子程序 delay(1400); Init_SP2539(); delay(1000); while(1) { while(RC1IF==0); //接收数据 data=temp=RCREG1; while(TRMT==0); //将接收的数据发送出去 TXREG1=data; if(i==64) break;i++; delay(100); } } void Init_SP2539() { RC5=1; RC4=0; RC3=1; delay(40); TXREG1=0X04; //禁止看门狗 delay(40); TXREG1=0X15; //子串口2波特率加倍,并禁止子串口3收发数据 delay(40); TXREG1=0x23; //置子串口2波特率分频系数为1 delay(40); //发送地址为010B,选择子串口2 RC5=0; RC4=1; RC3=0; RC2=0; RC1=1; RC0=0; } void delay(unsigned int i) { while(i--); } void sciint(void) { //TRISC6=0; //RC6 为TX //TRISC7=1; //RC7 为RX TRISC=TRISC|0X47; //RC0,RC1,RC2,RC7置1,设置为输入 TRISC=TRISC&0X47; //RC3,RC4,RC5,RC6置0,设置为输出 SPBRG1=16; //波特率为9600 TXSTA=0x24;//0010 0100 异步高速方式传输8bit数据 RCSTA=0x80;//1000 0000 SPEN=1;允许串行口工作 TXEN=1; //允许发送 CREN=1; //允许数据接受 PIR1=0X00; PIE1=PIE1|0X20; RC1IP=1; //INTCON=0;//清中断 } void Send_Char(unsigned char data) { while(!TX1IF); TXREG1=data; delay(250); }
|