Maskinnära programmering i C och assembler
Maskinnära programmering i C och assembler
Maskinnära programmering i C och assembler
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: