Lathund. C för inbyggda system



Relevanta dokument
Lathund. C för inbyggda system

Lathund. Pacific C för MS-DOS

#include <pic.h> #include <sys.h> char LEFT,RIGHT,MOTORHASTIGHET;

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

INGENJÖRSHÖGSKOLAN INGENJÖRSHÖGSKOLAN

Realtidsprogrammering. En introduktion Implementering (med exempel från PIC)

Enkla datatyper minne

TDIU01 - Programmering i C++, grundkurs

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

F4. programmeringsteknik och Matlab

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Klassdeklaration. Metoddeklaration. Parameteröverföring

Att använda pekare i. C-kod

LEU240 Mikrodatorsystem

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Föreläsningsanteckningar till Konstruktionsmetoder

Programmeringsteknik med C och Matlab

Data, typ, selektion, iteration

1 Datorn som miniräknare. 1.1 Räkneoperationer. 1.2 Variabler

"Crash Course in Programming"

TDIU01 - Programmering i C++, grundkurs

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

PROGRAMMERING 2 GRUNDLÄGGANDE SEMANTIK 4

Programmering A. Johan Eliasson

Arduinokurs. Kurstillfälle 4

Elektroteknik MF1016 föreläsning 9 MF1017 föreläsning 7 Mikrodatorteknik

Realtidsprogrammering

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

F5: Högnivåprogrammering

F5: Högnivåprogrammering

C-programmering, föreläsning 1 Jesper Wilhelmsson

Variabler och konstanter

2.1 Variabler. 2.2 Regler för namngivning i C. Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Föreläsning 2

Datorteknik 2 (AVR 2)

Översikt Introduktion DST 1. Nicholas Wickström. IDE, Högskolan i Halmstad. N. Wickström

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

Föreläsning 3: Booleans, if, switch

Ansvarig lärare: Olof Andersson, Telefon (besöker skrivsalen)

Grunderna i C++ T A. Skapad av Matz Johansson BergströmLIMY

Övningsuppgifter STYRNING - i Mikrodatorteknik för U2 2010

Introduktion C-programmering

1 Funktioner och procedurell abstraktion

Parameteröverföring. Exempel. Exempel. Metodkropp

Twincat: PLC Control

Programmering i C, 7,5 hp

SMD 134 Objektorienterad programmering

Kontrollskrivning Mikrodatorteknik CDT S2-704

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

A-del motsvarande KS1

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Visual Basic, en snabbgenomgång

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

GPT- föreläsning 10. För en vecka sedan Problemlösning på lägre nivå kan sortera funktioner Förra gången

float Mindre rella tal ( floating point number ) double Rella tal/flyttal ( double precision floating point number )

Högskolan i Halmstad Digital- och Mikrodatorteknik 7.5p. Lista på registeruppsättningen i PIC16F877A Datablad TTL-kretsar 74-serien

Microprocessor / Microcontroller. Industrial Electrical Engineering and Automation

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Imperativ programmering. Föreläsning 2

Logik och kontrollstrukturer

Hantering av textsträngar och talsträngar. William Sandqvist

I denna laboration undersöker vi hur aritmetiska beräkningar utförs. Vi tittar på olika variabeltyper: 8-bitars, 16-bitars, 32-bitars och flyttal.

Pascal... Pascal. Pascal... Pascal...

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

En kort text om programmering i C.

C++ - En introduktion

Repetition C-programmering

Programexempel 1 AND-funktionen

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Användarhandledning Version 1.2

Programmeringsteknik I

Laboration 4: Knappstuds Drivrutiner för att eliminera störningar.

Föreläsning 4. Val, boolska värden, läsbarhet, osv

Lösningar till tentamen i EIT070 Datorteknik

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Programmering av inbyggda system. Kodningskonventioner. Viktor Kämpe

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Beräkningsvetenskap föreläsning 2

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

Assemblerprogrammering för ARM del 2

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

Systemkonstruktion LABORATION REALTIDSPROGRAMMERING

Föreläsning 3-4 Innehåll

Övningsuppgifter till föreläsning 2 Variabler och uttryck

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

Föreläsning 7. Nyckelord I Java. Uttryck. Uttryck, Operatorer Och Kontrollflöden

Introduktion till algoritmer - L0 - Grunder i C++ Matematikgymnasiet, Läsåret L0 - Grunder i C++

PC-teknik, 5 p LABORATION ASSEMBLERINTRODUKTION

Övning2. Variabler. Data typer

Objektorienterad programmering i Java

F2 Datatyper och variabler. ID1004 Objektorienterad programmering Fredrik Kilander

Variabler, värden och typer

Digital- och datorteknik

Översikt över Visual Basic

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDIU01 - Programmering i C++, grundkurs

Transkript:

Lathund C för inbyggda system Revision 2 2001-04-13 Anders Arvidsson Jonny Martinsson Synpunkter välkomnas!

Innehållsförteckning 1 Introduktion... 3 1.1 Assembler kontra C... 3 1.2 Kodexempel... 3 1.3 MPLAB... 4 2 ANSI-C... 5 2.1 Programstruktur... 5 2.2 Flödeskontroll... 5 2.2.1 Satser och block... 5 2.2.2 Slingor... 6 2.2.3 Villkor... 8 2.3 Typer, operatorer och uttryck... 10 2.3.1 Deklarationer av variabler... 10 2.3.2 Matriser... 10 2.3.3 Minnesbanker... 11 2.3.4 Simulering av variabler... 11 2.3.5 Talrepresentation... 12 2.3.6 Matematiska operatorer... 12 2.3.7 Bitvisa operatorer... 12 2.3.8 Logiska operatorer... 13 2.3.9 Relationsoperatorer... 13 3 Programstruktur... 14 3.1 Preprocessor... 14 3.2 Blanda C och assembler... 14 3.3 Funktioner... 15 2

1 Introduktion Detta dokument beskriver hur en inbyggnadsprocessor kodas i C. De delar av språket som inte lämpar sig för inbyggnad utelämnas därför. Verktygen som används är MPLAB (utvecklingsmiljö, simulator) och HI-TECH PIC-C (kompilator). 1.1 Assembler kontra C Några argument för C: Avlusningen går betydligt snabbare i C, då en rad assembler tar lika lång tid att avlusa som en rad C, men C-koden är betydligt kortare. C ger möjligheter att återanvända kod i större utsträckning. C ger betydligt större möjlighet att strukturera sitt program. C är ett standardiserat sätt att skriva program, vilket ger möjlighet att flytta koden mellan olika processorer. Några argument för assembler: Assembler ger fullständig kontroll över tider. Att skriva i C gör att man är utlämnad till kompilatorns sätt att göra assemblerkoden. Vid en kompilatorbugg blir det därmed svårt att komma vidare. Som regel kommer C-koden att kräva större programminne beroende på kompilatorns svagheter. Genom att kombinera C och assembler blir det möjligt att dra nytta av fördelarna med båda språken. 1.2 Kodexempel Samma funktion skriven med olika språk: C-kod void main(void) if (LEFT == RIGHT) MOTORHASTIGHET = 0xFF; else MOTORHASTIGHET = 0; while(1) continue; Assembler P16F84: MOVFW LEFT ; Flytta LEFT till W-registeret 1 cykel 1 word XORWF RIGHT,W ; Jämför LEFT med RIGHT 1 cykel 1 word BTFSC Z ; Om LEFT=RIGHT blir Z=1 2 cykel 1 word GOTO PLATTAN 1 cykel 1 word CLRF MOTORHASTIGHET 1 cykel 1 word GOTO SLUT 1 cykel 1 word PLATTAN: MOVLW 0xFF 1 cykel 1 word MOVWF MOTORHASTIGHET 1 cykel 1 word SLUT: GOTO SLUT 1 cykel 1 word 3

1.3 MPLAB MPLAB är en integrerad utvecklings miljö för alla PIC-processorer. Den innefattar editor, simulator och möjlighet att programmera kretsar. Från MPLAB sker även assemblering eller kompilering. Den eventuella assemblatorn eller kompilatorn finns inte i MPLAB, utan dessa ligger som externa program som anropas från MPLAB. PIC-C kommer från tredjepartsleverantören HI-TECH. MPLAB stödjer denna kompilator, vilket medför att C kan skrivas, kompileras och simuleras i programmet. Utvecklingsmiljön i MPLAB 4

2 ANSI-C ANSI-C är en standard som gör det möjligt att flytta program mellan olika miljöer och kompilatorer. C++ innefattar ANSI-C som en delmängd, men är därutöver påbyggd med en mängd funktioner som inte behöver vara flyttbara mellan olika kompilatorer. Nedan följer en kort genomgång av oftast använda delar av ANSI-C. Detta läsas gärna i anslutning till ett större kodexempel. 2.1 Programstruktur Initiering Huvudprogram ISR Efter reset kommer processorn att anropa funktionen main(). I denna funktion skall initiering och huvudprogram ligga. Vid interruptförfrågan avbryts huvudprogrammet tillfälligt och funktionen ISR() (Interrupt Service Routine) exekveras. 2.2 Flödeskontroll 2.2.1 Satser och block Sats Block Kommentar En sats avslutas med ett semikolon. Flera satser kan knytas samman till ett block, vilket syntaktiskt är lika med en enda sats. 5

2.2.2 Slingor For for (startvärde; villkor; steguttryck) Exempel for (x=0; x<10; x++) Led ^= 1; //Blinka lysdiod Delay(); Kommentar For-satsen utförs så länge villkor är uppfyllt. Var och en av parametrarna kan utelämnas, men semikolonen måste vara kvar. While while (villkor) Exempel while (1) Led ^= 1; Delay(); //Blinka lysdiod för evigt Kommentar While-satsen utförs så länge villkor är uppfyllt, eller mer precist, så länge uttrycket i parentesen inte är = 0. 6

Do - while do while (villkor) Exempel do Led ^= 1; Delay(); while (!knapp) //Blinka lysdiod tills knapp trycks Kommentar Satsen utförs minst en gång, eftersom villkoret testas först efter en körning. Break break; Exempel while (1) Led ^= 1; Delay(); if (knapp) break; //Blinka lysdiod för evigt // såvida inte knappen trycks Kommentar Break orsakar en direkt avslutning av do, for, while och switch. 7

2.2.3 Villkor If - else if (villkor) else if (villkor) else if (villkor) else Exempel if (10 == x) Led ^= 1; //Toggla lysdiod när x = 10 Kommentar Else-satserna utförs endast när det egna villkoret uppfylls, men inget av ovanstående. Varje else-if bör avslutas med en else som körs om inget villkor uppfylls. Denna konstruktion används även när minst ett villkor alltid förväntas uppfyllas, detta för att indikera fel. Det felaktiga villkoret i if (x = 10) skulle vara svårt att finna, då det uppfyller sig självt. Genom att vända på uttrycket kommer kompilatorn att indikera det syntaktiska felet. 8

Switch switch (uttryck) case konstantuttryck: satser; case konstantuttryck: satser; default: satser; Exempel switch (CycCnt) case 0: K(); S(); break; case 1: case 2: K(); break; // Var 10:e ms // 0 ms // Krocksensor // Styr robot // 10, 20 ms default: CycCnt = 0; beak; Kommentar Heltalet i uttryck avgör till vilken etikett programmet hoppar (= konstanten efter case). Break behövs för att förhindra exekvering av efterföljande satser. Programmet hoppar till default om inget annat fall uppfylls. Ordningen mellan de olika fallen spelar ingen roll. 9

2.3 Typer, operatorer och uttryck 2.3.1 Deklarationer av variabler I HI-TECH C kan följande variabeltyper deklareras. Typ Storlek i bitar Arimetisk typ bit 1 boolean char* 8 signed or unsigned integer unsigned char 8 unsigned integer short 16 signed integer unsigned short 16 unsigned integer int 16 signed integer unsigned int 16 unsigned integer long 32 signed integer unsigned long 32 unsigned integer float 24 real double 24 or 32 real *char är som default unsigned, vilket kan ändras i <Node properties>. Deklarationer kan göras flera sätt. Vi kommer att behandla: global, lokal och statisk och konstant. Global: Deklarationen görs utanför en funktion, i början av programmet. Variabeln kommer därmed att bli tillgänglig för alla funktioner. Nackdelen är att variabeln tar upp plats även då den inte används. Lokal: Deklareras inuti funktionen. Dessa variabler är bara tillgängliga i den funktion de deklareras i, vilket innebär att minnesutrymmet kan återanvändas. För att kunna visa dessa i MPLAB krävs tillägget -fakelocal i <Node properties> under Additional Command Line Options. Statisk: Om variabeltypen föregås av static kommer denna att beredas en statisk plats i minnet redan vid kompileringen, oavsett variabeltyp. Detta innebär t ex att variabeln kommer behålla sitt värde mellan funktionsanropen, även om den är lokal. Konstant: Om variableltypen föregås av const talar detta om för kompilatorn att värdet aldrig kommer att ändras. Det ger kompilatorn möjlighet att lägga denna variabel (konstanten) i programminnet. När const används måste tilldelning ske redan vid deklaration. 2.3.2 Matriser Vid deklaration av matriser används matrisindex []. Exempel på 2-dimensionell matris med 2 rader och 3 kolumner: const char demo[2][3] = 1, 2, 3 4, 5, 6 ; Första elementet har index 0. Exempel: tilldela variabeln x värdet 6 (rad 2, kolumn 3) x = demo[1][2]; 10

Ofta är det praktiskt att använda endimensionella matriser för att beskriva bit-mönster eller look-up tabeller. Exempel: En rinnande ljus skapas med fyra pinnar på PORT B const char pattern[4] = 0b00000001, 0b00000010, 0b00000100, 0b00001000,; while (i < 5) PORTB = pattern[i]; Delay(); i++; 2.3.3 Minnesbanker I de större PIC-processorerna är minnet indelat i banker. För att kunna utnyttja hela RAM-minnet måste en del variabler manuellt placeras i andra banker än bank0 (=default). Detta sker vid variabeldeklarationen enligt exemplen nedan. bank1 char DATA[12][4]; bank2 long temp1, temp2; 2.3.4 Simulering av variabler I MPLAB kan variabler visas i Watch-window. Förutsättningen är att rätt variabeltyp anges. HI- TECH sparar alltid variablerna med lägst signifikant byte först. Nedan visas hur ett flyttal, som lagras på trunkerat IEEE-format, konfigureras. 11

2.3.5 Talrepresentation Talrepresentation kan ske på följande sätt: Talbas Format Binär 0b följt av talet Ex 0b10100001 Decimal Skrivs på vanligt sätt Ex 123 Hexadecimal 0x följt av talet Ex 0x3E ASCII (Ingen talbas ) Tecknet skrivs inom Ex B (= 66 decimalt) 2.3.6 Matematiska operatorer Operator + addition - subtraktion * multiplikation / division Förklaring % modulus (returnerar resten) = större än variabel++ ökar variabel med 1 variabel-- minskar variabel med 1 Exempel: a = b % c; // a tilldelas resten vid division av heltalet b med heltalet c a++; // a = a + 1 2.3.7 Bitvisa operatorer ~variabel & Operator Förklaring bitvis invers av variabel bitvis AND bitvis OR ^ bitvis XOR << n skifta n steg vänster >> n skifta n steg höger Exempel: svar = (A >> 5) & 1; // Skiftar bit 4 till bit 0 och maskar sedan ut bit 0 Om A sätts till 0010001b kommer svar att bli 1. 12

2.3.8 Logiska operatorer I C räknas allt > 0 som SANT och 0 som FALSKT. Operator Förklaring! logisk invers && logisk AND logisk OR == likhet!= olikhet 2.3.9 Relationsoperatorer Operator Förklaring > större än >= större än eller lika med < mindre än <= mindre än eller lika med <> inte lika med 13

3 Programstruktur 3.1 Preprocessor Genom att kunna ersätta värden, uttryck, tecken mm med en egen vald förklaring kan programmet göras mer lättläst. #define timervalue 217 #define WatchDogTimerClear() asm("clrwdt") När kompilatorn hittar timervalue i programkoden, kommer den att ersätt uttrycket med talet 217. Det funktionsliknande uttrycket WatchDogTimerClear() kommer ersättas av assemblerinstruktionen clrwdt, som nollställer processorns watchdog. Observera att rader som börjar med # utgör instruktioner till preprocessorn och därför inte avslutas med ;. 3.2 Blanda C och assembler Ibland går saker smidigare i assembler, som t ex rotera via carry, eller tidsfördröjningar via NOP. Det finns också tillfällen då timing eller kodstorlek kräver att vissa delar av koden skrivs i assembler. Det finns två sätt att direkt infoga assembler i C-kod, asm( ) och #asm, se nedan. #include <pic.h> #include <sys.h> char hextal; void main(void) TRISB = 0; // Port B utgång hextal = 0x25; // Lägger hex 25 i hextal asm("swapf _hextal,f"); // Swappar nibblar i hextal PORTB = hextal; // Hex 52 läggs på porten #asm // Start på assemblerblock nop ; Genererar fördröjning på 3 cykler nop ; Observera att ; = kommentar nop #endasm // Slut på assemblerblock PORTB=0; // Nollställer porten För att assemblerkoden ska hitta hextal krävs att variabelnamnet föregås av ett _. Konstruktionen asm("swapf _hextal,f"); utgör C-syntax och fungerar bra varhelst det används. #asm är däremot inte någon C-kod och kan därför inte användas i alla situationer, t ex inne i en if-sats. Tänk på att det är svårt att veta t ex vilken RAM bank som är aktiv vid hantering av portar och TRIS-register via assemblerinlägg. Kompilera gärna hela koden till assembler och kontrollera! 14

3.3 Funktioner Funktioner används för att få en bättre struktur och mer återanvändbar kod. En funktion kan ha inoch utparametrar, detta är dock inte nödvändigt. Hur funktioner skrivs visas med följande exempel. Programbeskrivning: Talen A och B skall multipliceras med varandra. Svaret skall sedan tilldelas variabeln C. Observera att variablerna A och B är char medan C är integer. #include #include <pic.h> <sys.h> char A, B; int C; int mult(char a, char b) return a * b; // a,b är lokala variabler // Multiplicerar talen a och b med varandra void main(void) A = 10; B = 212; C = mult(a, B); while(1) continue; // Continue = kör while-loopen igen. 15