EE 319K�Introduction to Embedded Systems
Lecture 6:�Pointers
Bard, Erez, Gerstlauer, Valvano, Holt, Yerraballi, Telang, Cuevas, Tiwari
6-1
Agenda
Bard, Erez, Gerstlauer, Valvano, Holt, Yerraballi, Telang, Cuevas, Tiwari
6-2
Pointers
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
uint16_t var,x;
uint16_t *pt;
int main(void){
pt = &var;
(*pt) = 1000;
x = (*pt);
while(1){
// what are the following?
(*pt)++; // good
x = *pt++; // bad
}
}
Declare
Initialize
Dereference
Pointer is an address used to refer to a variable (or array)
var
pt
Dereference
Run in simulator and show assembly
6-3
& operator
&var is the address of var
Binary & operator performs 32 bit wise logical ANDs
Binary && operator performs one Boolean AND
6-4
EE319K: Arrays using pointers
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
#define SIZE 100
uint8_t *Dpt3;
uint8_t Data3[SIZE];
void Debug3_Init(void){
Dpt3 = Data3;
}
void Debug3_Capture(uint8_t d){
if(Dpt3 < &Data3[SIZE]){
*Dpt3 = d;
Dpt3++;
}
}
Declare
Initialize
Dereference
6-5
EE319K: Arrays using pointers
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
#define SIZE 100
uint8_t *Dpt3;
uint8_t Data3[SIZE];
void Debug3_Init(void){
Dpt3 = Data3;
}
void Debug3_Capture(uint8_t d){
if(Dpt3 < &Data3[SIZE]){
(*Dpt3) = d;
Dpt3++;
}
}
AREA DATA
SIZE EQU 100
Dpt3 SPACE 4
Data3 SPACE SIZE
AREA |.text|
Debug3_Init
LDR R0,=Data3
LDR R1,=Dpt3
STR R0,[R1]
BX LR
Debug3_Capture
LDR R2,=Data3+SIZE
LDR R1,=Dpt3
LDR R3,[R1]
CMP R3,R2
BHS exit3
STRB R0,[R3],#1
STR R3,[R1]
exit3
BX LR
6-6
EE319K: Arrays using pointers
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
#define SIZE 100
uint32_t *Tpt4;
uint32_t Time4[SIZE];
void Debug4_Init(void){
Tpt4 = Time4;
}
void Debug4_Capture(void){
if(Tpt4 < &Time4[SIZE]){
(*Tpt4) = TIMER2_TAR_R;
Tpt4++;
}
}
AREA DATA
SIZE EQU 100
Tpt4 SPACE 4
Time4 SPACE SIZE*4
AREA |.text|
Debug4_Init
LDR R0,=Time4
LDR R1,=Tpt4
STR R0,[R1]
BX LR
Debug4_Capture
LDR R2,=Data4+SIZE*4
LDR R1,=Tpt4
LDR R3,[R1]
CMP R3,R2
BHS exit4
LDR R0,=TIMER2_TAR_R
LDR R12,[R0]
STR R12,[R3],#4
STR R3,[R1]
exit4 BX LR
6-7
EE319K: Stack
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
#define SIZE 100
uint32_t *Spt;
uint32_t Stack[SIZE];
void Stack_Init(void){
Spt = &Stack[SIZE];
}
void Stack_Push(uint32_t d){
if(Spt > Stack){
Spt--;
(*Spt) = d;
}
}
Declare
Initialize
Dereference
6-8
EE319K: Stack
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
#define SIZE 100
uint32_t *Spt;
uint32_t Stack[SIZE];
void Stack_Init(void){
Spt = &Stack[SIZE];
}
void Stack_Push(uint32_t d){
if(Spt > Stack){
Spt--;
(*Spt) = d;
}
}
AREA DATA
SIZE EQU 100
Spt SPACE 4
Stack SPACE SIZE*4
AREA |.text|
Stack_Init
LDR R0,=Stack+SIZE*4
LDR R1,=Spt
STR R0,[R1]
BX LR
Stack_Push
LDR R2,=Stack
LDR R1,=Spt
LDR R3,[R1]
CMP R3,R2
BLS exit5
SUB R3,R3,#4
STR R0,[R3]
STR R3,[R1]
exit5
BX LR
6-9
EE319K: Stack
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
#define SIZE 100
uint32_t *Spt;
uint32_t Stack[SIZE];
uint32_t Stack_Pop(void){
uint32_t d=0;
if(Spt < &Stack[SIZE]){
d = (*Spt);
Spt++;
}
return d;
}
Dereference
6-10
EE319K: Stack
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
uint32_t Stack_Pop(void){
uint32_t d=0;
if(Spt < &Stack[SIZE]){
d = *Spt;
Spt++;
}
return d;
}
Stack_Pop
MOV R0,#0
LDR R2,=Stack+4*SIZE
LDR R1,=Spt
LDR R3,[R1]
CMP R3,R2
BHS exit6
LDR R0,[R3]
ADD R3,R3,#4
STR R3,[R1]
exit6
BX LR
6-11
Pointer Array Access
Sum
p RN 0
sum RN 1
MOV sum,#0
LDR R3,=65535
lp LDRH R2,[p]
CMP R2,R3
BEQ exit
ADD sum,sum,R2
ADD p,p,#2
B lp
MOV R0,sum
BX LR
main
LDR R0,=Data
BL sum
Bard, Erez, Gerstlauer, Valvano, Yerraballi, Telang, Cuevas, Tiwari
const uint16_t Data[] = {1,2,3,5,7,11,13,65535};
uint32_t Sum(const uint16 *p){
uint32_t sum;
sum = 0;
while(*p != 65535){
sum += *p;
p++;
}
return sum;
}
int main(void){
uint32_t s = sum(Data);
}
Dereference
Declare
Initialize
6-12