Difference between revisions of "Const and volatile type qualifiers"
From Teknologisk videncenter
m (→Example 1) |
m (→Example 1) |
||
Line 11: | Line 11: | ||
unsigned int volatile * const uartreg = (unsigned int *) 0x40000; | unsigned int volatile * const uartreg = (unsigned int *) 0x40000; | ||
− | *uartreg |= | + | *uartreg = 0x80000000; // Assign 80000000 to the 32 bit register located at memeory address 0x40000 |
+ | ...some code... | ||
+ | *uartreg |= 0x1 // *uartreg's contents is OR'et to 0x1. New contents = 0x80000001 | ||
</source> | </source> | ||
Revision as of 11:10, 31 August 2011
const
const means that something is not modifiable, so a data object that is declared with const as a part of its type specification must not be assigned to in any way during the run of a program.
volatile
The use of volatile ensures that the compiler always carries out the memory accesses, rather than optimizing them out (for example if the access is in a loop).
Memorymapped access to a register
Example 1
In the example below the register 32 bit register located in memory at address 0x40000 can be accessed through the uartreg pointer.
unsigned int volatile * const uartreg = (unsigned int *) 0x40000;
*uartreg = 0x80000000; // Assign 80000000 to the 32 bit register located at memeory address 0x40000
...some code...
*uartreg |= 0x1 // *uartreg's contents is OR'et to 0x1. New contents = 0x80000001