efteruddannelse embedded c

62
Efteruddannelse Embedded C Modul 3 (Onsdag den 13/1-2010) 07.01.2010

Upload: selia

Post on 24-Feb-2016

46 views

Category:

Documents


0 download

DESCRIPTION

Efteruddannelse Embedded C. Modul 3 (Onsdag den 13/1-2010 ). 07.01.2010. Modul 1. Indhold: Opsamling fra i går A/D-konvertering Forgreningsstrukturer Pointer i C Strenge Realtidssystemer Interrupt RTOS kerner Opsamling. Opsamling fra modul 2. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: Efteruddannelse Embedded  C

EfteruddannelseEmbedded CModul 3 (Onsdag den 13/1-2010)

07.01.2010

Page 2: Efteruddannelse Embedded  C

Modul 1

Indhold:1) Opsamling fra i går2) A/D-konvertering3) Forgreningsstrukturer4) Pointer i C5) Strenge6) Realtidssystemer7) Interrupt8) RTOS kerner 9) Opsamling

Page 3: Efteruddannelse Embedded  C

Opsamling fra modul 2

• Man skal altså ikke altid stole på kode, som er skrevet af andre heller ikke velrenommerede firmaer, vores problemer fra i går skyldes, at der er en fejl i timing i oled driveren (ResetDevice), oled når ikke at komme ud af reset, før man forsøger at opsætte registerne, løsning er vist nedenfor:

Original Modificeret version

Page 4: Efteruddannelse Embedded  C

A/D-konverter i PIC

PIC18F46J50 indeholder en 10 bits A/D-konvereter, med en 13 ports MUX. Features for A/D-konverter:

• Kan konverter medens processor er i sleep• Kan foretage selv-kalibrering.• Auto acquisition• 102kS/sek

Page 5: Efteruddannelse Embedded  C

Setup registre ADCON0

Page 6: Efteruddannelse Embedded  C

Setup register ADCON1

Page 7: Efteruddannelse Embedded  C

Analog port config register ANCON0

Page 8: Efteruddannelse Embedded  C

Analog port config register ANCON1

Page 9: Efteruddannelse Embedded  C

MPLAC C18 register definition

extern volatile near unsigned char ADCON1;extern volatile near union { struct { unsigned ADCS:3; unsigned ACQT:3; unsigned ADCAL:1; unsigned ADFM:1; }; struct { unsigned ADCS0:1; unsigned ADCS1:1; unsigned ADCS2:1; unsigned ACQT0:1; unsigned ACQT1:1; unsigned ACQT2:1; };

} ADCON1bits;

ADCON1extern volatile near unsigned char ADCON0;extern volatile near union { struct { unsigned ADON:1; unsigned GO_NOT_DONE:1; unsigned CHS:4; unsigned VCFG:2; }; struct { unsigned :1; unsigned GO_DONE:1; unsigned CHS0:1; unsigned CHS1:1; unsigned CHS2:1; unsigned CHS3:1; unsigned VCFG0:1; unsigned VCFG1:1; }; struct { unsigned :1; unsigned DONE:1; }; struct { unsigned :1; unsigned GO:1; }; struct { unsigned :1; unsigned NOT_DONE:1; };} ADCON0bits;

ADCON0

Page 10: Efteruddannelse Embedded  C

MPLAB C18 register specifikation

extern volatile near unsigned ADRES;extern volatile near unsigned char ADRESL;extern volatile near unsigned char ADRESH;

extern volatile far unsigned char ANCON0;extern volatile far struct { unsigned PCFG0:1; unsigned PCFG1:1; unsigned PCFG2:1; unsigned PCFG3:1; unsigned PCFG4:1; unsigned PCFG5:1; unsigned PCFG6:1; unsigned PCFG7:1;} ANCON0bits;

ANCON0

ADRES

extern volatile far unsigned char ANCON1;extern volatile far struct { unsigned PCFG8:1; unsigned PCFG9:1; unsigned PCFG10:1; unsigned PCFG11:1; unsigned PCFG12:1; unsigned :1; unsigned VBG2EN:1; unsigned VBGEN:1;} ANCON1bits;

ANCON1

Page 11: Efteruddannelse Embedded  C

Mux og ekstern ref. spænding

Page 12: Efteruddannelse Embedded  C

Analog ækvivalent diagram

Page 13: Efteruddannelse Embedded  C

Beregning af acquisition time

Page 14: Efteruddannelse Embedded  C

Pulsplan for A/D-konverter

Page 15: Efteruddannelse Embedded  C

Spec for A/D-konverter

Page 16: Efteruddannelse Embedded  C

Øvelse

Lav øvelsen i ”Lab3.docx”

Page 17: Efteruddannelse Embedded  C

”Conditional branching” ~ betinget forgrening

• Hvis man ønsker at udfører noget kode hvis en bestemt betingelse er opfyldt gøres dette med en if struktur.

Eksempel:if (x>=10){ printf(”X var stoerer eller ligmed 10”);}

Page 18: Efteruddannelse Embedded  C

If-else

• Vil man gerne vælge mellem to stumper kode der udføres hvis betingelse er sand eller falsk anvendes en if-else struktur.

Eksempelif (x == 10){ printf(”X var lig med 10”);}else{ printf(”X var forskellig fra 10”);}

Page 19: Efteruddannelse Embedded  C

If sætninger i if sætninger

• If sætninger må godt være ”nested” (if i if sætninger), herved kan man lave nogle mere komplekse strukturer.

Eksempelif (x>0){ if( x%2 == 0) { printf(”x er et positiv, lige tal”); } else { printf(”x er et positiv, ulige tal”); } else { if osv osv…

Page 20: Efteruddannelse Embedded  C

Switch statement

• En switch struktur er en multiforgrening der kan bruges i stedet for f.eks if..else hvis man skal forgrene programafvikling ud i mere end 2 grene.

Syntaks:switch (expression) { case Konstant-udtryk 1: statement1; case Konstant-udtryk2: statement2; … default : statement-default;}

Page 21: Efteruddannelse Embedded  C

Break

• Anvendes til at hoppe ud af en switch struktur eller en løkke.Eksempel

switch(svar){ case ’j’ : printf(”Dit svar var ja”); break; case ’n’ : printf(”Dit svar var nej”); break;osv.

Page 22: Efteruddannelse Embedded  C

Continue

• Hvis man ønsker at springe til ”bunden” af en løkke kan continue anvendes, den terminere altså ikke løkken, men hopper egentligt videre til næste gennemløb.

Eksempel:for ( i=1; i<8; i++){ if ((i==3)||(i==5)) continue; sum+=i;}

Page 23: Efteruddannelse Embedded  C

Pointers

• Pointere i C er både en ”farlig”, men dog stadig i C en nødvendig sprog konstruktion, med pointere er det muligt at adressere variable eller data indirekte, hvilket betyder at en pointer er en variabel der indeholder en adresse på en anden variabel.

• Med en pointer i C har man mulighed for at tilgå en specifik fysisk adresse i hukommelsen !! det kan godt give anledning til nogle kritiske situationer

Page 24: Efteruddannelse Embedded  C

Oprettelse af en pointer

• Pointere er egentligt en ”normal ” statisk variabel der blot indeholder en adresse.

Oprettelse af en pointer:int etTal;int *enPointer;• * anvendes altså til at angive at der er tale om en pointer.• I C skal man normalt angive en datatype for ens pointer,

meningen med det er faktisk, at man skal oplyse hvad man ønsker tilgå via pointeren.

Page 25: Efteruddannelse Embedded  C

Adresse operatoren &

• Med operatoren & kan man få oplyst adressen på et objekt variabel eller start på noget kode.

Eksempelint etTal;int *enPointer;enPointer = &etTal;

• enPointer ”peger” nu på etTal (eller rettere den adresse som pointeren indeholder er den samme som den adresse som etTal ligger på)

Page 26: Efteruddannelse Embedded  C

Dereference operator *

• Hvis man ønsker at læse indhold af den variabel som en pointer ”peger” på gøres dette ved at skrive * foran pointeren og dette vil så betyde at vi får indhold af det som pointer peger på.

Eksempel:int x = 10;int y;int *pt ;pt = &x; //Peger på xy = *pt; // y bliver lig med 10

Page 27: Efteruddannelse Embedded  C

Null pointer

• En pointer kan godt pege på ”ingen ting” hvilket betyder at pointer ikke indeholder en adresse

Eksempelint *pt;pt = null;

Page 28: Efteruddannelse Embedded  C

Pointer og MPLAB C18

Page 29: Efteruddannelse Embedded  C

Far og near pointer

I MPLAB C18 er ram og program memory som får omtalt to forskellige typer memory med hver sin data bus, far og near har derfor forskellig betydning alt efter om pointer peger på ran eller rom

Page 30: Efteruddannelse Embedded  C

Sidste krølle på pointers

• Variable i C kan defineres som const:int const tal=7913;• I dette eksempel betyder const at tal ikke kan

ændres efterfølgende. Men også på en pointer kan man sætte const:

int tal;const char *cp = &tal;• Her betyder det at vi ”låser” pointeren til at pege på

tal, og tal’s indhold kan faktisk godt ændre sig eller blive ændret men den adresse cp peger på er tal’s.

Page 31: Efteruddannelse Embedded  C

Strenge

• Oprettelse af en streng• Anatomi af streng i C• Længde af en streng• Kopiering af strenge

Page 32: Efteruddannelse Embedded  C

Oprettelse af strenge

• Strenge i C kan betragtes, som et 1 dimensionalt array af char de oprettes som vist nedenfor

char streng[4];• Eller hvis man ønsker at de skal have et indhold.char streng[4] = { ’H’,’e’,’j’,’\0’}• Eller blot:char streng[4]=”Hej”;• Eller som den dovne vil gørechar streng[ ]=”Hej”;

Page 33: Efteruddannelse Embedded  C

En strengs anatomi

• En sekvens af karakterer der afsluttes med ascii tegnet \0 (nul terminering)

• Nul terminering er vigtig, da det er den der bestemmer når streng er slut.

• Hvis en streng skal indeholde en ”konstant” tekst kan man også anvende en pointer :

char *c_ptr = ”Hello world!!”;• Det svarer til at pointer peger på streng der ligger i

program memmory

Page 34: Efteruddannelse Embedded  C

Længden på en streng

• Rigtig mange gode og nyttige funktioner til manipulation af strenge findes biblioteket streng.h b.la strlen, den returnere længden på en streng.

Eks.X = strlen(streng);• Husk strlen tæller til den første nul terminering,

så der er forskel mellem sizeof og strlen.

Page 35: Efteruddannelse Embedded  C

Kopiering af strenge

• Kopiering af strenge foregår med funktionen strcpy.

Ekschar x[20];char y[ ] = ”Her er en lille tekst”;strcpy(x,y);

Page 36: Efteruddannelse Embedded  C

Scanf

• Anvendes til indlæsning af data fra standart input (normalt tastatur)

Eksfloat x; scanf(”%f”,&x);Eller en teksstrengchar minstr[20]; scanf (”%s”,minstr); //bemærk syntaks

Page 37: Efteruddannelse Embedded  C

Realtidssystemer

• Def. af realtidssystem er noget flydende, men en generel definition kunne være at et realtidssystem er et system der generere til response (output) indenfor en tidshorisont som i sammenhæng med den konkrete system er ubetydeligt (ikke særlig præcis).

• Stort set alle indlejrede systemer er realtidssystemer .

Page 38: Efteruddannelse Embedded  C

Eksempler på realtidssystemer

Page 39: Efteruddannelse Embedded  C

Interrupt grundlæggende

• Kan anvendes i simple systemer til at implementer realtids respons.

• Er normalt den hurtigste måde at lave realtidsafvikling på.

• Er kun velegnet til simple systemer.

Page 40: Efteruddannelse Embedded  C

Forgrund/baggrund system

Page 41: Efteruddannelse Embedded  C

Interrupt, beskrivelse

• Interrupt betyder afbrydelse, og ideen er netop, at når der sker noget uden for computeren, der kræver dens opmærksomhed, afbrydes computerens igangværende programudførelse. Udtrykket dækker både den programmelmæssige side og det fysiske elektriske signal, der internt i en computer forårsager afbrydelsen. Et interrupt forekommer oftest i forbindelse med overførsel af data mellem computeren og en ydre enhed, eller ved at et interval-ur, baseret på computerens klokke (se klokfrekvens og RTC), giver interrupt. Det kan dog også være en begivenhed som f.eks. strømsvigt, der initierer interruptet.

Læs hele beskrivelse i filen ”Beskrivelse af interrupt.txt”

Page 42: Efteruddannelse Embedded  C

Interrupt i PIC18 fam.

Har 20 interrupt kilder

• Har 2 interrupt vektorer (1 for lav prioritets interrupt og en for høj prioritets interrupts)

• Reagere når aktuelle instruktion er fuldført.• Ved fast return interrupt gemmes relevante

interne registre.• Interrupt handler skal under søge hvem der

genererede interruptet.

Page 43: Efteruddannelse Embedded  C

Interrupt systemet i PIC18F46J50

• 2 Interrupt prioritet niveauer• 4 eksterne interrupt, 4 programmerbare• _Mange_ interne interrupt kilder• Interrupt systemet kan ”vække” processor fra sleep• Til styring af en interrupt kilde findes følgende bit:

Interrupt flag – Interrupt er ankommetEnable bit - Tænd/sluk af interrupt mulighedPrioritet - Angiver hvor ”vigtigt” et interrupt er

Page 44: Efteruddannelse Embedded  C

Blokdiagram af interrupt system

Page 45: Efteruddannelse Embedded  C

Registre til styring af interrupt

..\..\Datasheet\39931c.pdf

Page 46: Efteruddannelse Embedded  C

Interrupt og sw aspekter

• Interrupt funktioner kan ikke have input parametre og de kan heller ikke returnere data.

• Eksempel:void isr(void){ osv.

• Høj prioritets vektor lægger ved 0x0008• Lav prioritets vektor lægger ved 0x0018

Page 47: Efteruddannelse Embedded  C

Eksempel på interrupt handler

void isr(void){

if (TMR0IF==1) //Interrupt genereret af Timer 0{

// kode TMR0IF = 0; //Fjern interrupt flag;

}if (RCIF==1) // Interrupt fra seriel modtage modul{

// kode RCIF = 0; // Fjern intrupt flag

}}void main(){

// Kode til init af interrupt do {} while (1);

}

Page 48: Efteruddannelse Embedded  C

Interrupt service rutiner

Page 49: Efteruddannelse Embedded  C

Øvelse

• Lav øvelsen i filen lab5.docx

Page 50: Efteruddannelse Embedded  C

Eksempel på forground/background System

Page 51: Efteruddannelse Embedded  C

Interrupt og task switching

Page 52: Efteruddannelse Embedded  C

Def. Af task

Page 53: Efteruddannelse Embedded  C

Def. Prioritet, task switch

Page 54: Efteruddannelse Embedded  C

Def. Preemption, cooperative

Page 55: Efteruddannelse Embedded  C

Cooperative OS

Page 56: Efteruddannelse Embedded  C

Scheduler

Page 57: Efteruddannelse Embedded  C

Lidt mere komplet model af kernel

Page 58: Efteruddannelse Embedded  C

Delte ressourcer og de problemer de afføder

Simpelt eksempel på den delt resource

Page 59: Efteruddannelse Embedded  C

Kode eksempel på en simpel kerne

Page 60: Efteruddannelse Embedded  C

Simpel kernel

Page 61: Efteruddannelse Embedded  C

Øvelse

• I kataloget src lægger et eksempel på et RTOS (freeRTOS), som kan kører på en PIC18F processor.

• I freeRTOS lægger der tre eksempler til MPLAP C18 afprøv disse og undersøg hvordan de virker og hvordan man i disse eksempler opretter en task.

Page 62: Efteruddannelse Embedded  C

Opsummering

• Opsummering på dagen• Tak for i dag