1 of 12

EE 319K�Introduction to Embedded Systems

Lecture 6:�Pointers

Bard, Erez, Gerstlauer, Valvano, Holt, Yerraballi, Telang, Cuevas, Tiwari

6-1

2 of 12

Agenda

  • Exam 1
    • Exam 1, Fri 3/4 7-8:30pm.
    • You MUST upload your solution by 8:30pm.

  • Topics
    • Pointers
    • Arrays
    • Stack

Bard, Erez, Gerstlauer, Valvano, Holt, Yerraballi, Telang, Cuevas, Tiwari

6-2

3 of 12

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

4 of 12

& operator

  • pt = &var;

  • x = x & 0x10;�x &= 0x10;

  • if((x > 0) && (y > 0)){

&var is the address of var

Binary & operator performs 32 bit wise logical ANDs

Binary && operator performs one Boolean AND

6-4

5 of 12

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

6 of 12

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

7 of 12

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

8 of 12

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

9 of 12

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

10 of 12

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

11 of 12

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

12 of 12

Pointer Array Access

    • In assembly

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

  • Pointer access
    • In C

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