22.08.2013 Views

Maskinnära programmering i C och assembler

Maskinnära programmering i C och assembler

Maskinnära programmering i C och assembler

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

Arbetsbok för MC12<br />

{<br />

}<br />

102<br />

__asm(" LDAB %a", c);<br />

__asm(" STAB %a", ML4OUT);<br />

Den slutgiltiga <strong>assembler</strong>koden kan du studera om<br />

du kompilerar med '-S'-flaggan, funktionerna ser ut<br />

på följande sätt:<br />

* unsigned char ML4_DipSwitch( void )<br />

segment text<br />

define _ML4_DipSwitch<br />

_ML4_DipSwitch:<br />

pshy<br />

tfr sp,y<br />

* 0010 |{<br />

* 0011 | __asm(" LDAB %a",0x600 );<br />

.stab stmt 11,2<br />

LDAB 0x600<br />

* 0012 |}<br />

puly<br />

rts<br />

* void ML4_Diodes( unsigned char c)<br />

define _ML4_Diodes<br />

_ML4_Diodes:<br />

pshy<br />

tfr sp,y<br />

* 0015 |{<br />

* 0016 | __asm(" LDAB %a", c);<br />

LDAB 5,y<br />

* 0017 | __asm(" STAB %a",0x400);<br />

STAB 0x400<br />

* 0018 |}<br />

puly<br />

rts<br />

Rätt använt, ger inbäddad <strong>assembler</strong>kod möjlighet<br />

att implementera funktioner på ett mycket effektivt<br />

sätt vare sig det gäller kodstorlek eller prestanda.<br />

Vi måste dock komma i håg att metoden är tveksam<br />

då det gäller skalbarhet (har vi skrivit de optimala<br />

instruktionerna för den använda processorn?) såväl<br />

som portabilitet (fungerar den inbäddade koden<br />

under en annan kompilator).<br />

<strong>Maskinnära</strong> <strong>programmering</strong> med XCC<br />

Vi har nu klarat av det mesta av konstigheterna som<br />

innefattas av en modern utvecklingsmiljö <strong>och</strong> det är<br />

alltså dags för mer konkreta uppgifter med vars<br />

hjälp du kan kontrollera dina kunskaper. Vi<br />

kommer att göra detta genom att återkoppla till alla<br />

tidigare avsnitt i denna arbetsbok.<br />

I detta moment bygger vi succesivt upp ett<br />

programbibliotek med drivrutiner för några MLkort.<br />

Vi visar, med exempel hur drivrutiner för ML4<br />

kan utformas. Därefter specificeras drivrutiner för<br />

tangentbord (ML2) <strong>och</strong> displaykort (ML3) . Din<br />

uppgift blir att konstruera <strong>och</strong> testa dessa<br />

drivrutiner. Då detta är klart kommer vi att sätta<br />

samman alltihop i ett helt nytt programbibliotek<br />

”mllib.e12”. Vi visar hur detta nya<br />

programbibliotet kan underhållas, dvs hur man tar<br />

bort, lägger till eller uppdaterar moduler i<br />

biblioteket. Du ska därefter modifiera dina<br />

testprogram så att de använder biblioteket.<br />

Drivrutiner för ML4<br />

Vi måste börja med att specificera drivrutinerna på<br />

ett entydigt sätt, dvs tala om exakt vad dom utför,<br />

eventuella parametrar <strong>och</strong> returvärden. Vi har här<br />

tre rutiner att specificera:<br />

ML4_DipSwitch<br />

ML4_Output<br />

ML4_7Seg<br />

Vi börjar med ML4_DipSwitch, sedan tidigare<br />

vet vi att detta är en enhet som vi kan läsa en byte<br />

ifrån. En lämplig deklaration blir därför:<br />

unsigned char ML4DipSwitch(void);<br />

dvs en funktion som returnerar en byte. Genom att<br />

dessutom ange denna unsigned försäkrar vi oss<br />

om att inga eventuella typkonverteringar kommer<br />

att ändra på ett värde från funktionen.<br />

Funktionerna ML4_Output <strong>och</strong> ML4_7Seg skriver<br />

en byte till utenheten. Det är lämpligt att skicka<br />

värdet via en parameter. Deklarationerna blir då:<br />

void ML4_Output( unsigned char );<br />

void ML4_Output( unsigned char );<br />

Vi använder definitionsfilen PORTADD.H för<br />

adressdefinitionerna.<br />

Med detta blir nu de båda första funktionerna<br />

triviala. ”Skalet” för våra drivrutiner får följande<br />

utseende:

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!