-
Notifications
You must be signed in to change notification settings - Fork 0
tutorial memory
Computer memory is organized as a continuous block of addresses index by an integer. These integers are typically 32-bit (for 32-bit systems such as ARM Cortex M4 and x86) or 64-bit (for 64 bit systems such as x86-64).
Description | Address Range |
---|---|
Flash ROM | 0x0000.0000 - 0x0003FFFF |
(empty) | 0x0004.0000 - 0x1FFF.FFFF |
RAM | 0x2000.0000 - 0x2000.7FFF |
(empty) | 0x2000.8000 - 0x3FFF.FFFF |
I/O Ports | 0x4000.0000 - 0x400F.FFFF |
(empty) | 0x4010.0000 - 0xDFFF.FFFF |
Internal I/O | 0xE000.0000 - 0xE004.1FFF |
As you can see, the same set of 32-bit addresses are used by not just the RAM and ROM, but also by I/O. This is called memory mapped I/O.
A pointer is an integer that specifies a location in memory. Since the TM4C is a 32-bit system, pointers on the TM4C are 32-bit integers that specify a memory location.
In C, we use *
to indicate pointer dereferencing, and &
to fetch the pointer to a variable.
For example, consider the following code:
int x;
x = 10;
int *y;
y = &x;
int **z;
z = &y;
Let's look at the memory. To simplify the diagram, assume we are looking only at the last 8 bits of the memory address.
Address | Contents | Description |
---|---|---|
0xF0 | 0x00 | x (second 8 bits) |
0xF1 | 0x01 | x (first 8 bits) |
0xF2 | ... | y (bits 24-31) |
0xF3 | ... | y (bits 16-23) |
0xF4 | ... | y (bits 8-15) |
0xF5 | 0xF0 | y (bits 0-7) |
0xF6 | ... | z (bits 24-31) |
0xF7 | ... | z (bits 16-23) |
0xF8 | ... | z (bits 8-15) |
0xF9 | 0xF2 | z (bits 0-7) |
First we declare an integer x. This is stored somewhere in memory. Here, we've put it into a memory address ending in 0xF0
.
Then, we declare *y
. Since *
indicates a pointer, int *y
means that we want ```y`` to be a pointer to an int.
Next, y
is set to &x
. &
refers to the location of a variable; therefore, we are putting the location of x
into y
. This gives y
the value of 0x______F0
.
Now, we declare int **z
. int *z
would be a pointer to an integer; however we have 2 *
s! This can be interpreted as int *(*z)
; that is, if *z
is a pointer to an integer, **z
is a pointer to a pointer to an integer.
When we set z = &y
, this means that z
points to y. This now sets z
to 0x______F2
.
This section under construction
A segmentation fault occurs when a program attempts to access memory that isn't owned by it. For example, by convention, the memory address 0x0
is always owned by the operating system; if you attempt to dereference 0x0
, you'll get a segmentation fault.
The TM4C has no operating system; you can access whatever you want. However, it does have many memory addresses that simply don't exist.
For example, if you attempt to access 0x4000.0000
, this memory address doesn't exist, and will create a hard fault. In order to handle this, a fault handler branches to an infinite loop.