Chapter 6 - Memory How to allocate variables and constants in RAM and FLASH memory Strings.c Example /* ** Strings */ #include <p32xxxx.h> #include <string.h> // 1. variable declarations const char a[] = "Exploring the PIC32"; char b[100] = "Initialized"; // 2. main program main() { strcpy( b, "MPLAB C32"); // assign new content to b } // main Di Jasio - Programming 32-bit Microcontrollers in C Using the Watch Window Di Jasio - Programming 32-bit Microcontrollers in C Setting the Watch Properties Di Jasio - Programming 32-bit Microcontrollers in C String “b” after C0 initialization Di Jasio - Programming 32-bit Microcontrollers in C Disassembly Listing 14: 15: 16: 9D000018 9D00001C 9D000020 9D000024 17: 9D000028 9D00002C 9D000030 9D000034 9D000038 9D00003C 18: 9D000040 9D000044 9D000048 9D00004C 9D000050 9D000054 27BDFFE8 AFBF0014 AFBE0010 03A0F021 3C02A000 24440000 3C029D00 2445074C 0F400016 00000000 03C0E821 8FBF0014 8FBE0010 27BD0018 03E00008 00000000 // 2. main program main() { addiu sp,sp,-24 sw ra,20(sp) sw s8,16(sp) addu s8,sp,zero strcpy( b, "MPLAB C32"); lui v0,0xa000 addiu a0,v0,0 lui v0,0x9d00 addiu a1,v0,1868 jal 0x9d000058 nop } // main addu sp,s8,zero lw ra,20(sp) lw s8,16(sp) addiu sp,sp,24 jr ra nop Di Jasio - Programming 32-bit Microcontrollers in C // assign new content to b Looking at the “Map” C:/Program Files/Microchip/../pic32mx/lib\libc.a(strcpy.o) Strings.o (strcpy) Memory Configuration Name Origin kseg0_program_mem 0x9d000000 kseg0_boot_mem 0x9fc00490 exception_mem 0x9fc01000 kseg1_boot_mem 0xbfc00000 debug_exec_mem 0xbfc02000 config3 0xbfc02ff0 config2 0xbfc02ff4 config1 0xbfc02ff8 config0 0xbfc02ffc kseg1_data_mem 0xa0000000 sfrs 0xbf800000 *default* 0x00000000 Di Jasio - Programming 32-bit Microcontrollers in C Length 0x00080000 0x00000970 0x00001000 0x00000490 0x00000ff0 0x00000004 0x00000004 0x00000004 0x00000004 0x00008000 0x00100000 0xffffffff Attributes xr w !x Memory Map Sections .reset section, containing the code that will be placed by the linker at the reset vector. This is normally filled with a default handler (_reset()). .reset 0xbfc00000 0x10 C:/.../pic32mx/lib/crt0.o 0xbfc00000 _reset .vector_x sections, there are 64 of them each associated to the corresponding interrupt handler. They will be empty unless your program is using the specific interrupt handler. .vector_0 0x9fc01200 0x0 .startup section, where the C0 initialization code is placed. .startup 0x9fc00490 0x1e0 C:/.../lib/crt0.o .text sections, you will find many of them, where all the code generated by the MPLAB C32 compiler from your source files is placed. Here is the specific part produced by our main() function: .text 0x9d000018 0x40 Strings.o 0x9d000018 main .rodata section, where read only (constant) data is placed in program memory space. Here we can find space for our constant string “a” for example: .rodata 0x9d000738 0x20 Strings.o 0x9d000738 a .data section, where RAM memory is allocated for global variables. .data 0xa0000000 0x64 Strings.o 0xa0000000 b .data1 section, where the initialization value, ready for the C0 code to load into the “b” variable is placed, once more, in program memory space. *(.data1) 0x9d00076c _data_image_begin=LOADADDR(data) Di Jasio - Programming 32-bit Microcontrollers in C The Memory Window Address 00 04 08 0C ASCII 1D00_0760 9D0003AC 9D0004F4 9D000578 74696E49 ........ x...Init 1D00_0770 696C6169 0064657A 00000000 00000000 ialized. ........ Di Jasio - Programming 32-bit Microcontrollers in C Pointers int *pi; int i; int a[10]; // define a pointer to an integer // index/counter // the array of integers // 1. sequential access using array indexing for( i=0; i<10; i++) a[ i] = i; // 2. sequential access using a pointer pi = a; for( i=0; i<10; i++) { *pi = i; pi++; } Di Jasio - Programming 32-bit Microcontrollers in C Advanced Material Fixed Translation Map User and Kernel Virtual Memory Maps The PIC32 Fixed Translation Map Di Jasio - Programming 32-bit Microcontrollers in C Phisical Addressing Space RAM 0x00000000 FLASH 0x1D000000 Di Jasio - Programming 32-bit Microcontrollers in C S F R 0x1F800000 B O O T 0x1FC00000 0xFFFFFFFF RAM Partitioning Kernel RAM (Data) 0x00000000 Kernel RAM (Prog) BMXDKDBA Di Jasio - Programming 32-bit Microcontrollers in C User RAM (Data) BMXDUDBA 0xBF000000+ BMXDUDBA User RAM (Prog) 0xBF000000+ BMXDUPBA 0xFFFFFFFF User Mode Virtual Memory Map User Space 0x00000000 Kernel Space 0x80000000 User FLASH User RAM (Data) User RAM (Prog) 0x7F000000+ BMXDUPBA 0x7D000000 0x7F000000+ BMXDUDBA Di Jasio - Programming 32-bit Microcontrollers in C Generate an immediate exception if access is attempted! 0xFFFFFFFF Kernel Mode Virtual Memory Map User Space Kernel Space RAM (Data) 0x00000000 RAM (Prog) 0x80000000 0x80000000+ BMXDKPBA Di Jasio - Programming 32-bit Microcontrollers in C FLASH Cached (Kseg0) 0x9D000000 FLASH UnCached (Kseg1) 0xBD000000 S F R 0xBF800000 B O O T 0xFFFFFFFF 0xBFC00000