EE 319K�Introduction to Embedded Systems
Lecture 12b: �Serial Communication (UART), �Lab 9, FIFO Queues
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-1
Agenda
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-2
EE319H Distributed Measurement
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
wireless
Why layered?
12-3
Lab 9 – Distributed Measurement
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
P
o
s
i
t
i
o
n
S
e
n
s
o
r
V
o
l
t
a
g
e
0
t
o
+
3.3V
A
D
C
h
a
r
d
w
a
r
e
A
D
C
d
r
i
v
e
r
S
a
m
p
l
e
0
t
o
4
0
9
5
S
y
s
T
i
c
k
I
S
R
S
a
m
p
l
e
0
t
o
4
0
9
5
S
y
s
T
i
c
k
h
a
r
d
w
a
r
e
L
C
D
d
i
s
p
l
a
y
L
C
D
d
r
i
v
e
r
F
i
x
e
d
-
p
o
i
n
t
0
t
o
3
.
0
0
0
P
o
s
i
t
i
o
n
0
t
o
3
c
m
U
A
R
T
d
r
i
v
e
r
U
A
R
T
1
h
a
r
d
w
a
r
e
m
a
i
n
U
A
R
T
1
I
S
R
U
A
R
T
1
h
a
r
d
w
a
r
e
C
o
m
p
u
t
e
r
1
C
o
m
p
u
t
e
r
2
M
e
s
s
a
g
e
M
e
s
s
a
g
e
F
I
F
O
M
e
s
s
a
g
e
M
e
s
s
a
g
e
M
e
s
s
a
g
e
M
e
s
s
a
g
e
S
T
X
d
1
.
d
2
d
3
d
4
C
R
E
T
X
M
e
s
s
a
g
e
<,d1,dot,d2,d3,d4,CR,>
0 to 2.00cm
0 to 2 cm
Spring 2022: Two different computers
12-4
Lab 9 Profile
Time to ADC_In with SAC=6?
Time to send message?
Transmitter 10 Hz ISR:
<
>
d3
<,d1,dot,d2,d3,d4,CR,>
12-5
UART Interrupts
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
RXIFLSEL RX FIFO Set RXRIS interrupt trigger when
0x0 ≥ ⅛ full Receive FIFO goes from 1 to 2 characters
0x1 ≥ ¼ full Receive FIFO goes from 3 to 4 characters
0x2 ≥ ½ full Receive FIFO goes from 7 to 8 characters
0x3 ≥ ¾ full Receive FIFO goes from 11 to 12 characters
0x4 ≥ ⅞ full Receive FIFO goes from 13 to 14 characters
TXIFLSEL TX FIFO Set TXRIS interrupt trigger when
0x0 ≤ ⅞ empty Transmit FIFO goes from 15 to 14 characters
0x1 ≤ ¾ empty Transmit FIFO goes from 13 to 12 characters
0x2 ≤ ½ empty Transmit FIFO goes from 9 to 8 characters
0x3 ≤ ¼ empty Transmit FIFO goes from 5 to 4 characters
0x4 ≤ ⅛ empty Transmit FIFO goes from 3 to 2 characters
12-6
Lab9: Transmitter SysTick ISR
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Busy-wait version
Busy-wait version
<,d1,dot,d2,d3,d4,CR,>
12-7
Lab9: UART Rx Interrupt
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
C++ add extern "C" void UART1_Handler(void);
12-8
Lab9: Interrupt+Mailbox?
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Background thread
Foreground thread
What can go wrong?
12-9
First-In/First-Out (FIFO) Queues
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-10
FIFO Operation
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-11
FIFO Operation
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-12
FIFO Queue Synchronization
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Lab 9
12-13
Lab 9 - RXRIS ISR
increment a global error count (but don’t loop back)
12-14
FIFO Queue Design
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-15
Index vs pointers
Bard, Erez, Gerstlauer, Holt, Telang, Tiwari, Valvano, Yerraballi
12-16
FIFO Queue Implementation
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-17
FIFO Index Implementation
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
GetI
PutI
12-18
FIFO Index Full/Empty Conditions
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
What if SIZE is a power of 2?
12-19
FIFO Index Wrapping
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Pointer wrap
on 2nd put
Pointer wrap
on 4th get
FIRST
LIMIT
FIRST
LIMIT
GetI
GetI
GetI
GetI
GetI
GetI
GetI
GetI
GetI
GetI
PutI
PutI
PutI
PutI
PutI
PutI
PutI
PutI
PutI
PutI
12-20
FIFO Index Functions
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-21
FIFO in C – Index Implementation
#define FIFO_SIZE 10
int32_t static PutI; // Index to put new
int32_t static GetI; // Index of oldest
int32_t static Fifo[FIFO_SIZE];
void Fifo_Init(void){
PutI = GetI = 0;
}
Bard, Erez, Gerstlauer, Holt, Telang, Tiwari, Valvano, Yerraballi
static means private to this file
EMPTY: PutI equals GetI
FULL: (PutI +1)%SIZE equals GetI
12-22
FIFO in C – Index Implementation
int Fifo_Put(int32_t data)
{
if ( ((PutI+1)%FIFO_SIZE) == GetI) {
return(0);
}
FIFO[PutI] = data;
PutI = (PutI+1)%FIFO_SIZE;
return(1);
}
int Fifo_Get(int32_t *datapt)
{
if (GetI == PutI) {
return(0);
}
*datapt = FIFO[GetI];
GetI = (GetI+1)%FIFO_SIZE;
return(1);
}
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Empty FIFO check
Full FIFO check
12-23
FIFO Queuing Theory
Average producer rate exceeds the average consumer rate
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Producer rate temporarily exceeds the consumer rate
On average the arrival rate must be slower than the service rate
12-24
FIFO Queue EE319H
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-25
FIFO Full/Empty EE319H
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-26
FIFO Wrapping EE319H
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Pointer wrap
on 2nd put
Pointer wrap
on 4th get
FIRST
LIMIT
FIRST
LIMIT
12-27
FIFO Queue EE319H
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
12-28
FIFO EE319H
#define FIFO_SIZE 10
private:
char *PutPt;
char *GetPt;
char Fifo[FIFO_SIZE];
public:
bool Put(char x);
bool Get(char *pt);
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
private to this class
Public to user
12-29
FIFO Routines EE319H
int Fifo_Put(int32_t data)
{
int32_t *tempPt;
tempPt = PutPt+1; // see if there is room
if(tempPt==&Fifo[FIFO_SIZE]){
tempPt = &Fifo[0];
}
if(tempPt == GetPt){
return(0); // full!
}
else{
*(PutPt) = data; // save
PutPt = tempPt; // OK
return(1);
}
}
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Change
this C into C++
integer to char
12-30
FIFO Routines EE319H
int Fifo_Get(int32_t *datapt){
if(PutPt == GetPt){
return(0); // Empty
}
else{
*datapt = *(GetPt++);
if(GetPt==&Fifo[FIFO_SIZE]){
GetPt = &Fifo[0];
}
return(1);
}
}
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Change
this C into C++
integer to char
12-31
Deque
How to make a FIFO queue using the EE312H linked lists?
class Node {
public: string val;
Node *next;
~Node() { delete next; }
};
class List {
Node *head;
int si;
void List::add(string el) {
Node *n = new Node();
n->val = el;
n->next = nullptr;
if (head != nullptr) {
n->next = head; }
head = n; si++;
}
12-32
TM4C123 ADC Fifos
12-33
FIFO Macro EE319H
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
// macro to create a pointer FIFO
#define AddPointerFifo(NAME,SIZE,TYPE,SUCCESS,FAIL) \
TYPE volatile *NAME ## PutPt; \
TYPE volatile *NAME ## GetPt; \
TYPE static NAME ## Fifo [SIZE]; \
void NAME ## Fifo_Init(void){ \
NAME ## PutPt = NAME ## GetPt = &NAME ## Fifo[0]; \
} \
int NAME ## Fifo_Put (TYPE data){ \
TYPE volatile *nextPutPt; \
nextPutPt = NAME ## PutPt + 1; \
if(nextPutPt == &NAME ## Fifo[SIZE]){ \
nextPutPt = &NAME ## Fifo[0]; \
} \
if(nextPutPt == NAME ## GetPt ){ \
return(FAIL); \
} \
else{ \
*( NAME ## PutPt ) = data; \
NAME ## PutPt = nextPutPt; \
return(SUCCESS); \
} \
} \
int NAME ## Fifo_Get (TYPE *datapt){ \
if( NAME ## PutPt == NAME ## GetPt ){ \
return(FAIL); \
} \
*datapt = *( NAME ## GetPt ## ++); \
if( NAME ## GetPt == &NAME ## Fifo[SIZE]){ \
NAME ## GetPt = &NAME ## Fifo[0]; \
} \
return(SUCCESS); \
}
Implementing an object in C!
Which does this have?
AddPointerFifo(Rx, 20, uint8_t, 1, 0)
12-34
Little’s Theorem EE319H
Bard, Erez, Cuevas, Holt, Gerstlauer, Telang, Tiwari, Valvano, Yerraballi
Little’s Theorem states
N = λR
12-35