EE 319K�Introduction to Embedded Systems
Lecture 3: C programming
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-1
Agenda
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
n+n => n+1
n-n => n+1
n*n => 2n
n/n => n
Review prime pi examples from EE312H
3-2
IR distance sensor
#define K1 1195172
#define K2 -1058
int32_t IRconvert(int32_t n){
return K1/(n + K2);
}
int32_t IRconvert2(int32_t n){
int32_t d;
if(n<3000) return 800;
if(n>13000) return 100;
d = K1/(n + K2);
return d;
}
d = 1195172/(n – 1058 )
3-3
Arrays
#define LEN 10
int16_t Data[10]; // global RAM
const int16_t Prime[5]={2,3,5,7,11}; // global ROM
void fun(void){ char name[8];
}
Data[0] = 55;
Data[1] = 72;
32 bit: Buf+4*i
16 bit: Buf+2*i
8 bit: Buf+i
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-4
Array example
#define LEN 10
int32_t aa[LEN];
int32_t bb[LEN];
int32_t s=0;
for(int32_t i=0;i<LEN;i++){
s += aa[i]*bb[i];
}
aa[0]
&aa[0]
aa
aa[i]
*aa
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-5
Array parameters
int32_t dot(int32_t a[], int32_t b[], int32_t l){
int32_t s=0;
for(int32_t i=0;i<l;i++){
s += a[i]*b[i];
}
return s;
}
int main(void){
int32_t result;
result = dot(aa,bb,5);
while(1){
}
}
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
s RN 4
i RN 5
dot
MOV s,#0 ;s=0
MOV i,#0 ;i=0
forloop3
CMP i,R2 ;is i<l
BGE forDone3
ASL R6,i,#2 ;i*4
LDR R7,[R0,R6]
LDR R8,[R1,R6]
MUL R7,R7,R8
ADD s,s,R7
ADD i,i,#1
B forloop3
forDone3
MOV R0,s
BX LR
3-6
Thermodilution
uint32_t T[1000];
// temperature in C
// 100 Hz, 10 sec
#define K3 43660
uint32_t CardiacOutput(void){
uint32_t sum,i,CO;
sum = 0;
for(i=0; i<1000; i++){
sum = sum+T[i];
}
CO = K3/sum;
return CO;
}
3-7
Maximum of an array
int32_t max(int32_t data[],
uint32_t size){
int32_t ans,i;
ans = data[0]; // assume first is max
for(i=1; i < size; i++){
if(data[i] > ans){
ans = data[i];
}
}
return ans;
}
#define SIZE 10
int32_t MyData[SIZE];
int main(){int32_t myMax;
while(1){
// fill up MyData
myMax = max(MyData,SIZE);
}
}
3-8
Dot product
int32_t dot(int32_t a[], int32_t b[],
int32_t length){ int32_t s=0;
for(int32_t i=0;i< length;i++){
s += a[i]*b[i];
}
return s;
}
#define LEN 5
int32_t aa[LEN];
int32_t bb[LEN];
int main(void){
int32_t result;
for(int i=0; i< LEN;i++){
aa[i] = i;
bb[i] = 5;
}
result = dot(aa,bb,LEN);
while(1){ }
}
3-9
Capitalize letters in string
char name[10] = "Jonathan";
// uncapitalize every letter
void uncap(char str[]){int i=0;
while(str[i]){
str[i] |= 0x20;
i++;
}
}
void uncap(char *p){
while(*p){
*p |= 0x20;
p++;
}
}
3-10
Debugging
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-11
Debugging
test recent change to existing system
full or partial selection of already executed test cases
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-12
Debugging
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-13
Debugging Intrusiveness
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Tiwari
3-14
Lab 2 demo
Observe locals and globals
Single step
Breakpoints
How does the grader work?
Is it exhaustive?
Bard, Erez, Gerstlauer, Holt, Valvano, Yerraballi, Telang, Cuevas, Tiwari
3-15
Summary
3-16