Enumerate typedef struct union functiepointers 1.

Post on 18-Jun-2015

225 views 2 download

Transcript of Enumerate typedef struct union functiepointers 1.

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.