Upload
gerrit-lemmens
View
238
Download
2
Embed Size (px)
Citation preview
enumerate typedefstruct union
functiepointers
1
enumerate
enum richting {linksom,rechtsom};
Een enumate is een opsomming van constante integerwaarden.
int main(){ enum richting draairichtingmotor; draairichtingmotor=linksom; if(draairichtingmotor==linksom) printf("links\n");
printf("draairichting motor %d\n", draairichtingmotor);
return 0;}
enum richting {linksom=2,rechtsom=5};
2
enumerate
enum richting {linksom,rechtsom};
Een enumate is een opsomming van constante integerwaarden.
int main(){ richting draairichtingmotor; draairichtingmotor=linksom; if(draairichtingmotor==linksom) printf("links\n");
printf("draairichting motor %d\n", draairichtingmotor);
return 0;}
typedef enum richting richting;
3
struct
struct motor{
int toerental;richting r;
};
m.r=linksom;m.toerental=1234;
motor m;
int main(){
}
struct motor m;
typedef struct motor motor;
enum richting {linksom,rechtsom};typedef enum richting richting;
4
struct minitellers{
unsigned int a :4;unsigned int b :3;unsigned int c :2;
};
Struct en bitvelden
015
abc
34678 bitnr
6
Struct en bitvelden
struct minitellers{
unsigned int tel1 :4;int tel2 :3;int teller;
};typedef struct minitellers tellers;
tellers t={0,0,0};for(i=0;i<20;i++)
{printf("tel1= %d, tel2=%d teller=%d\n",
t.tel1,t.tel2,t.teller );t.tel1++;t.tel2++;t.teller++;
}
int main(){
}
7
Struct en bitvelden
struct lampen{
unsigned int kamer_v :1;unsigned int kamer_a :1;
unsigned int douche :1;};typedef struct lampen lmp;#define AAN 1#define UIT 0
int main(){
return 0;}
lmp s3={UIT,UIT,UIT};s3.kamer_v=AAN;
8
Om het overzichtelijk te houden willen we 3 lampen via een struct aansturen, hoe kan dat gedaan worden ?
unionLijkt op structs
alleen delen de velden een gemeenschappelijk geheugen.
union waarde{
int i;char s;
};
typedef union waarde getallen;
getallen g;
g
g.i=0;
g.i++;
g.s='0';
printf("s=%c i=%d\n",g.s,g.i);9
union
union adres{
unsigned int ad;unsigned char* sw;
};typedef union adres adres;
unsigned char w;
adres schakelaars;schakelaars.ad=PIO_SWITCH_BASE;w= *schakelaars.sw;
printf("w=%d\n",w); 10
DE2-70brandalarm_kamer1
brandalarm_kamer2
inbreekalarm_achter
inbreekalarm_voor
D1
D2
D3
D0
11
struct en unionstruct alarm{
unsigned int inbreekalarm_achter :1;unsigned int inbreekalarm_voor :1;unsigned int brandalarm_kamer1 :1;
unsigned int brandalarm_kamer2 :1;};typedef struct alarm alarm;
union al_verw{
alarm al;unsigned char ingelezen;
};
union adres{
unsigned int ad;unsigned char* sw;
};typedef union adres adres;
12
struct en union
int main(){
union al_verw a={0};
adres schakelaars;schakelaars.ad=PIO_SWITCH_BASE;a.ingelezen= *schakelaars.sw;
// test of brandalarm in kamer 1 is afgegaanif(a.al.brandalarm_kamer1)
printf("verlaat kamer1\n");
return 0;}
13
Functiepointer
pointer naar een functie
14
Inleiding pointers
pointers
int a;a
a=45; 45
int* pa; pa
pa=&a;
15
Pointers
int getallen[2]; getallen
Werken met een array van integers
*getallen=4;
4
*getallen+1=5; error: invalid lvalue in assignment
*(getallen+1)=5;
5getallen[0]=3;
3
Pointers en een array
16
#define AANTAL 2int getallen[AANTAL];
getallen
Een array van integers als parameter meegeven
telop(getallen,AANTAL);
int telop( ,int); int[]int*
PointersPointers en een array
int main(){
return 0;}
// prototype van de functie telop
17
int* getallen[2];
getallen
Een array van “pointers naar integers”
getallen[0]= &a;
getallen[1]= &b;
int a;int b;
b
a
Pointerseen array van pointers
A=4;
4
*getallen[1]=6;
6
18
//Geef b de waarde 6 via de array getallen
int* getallen[2];
getallen
Een array van “pointers naar integers”als parameter meegeven.
getallen[0]= &a;
getallen[1]= &b;
int a;int b;
b
a
int x= telop(getallen,AANTAL);
int telop( ,int); int*[]int**
Pointerseen array van pointers
int main(){
return 0;}
// prototype van de functie telop
19
dub *dubtabel[2]={&paar1,&paar2};
int x= bewerk(dubtabel,AANTAL);
int bewerk( ,int); dub**
typedef struct { int i; char c; }dub;
dub paar2={3,’j’);dub paar1={2,’i’);
paar2paar1
3
j
2
i
Pointersstructs en pointers
int main(){
return 0;}
// prototype van // de functie bewerk
20
trip *triptabel[2];
int x= bewerk(triptabel,AANTAL);
int bewerk( ,int); trip**
typedef struct { int i; int i2 char c; }trip;
typedef struct { int i; char c; }dub;
dub *dubtabel[2];
int x= bewerk(dubtabel,AANTAL);
int bewerk( ,int); dub**
?
Pointersstructs en pointers
int main(){
return 0;}
// prototype van de functie telop
// prototype van de functie telop
21
trip *triptabel[2];
int x= bewerk(triptabel,AANTAL);
void**
typedef struct { int i; int i2 char c; }trip;
typedef struct { int i; char c; }dub;
dub *dubtabel[2];
int x= bewerk( dubtabel,AANTAL);
int bewerk( ,int); dub**
int x= bewerk((void**) dubtabel,AANTAL);
int x= bewerk((void**)triptabel,AANTAL);
pointersstruct, array en pointers
22
typedef struct { int i; char c; }dub;
void *dubtabel[2];
int x= bewerk(dubtabel,AANTAL);
int bewerk( ,int); void**
dub paar1={2,'l'};
dubtabel[0]=&paar1;
pointersstruct, array en pointers
23
Pointers
We willen een generieke functie maakrij maken die een array van pointers mee terug geeft. De aan te maken array bevat x elementen.
maakrij( unsigned int x ){ rij = malloc(sizeof( )*x);
return rij;
}
void*void*
void*
float* pi=(float*)maakrij(5);
int* pi=(int*)maakrij(5);
{ printf("Hoi Minor deelnemers\n");
}
Pointerspointer naar een functie
void drukaf ( )
int main(int argc, char *argv[]){
int a;
return 0;}
void ( )(*minor_embed) ;minor_embed=drukaf;minor_embed();
25
pointersFunctie als parameter
int telop(int t){ return t+3;}
int telaf(int t){ return t-3;}
void bewerking(int g, ){ int a; a=tel(g); printf("a=%d\n",a);}
int (*tel)(int)
int main(){ int d=10; bewerking(d,telaf); bewerking(d,telop); printf("d=%d\n",d); return 0; } 26
FunctiepointerFunctiepointer in een struct
Een struct:
struct cijfer{ double waarde; char *naam;};
int main() { struct cijfer vak1; vak1.waarde=6.4; vak1.naam=“C programmeren"; return 0;}
27
FunctiepointerFunctiepointer in een struct
Een struct:
typedef struct{ double waarde; char *naam;}cijfer;
int main() { cijfer vak1; vak1.waarde=6.4; vak1.naam=“C programmeren"; return 0;}
28
FunctiepointerFunctiepointer in een struct
Een struct:
typedef struct{ double waarde; char *naam;}cijfer;
int main() { cijfer vak1; vak1.waarde=6.4; vak1.naam=“C programmeren"; cijfer *osir=&vak1;
return 0;}
osir->waarde=7;
29
FunctiepointerFunctiepointer in een struct
Een struct:
typedef struct{ double waarde; char *naam;}cijfer;
int main() {
cijfer vak1={6.4, “C programmeren“}; cijfer *osir=&vak1;
return 0;}
osir->waarde=7;
30
FunctiepointerFunctiepointer in een struct
typedef struct { int cp; char *naam; int (*onderdeel1) (char*,int); int (*onderdeel2) (char*,int); int (*onderdeel3) (char*,int); int (*project) (char*,int);}minor;
int systemC(char* n,int cp){ printf("gegeven door %s cp %d \n“,n,cp); return 7;}
int elektronic_sys_lev(char* n,int cp){ printf("gegeven door %s cp %d\n“,n,cp); return 8;}
int embSoftw(char* n,int cp){ printf("gegeven door %s cp %d \n“,n,cp); retrun 7;}
31
int main(){ cout << "Hello world!" << endl;
minor embedded={ 15, "embedded Systems", systemC, elektronic_sys_lev, embSoftw, NULL }; int cd=embedded.onderdeel1("Harry",3); int se=embedded.onderdeel3("John",3);}
FunctiepointerFunctiepointer in een struct
32
Interrupt bij NIOS ii
Interrupt_routine(o.a.pointer naar een variabele)
Registratie van de interrupt_routine(met pointer naar een var) op een interrupt nr
33
34
ISR Process
Interrupt komt op
Huidige context wordt opgeslagen
ISR adres wordt aan de hand van het interrupt-nummer uit de vector tabel gehaald
Spring naar de ISR routine
Run de routine
De context wordt terug gezet
Programma wordt vervolgd
Memory
Vector Table
ISR
Main ProgramSave
Context
RestoreContext
35
NIOS II Interrupt of Exeption Control Diagram
1. Save de status registers2. Disable interrupts.3. Save de P.C.
InterruptInterrupt routine in de HAL.
int alt_irq_register(alt_u32 id, void* context, alt_isr_func handler);
Interrupt registreren
Welke interruptInterrupt routineContext
(parameter)
36
prototype van de functie alt_irq_register
int alt_irq_register (alt_u32 id, void* context, void (*isr)(void*, alt_u32));
37
Voorbeeld NIOS II Interrupt (PIO)
int main(){ n = 0; init_pio(); while (1) { IOWR_ALTERA_AVALON_PIO_DATA(PIO_BASE, n); } return 0;}
int n;
volatile int edge_capture;
38
Voorbeeld NIOS II Interrupt (PIO)
void init_pio(){
}
void* edge_capture_ptr = (void*) &edge_capture;
/* Enable eerste 4 interrupt bits. */ IOWR_ALTERA_AVALON_PIO_IRQ_MASK(PIO_BASE, 0xf);
/* Reset the edge capture register. */ IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BASE, 0x0);
/* Register the interrupt handler. */ alt_irq_register( PIO_IRQ, edge_capture_ptr, handle_button_interrupts );
39
Voorbeeld NIOS II Interrupt (PIO)
void handle_button_interrupts(void* context, alt_u32 id){ volatile int* edge_capture_ptr = (volatile int*) context; *edge_capture_ptr = IORD_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BASE); n++; IOWR_ALTERA_AVALON_PIO_EDGE_CAP(PIO_BASE, 0);}
Welke schakelaar is ingedrukt.