Pekare och speciell programstruktur i inbyggda system Lektion 4 C för enchipsdatorer: Pekare och speciell programstruktur i inbyggda system
Dagens Agenda Bit-fält i struct Pekare Exempel med pekare och bit-fält Definition och användning Pekare Definition, betydelse, vektorer och pekare, pekare och funktioner Exempel med pekare och bit-fält Optimeringar av C-kod Minne, exekveringstid Inför C Lab 2 12F675 Voltmeter (PIC-termometer) Summering av tidigare lektioner
Bit-fält i struct Ett sätt att deklarera variabler så att enskilda bitar kan läsas/sparas Följer ANSI C standarden Kan vara ett sätt att spara minne om minsta datatypen egentligen är ”för stor” Koden kan göras mer portabel, ex. kan ej ANSI standardkonstruktioner, typ absolute @, bit, m.fl. utelämnas I detta fall refereras adresser direkt med pekare
struct En härledd datatyp som är tillverkad av programmeraren Sammansatt av andra datatyper (struktur av datatyper) Som också kan vara struct, i ”botten” måste det i dock finnas någon datatyp som är standard Ordningen på elementen i minnet i en struct när den sparas bestäms av deras inbördes ordning
Definition av struct Nyckelordet struct introducerar en sk. postdeklaration struct deklaration definierar en typ Variablerna i posten kallas medlemmar Namnet kallas för handtag Deklarationen av en struct reserverar inget minne det är endast när variabler definieras av den aktuella struct typen som minne reserveras
struct deklaration struct(nyckelord) handtag(valfritt namn){ medlemmar } struct point{ int x; int y; };
struct variabler Variabler av typen struct definieras på samma sätt som variabler av standard-datatyper Lagringsklasser mm. används på samma sätt Definition av variabel pt av typen struct point struct point pt; Användning av struct medlemmar ”.” operatorn pt.x, pt.y refererar till medlemmar av posten pt
Bit-fält i struct Bit-fält i struct beskriver hur olika bitar i en struct refererar till en specifik variabel En struct med bit-fält beskriver bit för bit hur minnet är organiserat I bit-fält får endast signed eller unsigned int användas på medlemmar Siffran talar om storleken i bitar
Exempel bit-fält i struct struct controlBitsReg{ unsigned clp :1; unsigned ds1 :1; unsigned a1 :1; unsigned a0 :1; unsigned wr:1; }; struct inputNumbersReg{ unsigned number1 :4; unsigned number2 :4;
Pekare Vad är en pekare? Pekare används ofta inom inbyggda system En variabel som pekar på (innehåller) en adress till en variabel Variabeln som pekas på är av en bestämd datatyp Pekare används ofta inom inbyggda system Realtids OS, funktioner med pekarargument Mycket användbart vid funktioner eftersom det är enda möjligheten att dela objekt mellan funktioner (förutom globala variabler och kopiering via returvärde) Kan dock skapa obegripliga program? Vid vårdslös användning
Definition av pekare Pekare är en grupp av minnesceller som kan lagra en adress I PIC, en eller två byte stor Pekare deklareras med * operatorn int *ip; Pekare deklareras till att peka på en viss datatyp I likhet med vanliga variabler När en variabel definieras som pekare talar vi om att det är en adress som skall lagras I variabel istället för ett värde Varför ska man lagra adresser? Dessa kan skickas som argument till funktioner Vet vi adressen till en variabel så kan vi modifiera data på denna inuti funktion Smidigt sätt att indexera en vektor
Användning av pekare Operatorn & ger adressen till ett objekt Endast på objekt i minnet, ej uttryck eller konstanter p=&c Operatorn * ger indirekt åtkomst När den används på pekare får man tillgång till det objekt som pekas på
Pekare och struct Definition av variablerna pt och *pp av typen struct point (enligt tidigare) struct point pt, *pp; pp=&pt Användning av pekare till struct medlemmar ”->” operatorn pt.x, pt.y refererar till medlemmar av posten pt pp->x, pp->y (alt. (*pp).x, (*pp).y) refererar till samma
Pekare och vektorer Pekare och vektorer har mycket gemensamt Varje operation som kan utföras med vektorindex kan också utföras med pekare Med pekare går det vanligtvis snabbare En vektor är egentligen adressen till första elementet i vektorn Men är inte identiskt med pekare Jämför int a[10]; int *pa; pa är en variabel, a är en vektor referens till a[i] kan också skrivas som *(a+i)
Indexering med pekare Pekare kan på ett enkelt sätt användas för att indexera vektorer char dispString1[5], dispString2[5] ; char *toDisp1, *toDisp2; toDisp1=&dispString1[0]; *toDisp1=dispString1[0]; toDisp1++; //ökar pekarens adress med 1 steg (*toDisp1)++; //ökar det som pekas på (värdet)
Pekare ej identiskt med vektor Därför är följande möjligt Tilldela vektor till pekare , pekare till pekare toDisp1=dispString1; toDisp1=toDisp2; Men inte följande Tilldela pekare till vektor, vektor till vektor dispString1=toDisp1; dispString1=dispString2;
Funktioner och pekare I C skickas argument till funktioner genom att kopiera deras värde Call by value, det finns inget direkt sätt att ändra en variabel i den anropande funktionen Pekarargument tillåter att funktionen kan läsa och ändra variabler i den anropande funktionen När ett vektornamn skickas till en funktion är det i själva verket adressen för det första elementet I en funktionsdefinition är följande parametrar ekvivalenta char s[] char *s
Exempel pekare och funktioner void Swap (int *p1, int *p2){ int temp =*p1; *p1=*p2; *p2=temp; } int x =4; int y = 7; Swap(&x, &y);
Exempel pekare och bit-fält Pekare kan användas för att referera till adresser för olika register Enda sättet att komma åt särskilda adresser vid sk. memory-mapped I/O Nästa exempel är C lab 1 från föregående föreläsning utan pic.h inkluderad Adresser till register refereras med pekare Bit-fält används för att komma åt enskilda bitar i register
Kodoptimering Flyttalsoperationer kräver stora resurser Kan löna sig att formulera om problemet, istället för att skaffa dyrare processor Division/multiplikation med tal som ej är multipel av 2 tar stora resurser Omformulering till multipel av 2 kan löna sig, detta innebär endast skiftning Använd unsigned istället för signed om möjligt Operationer kräver färre instruktioner
Exempel från microchipc.com Räkna ner loopar till noll istället för att räkna upp Att kontrollera om något är noll går fortare unsigned char i; for(i=0;i<250;i++) do_func(); //executes do_func() 250 times, in 3.25ms for(i=250;i!=0;i--) do_func(); //executes do_func() 250 times, in 2.5ms
Inför C laboration 2 Ny PIC: 12F675 Konstruera en voltmeter De som vill (ev. får tid över) kan försöka sig på en termometer) Samma skiftregister och display som föregående C lab 1 Viktigt att studera datablad Hur portar och register används Använd gärna funktioner och pekare
Processor PIC 12F675 Samma grundarkitektur och instruktioner 8 ben, 6 GPIO, A/D omvandlare I boken står att 12 serien har 2 nivå stack men i datablad står 8 nivå (rätt) Pris/st ELFA: 24,40 kr (16F84 66,30 kr) Samma grundarkitektur och instruktioner Datablad på Ping Pong
Repetition lektion 1 C kontra assembler Datatyper och variabler Storlek Användning Lagringsklasser och kvalificerare Hur skall en specifik variabel lagras, respektive behandlas av kompilatorn? Operationer Aritmetiska Logiska Bitvis logiska
Repetition lektion 2 Uppvärmning C preprocessor Villkorssatser Exempel och förtydliganden rörande ämnen från Lektion 1 C preprocessor #include #define Villkorssatser if, case, while, for Vektorer Array, string Kompilering och simulering av C program Inför C lab1 Introduktion till funktioner argument, returvärde, variabler
Repetition lektion 3 Laboration 1 Kompileringsprocessen (PICC) Exempelprogram med flera filer Kompileringsprocessen (PICC) Steg Filer Interrupt Funktionsdefinition Assembler i C-program Olika metoder
Summering av mål Innehåll C föreläsningar Viss del repetition Om användning av C för inbyggda system i allmänhet Använda C för programmering av PIC enchipsdator