Transcript Chapter 6

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