1 / 24

Lektion 2

Lektion 2. Programstruktur: C för enchipsdatorer. Dagens Agenda. Uppvärmning 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

ekram
Télécharger la présentation

Lektion 2

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Lektion 2 Programstruktur: C för enchipsdatorer

  2. Dagens Agenda • Uppvärmning • 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

  3. Endianess • Big Endian (Motorola 680x0, Sun SPARC, de flesta RISC maskiner) • Den mest signifikanta byten är lagrad på den lägsta adressen • 0x12345678 sparas som ex. 12 34 56 78 • Little Endian (PIC, Intel 80x86, Pentium) • Den minst signifikanta byten är lagrad på den lägsta adressen • 0x12345678 sparas som 78 56 34 12 • unsigned long j; • j=0x12345678; • Resultat i MPLAB nedan

  4. Ett enkelt program i C

  5. C Preprocessor • Preprocessor • Första steget i kompileringen • Rader som börjar med # är instruktion till preprocessor • Räckvidd till slutet av filen • Två mest viktiga • #include • Filinkludering • #define • Makrosubstitution • Det finns även andra • Avdefinering: #undef • Villkorlig inkludering: #if, #elif, #else, #endif, #ifdef, #ifndef

  6. Filinkludering • #include <filnamn> eller ”filnamn” • Raden ersätts av hela innehållet i filnamn • <filnamn> • Sökvägen till filen är implementationsberoende, (tillhandahålls av systemet) • ”filnamn” • Filen eftersöks där källfilen hittades, (tillhandahålls av programmeraren)

  7. Symboliska Konstanter • Även det instruktion till pre-processor • #define namn ersättningsuttryck • Ersätter ett uttryck med ett annat • Bra sätt att ersätta konstanta tal i programmet, ex gränsvärden • Istället för att deklarera en variabel button i förra exemplet kunde button ha ersatts av uttrycket RA0

  8. If-else • If satsen exekveras om uttryck är sant, dvs är skilt från noll. Måste innehålla minst ett if, resten kan utelämnas. • if (uttryck) • sats • else if (uttryck) • sats • else • sats • Följande har orsakat många missförstånd: • if (num1 = 5) Alltid sant num1 tilldelas 5, däremot • if(num1 = 0) Alltid falskt • if (num1 == 5)Kan vara sant eller falskt • if (num1 == 0)Kan vara sant eller falskt

  9. Switch switch (uttryck){ case konstantuttryck: satser case konstantuttryck: satser default: satser } • break; • Kan användas för att lämna sats, annars fortsätter exekveringen med nästa case

  10. While och for slingor • While satsen utförs om uttryck är sant dvs skilt från noll while (uttryck) sats • For-satsen har tre komponenter • Vanligast är att uttryck1 och uttryck3 är tilldelningar medan uttryck2 är ett relationsuttryck for (uttryck1; uttryck2; uttryck3) sats • Break och continue • break; används för att lämna inuti en slinga • continue; påbörja nästa varv i en slinga, i while testas uttrycket igen i for överförs kontrollen till uppräkningsdelen.

  11. Oändliga Slingor • I inbyggda system är det vanligt att programmet innesluts av en oändlig slinga för att det inte skall avslutas Ex: while (1){ programmets körs för evigt } Eller: for (;;){ programmets körs för evigt }

  12. Exempel While(1),Switch • Samma funktion som tidigare program men med while(1) och switch istället för if • Switch ger i detta fall ett större program • Program space used ( 4.5%) • Data space used ( 10.3%) • Mot tidigare • Program space used ( 3.2%) • Data space used ( 4.4%) • Orsak: Kompilatorn gör om if satsen till ett enkelt bit test, sker ej i switch fallet

  13. Vektorer • Pekare till minnesblock • Sekvens av viss variabeltyp, börjar på noll • Sista elementet på n-1 platsen • Kan vara flerdimensionella [n] [n] • Datatyp Namn [storlek (n)] • int nArray[4]; • Skapar en vektor av 4 int • int nDispArray[]={'1', 2 , 3}; • Skapar en vektor av 3 int, initierad till {(ASCII för 1), 2, 3}

  14. String • String (teckenvektor) • Vektor av typen char • Avslutas med NULL, görs därför i storlek [n+1] • Kan initieras med strängliteral • char cDispString[]="Volt"; • Skapar en vektor av 5 char initierad till ASCII tecknen för Volt, + NULL(0) • char cDispVal[5]; • Skapar en vektor av 5 char • Sista bör reserveras för NULL, alltså 4 användbara

  15. Tilldelning av vektorelement • Använd index • Måste tilldelas element för element cArray1= cArray2; //Går inte för sig cArray1[1]= cArray2[2]; //Fungerar bättre for (i=0;i<4;i++) cDispVal[i]=i; //Lägger in värdet på i på position i cDispVal[i]='\0'; //Avsluta med NULL när det är en tecken vektor

  16. Kodläsbarhet • För att underlätta programförståelse • Olika stilar, ex: • variabelnamn börjar med liten bokstav (nLength, n_length) • Symboliska konstanter med VERSALER (jfr. BUTTON) • Använd beskrivande variabelnamn • L kontra nLength • V kontra fVolt • Däremot enkla loopvariabler • i,j,k, osv.. • Tänk på att n inte är samma som N i C

  17. Kompilering PICC Lite • PICC Lite • Gratisversion av PICC • ANSI C kompilator från Hi-Tech Software http://www.htsoft.com/ • Begränsningar • Stödjer inte alla PIC:ar • Begränsningar i program och dataminne för vissa (dock ej 16F84) • Integreras i MPLAB • C koden transformeras till assembler därefter maskinkod

  18. Skapa Projekt med PICC Lite • Project Wizard i MPLAB • Kontrollera sökvägen till PICC kompilatorn (picl.exe) se nedan • Lägg till filen lab1_demo.c till ert projekt

  19. Kompilering • För att kompilera programmet • Build All eller Make • Kompileringsinställningar • Build Options • Bl.a. inställningar för char och double

  20. Simulering • Debugger: Select Tool: MPLAB SIM • Den genererade assemblerkoden visas med Disassembly Listing

  21. Tips för simulering • Använd Watch för att titta på variabler • StopWatch för att mäta exekveringstider • Beroende på vilket fönster som är aktiverat • Stegas antingen instruktioner i assemblerkoden eller satser i C koden • Högerklocka i C koden och välj Run to Cursor

  22. Funktioner • Varför? • Läsbarhet • Divide and conquer • Funktionsdefinition Returtyp funktionsnamn(argumentdeklarationer) { Deklarationer och satser } • Vissa delar kan utelämnas, ex returtyp (default int)

  23. Funktionens komponenter • En funktion behöver inte returnera något värde • Används som subrutin • Call by value (värdeanrop) • Argumenten är kopior, lokala för funktionen • Call by reference kan implementeras med pekare (alt. globala variabler) • Variabler definierade inuti funktion är lokala • Automatisk minnesallokering • Lagringsklassen static kan användas för statisk allokering • Om en funktion definieras efter att den anropas måste den deklareras innan den anropas, ex: void DelayUs(int x);

  24. Exempel funktion • Exempel på fördröjningsfunktion utan returvärde: void DelayUs(int x){ int y; y= (x - 40) >> 2 ; TMR0= 0xFF - y; while(T0IF == 0){ continue; } T0IF = 0; } • Anropa ovanstående funktion: DelayUs(100);

More Related