The #pragma memory RAM directives in the Device Header File describe to the compiler where RAM is available for allocating variables. Several #pragma memory RAM directives are required, because either the RAM is not contiguous, or is accessed in different ways. Variables are placed in the RAM areas starting from the area specified by the first #pragma memory RAM directive.
Use the listing file to determine where the compiler has allocated a variable.
Figure 5-1. determining the variable address var1.lst
#pragma option RAMMAP 0008 0010 unsigned int arr[16]; /* 0x10 bytes at address 0x008 */ void main(void) { 077F unsigned int i; /* allocated at address 0x7ff */ 0200 DF 07 LD S,#007 for(i=0;i<sizeof(arr);i++) 0202 BC 7F 00 LD 077F,#00 { 0205 DF 07 LD S,#007 arr[i]=i; 0207 9D 7F LD A,077F 0209 94 08 ADD A,#008 020B 9C FC X A,X 020D 9D 7F LD A,077F 020F DF 00 LD S,#000 0211 B6 X A,[X] } 0212 9F 7F LD B,#07F 0214 DF 07 LD S,#007 0216 A6 X A,[B] 0217 8A INCA 0218 A6 X A,[B] 0219 98 10 LD A,#010 021B 83 IFGT A,[B] 021C E8 JP 00205 021D FF JP 0021D while(1); }
The declaration in the listing file will show the address of the variable in the left column. The symbol table entry will list the address of all global variables. If the RAM usage map is enabled with the #pragma option RAMMAP directive, then the listing file will contain the address, type and scope of all variables.
Figure 5-2. the RAM USAGE MAP var1.lst
RAM USAGE MAP 0000 __longIX signed long 0002 __longAC signed long 00FE BREG unsigned char 00FC X portrw 00FD SP portrw 00FE B portrw 00FF S portrw 0090 PORTE portrw 0090 PORTED portrw 0091 PORTEC portrw 0092 PORTEP portr 0094 PORTF portrw 0094 PORTFD portrw 0095 PORTFC portrw 0096 PORTFP portr 00A0 PORTA portrw 00A0 PORTAD portrw 00A1 PORTAC portrw 00A2 PORTAP portr 00A4 PORTB portrw 00A4 PORTBD portrw 00A5 PORTBC portrw 00A6 PORTBP portr 00AD TINTA portr 00AE TINTB portr 00AF HSTCR portrw 00D0 PORTL portrw 00D0 PORTLD portrw 00D1 PORTLC portrw 00D2 PORTLP portr 00D4 PORTG portrw 00D4 PORTGD portrw 00D5 PORTGC portrw 00D6 PORTGP portr 00D8 PORTC portrw 00D8 PORTCD portrw 00D9 PORTCC portrw 00DA PORTCP portr 00DC PORTD portrw 00DC PORTDD portrw 00EE CNTRL portrw 00EF PSW portrw 00E8 ICNTRL portrw 00EA TMRLO portrw 00EB TMRHI portrw 00EC T1RALO portrw 00ED T1RAHI portrw 00E6 T1RBLO portrw 00E7 T1RBHI portrw 00C6 T2CNTRL portrw 00C0 TMR2LO portrw 00C1 TMR2HI portrw 00C2 T2RALO portrw 00C3 T2RAHI portrw 00C4 T2RBLO portrw 00C5 T2RBHI portrw 00B6 T3CNTRL portrw 00B0 TMR3LO portrw 00B1 TMR3HI portrw 00B2 T3RALO portrw 00B3 T3RAHI portrw 00B4 T3RBLO portrw 00B5 T3RBHI portrw 00E9 SIOR portrw 00CF ITMR portrw 00CB ENAD portrw 00CD ADRSLTL portrw 00CC ADRSLTH portrw 00A8 ISPAD portrw 00A8 ISPADLO portrw 00A9 ISPADHI portrw 00AA ISPRD portrw 00AB ISPWR portrw 00E1 PGMTIM portrw 00E2 ISPKEY portrw 00B8 TBUF portrw 00B9 RBUF portrw 00BA ENU portrw 00BB ENUR portrw 00BC ENUI portrw 00BD BAUD portrw 00BE PSR portrw 00C7 WDSVR portrw 00C8 LWKEDG portrw 00C9 LWKEN portrw 00CA LWKPND portrw 0008 arr unsigned char[16] 077F i unsigned char 0200 021D
The RAM map has four columns. Each line of the RAM usage map contains the variable's address, name and type. If the variable has local scoping, the address range in which the variable is valid is also listed.