Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  4 2343
Hei, jeg ligg her i senga å undrer meg over hvordan mikrokontrollere som ATmega o.l. fungerer?

Hvordan kan man få f.eks C-kode til å fungere fysisk? Vet det blir konvertert til maskinkode før den sendes til kontrolleren, men fortsatt så får ikkje jeg til å forstå at tekst kan styre noe fysisk.

Vet det kalles å brenne koden inn på kontrolleren når man overfører den til kontrolleren, er dette fysisk brenning, at den danner noen form får spor inni kontrolleren? Eller er dette bare ett uttrykk?

Hadde vært fint om noen kunne forklart meg hvordan en mikrokontroller fungerer, og hvordan den kan behandle ting som if, while å slike setnigner.
Sitat av Masi Vis innlegg
Vet det kalles å brenne koden inn på kontrolleren når man overfører den til kontrolleren, er dette fysisk brenning, at den danner noen form får spor inni kontrolleren? Eller er dette bare ett uttrykk?
Vis hele sitatet...
Man bruker gjerne flash-minne til slik. Du kan lese om hvordan flash-minne fungerer her: http://en.wikipedia.org/wiki/Flash_m...s_of_operation

Sitat av Masi Vis innlegg
Hadde vært fint om noen kunne forklart meg hvordan en mikrokontroller fungerer, og hvordan den kan behandle ting som if, while å slike setnigner.
Vis hele sitatet...
Alt gjøres som du sier om til maskinkode og lagres i et programminne/instruksjonsminne. Maskinkoden er instruksjoner som er bygd opp av en serie binærtall, ofte representert heksadesimalt i datablader o.l. for økt lesbarhet. En instruksjon kan for eksempel være å flytte en verdi til arbeidsregisteret, flytte en verdi til dataminnet, hoppe til en annen instruksjon på en gitt adresse i instruksjonsminnet, kjøre verdien i arbeidsregisteret sammen med en annen verdi til en ALU (Arithmetic Logic Unit) for å utføre en eller annen form for matematisk operasjon, sette en verdi på en output-port, kopiere en verdi fra en input-port til arbeidsregisteret, og så videre. Alle disse operasjonene er oppbygd av en voldsom mengde logiske porter (and, or, xor, osv.), shift-registere, latcher, buffere og liknende, og er gjerne oppbygd som moduler som kommuniserer via egnede interne busser.
C koden blir først skrevet om til ASM-kode i de fleste tilfeller. (gjerne med optimaliseringer). Ved å lese denne koden kan du enkelt se hva som gjøres i mikrokontrolleren.

Dette blir som provo sier skrevet om til binær maskinkode, som er delt opp i ulike instruksjoner. Dette er veldig likt med hva som skjer i en datamaskin. Instruksjonssettene er veldig forskjellige, men om du er interesert i å forstå dette vil jeg anbefale deg å ikke se på intel sin versjon; da denne er veldig kompleks og vanskelig å sette seg inn i. Da vi gikk gjennom dette forrige semester brukte vi MIPS sitt instruksjonssett for å forstå hvordan ting fungerte.

Vi brukte da boken "Computer organization and design" David A- Petterson. Denne tar for seg hvordan prosessoren fungerer og hvordan C kode blir til ASM og videre til maskinkode. Forskjellen mellom hvordan en enkel prosessor og en mikrokontroller fungerer er relativt liten.

Om ønskelig kan jeg prøve å forklare litt bedre senere, når jeg har bedre tid.
Det du egentlig lurer på er hvordan en CPU / prosessor funker. Digital logikk og flashminne.
Ok, er nå hjemme igjen fra forelesning og skal prøve å gi en enkel introduksjon til hvordan dette henger sammen - og hvordan en prosessor klarer å faktisk utføre kommandoer som du har skrevet i tekst. Jeg til ta for meg instruksjonsettet til MIPS her som et eksempel.

Jeg vil kun ta en enkel introduksjon her, og henviser deg til boka vi hadde som pensum forrige semester om du vil ha en mer dyptgående forståelse. Denne boken syntes i hvertfall jeg var veldig god. "Computer Organization and design - The Hardware / Software interface" Av David A Petterson

Hvordan er en (mikro)prosessor bygget opp?`
En prosessor består i hovedsak av følgende enheter:
  • Instruksjonsminne - Dette er et lite minne hvor alle instruksjonen til programmet blir lastet inn. Disse ligger i sekvensiell rekkefølge, slik at den begynner på toppen og blar seg gjennom instruksjonene.
  • Dataminne - Et minne hvor alle variabler lagres, kan være samme minne som instruksjonsminne, bare med annet interface.
  • Register - Om du er kjent med assembly så har du vært borti registere, de lagres i hvertfall her. Og er et lite utvalg av små variabler som man kan lagre for å raskt skrive og lese verdier som ikke trengs å lagres i minne.
  • Kontrollenhet - Enheten som styrer hvordan prosessoren behandler de ulike instruksjonen. F.eks. bestemmer den om ALU skal gjøre en addisjon eller subtraksjon.
  • ALU - En aritmetisk-logisk enhet. Enheten i maskinen som kan ta for seg enkle logiske operasjoner som ADD, SUB, OR, AND og XOR, med hensyn til 2 inputs og et kontrollsignal.
  • +++ en del andre små logiske enheter som jeg ikke vil ta for meg

Maskinkode, hva er det?
Maskinkode er kommandoer som er skrevet i binær, hvor hver enkel "binær-streng" er en enkel kommando. I MIPS er hver binær-streng 32 bits. Denne maskinkoden kan man skrive selv om man ønsker det, men det er ikke anbefalt; da debugging av maskinkode er utrolig tungvindt. Er derfor mer anbefalt å enten skrive assembly eller C og bruke en kompilator som gjør om koden til maskinkode for deg.

I MIPS har man i hovedsak 3 forskjellige typer instruksjoner, som brukes i ulike tilfeller - og er bygget opp på ulike måter, men alle 3 typene har en likhet med at de første 6-bitsene i strengene er et OP-felt som leses av kontrollenheten, som beskriver hva slaks type instruksjon dette er. På denne måten kan kontrollenheten sette riktige kontrollsignaler til de andre enhetene. (f.eks. om det skal skrives til register, om ALU skal brukes o.s.v.

- R-Type instruksjoner:
Dette er instruksjoner hvor det skal utføres en logisk operasjon på 2 registere.
"add t3,t2,t1" dette er et eksempel på en R-type instruksjon.
En R-type instruksjon er bygget opp på følgende måte:
OP (6) - rs (5) - rt (5) - rd (5) - shamt (5) - funct (6)
Hvor hvert tall representerer hvor mange bits hver felt er på.
OP-feltet har vi allerede snakket opp. RS og RT er her bitsene som representerer adressen til de 2 registeradressene prosessoren skal lese fra. Om man tar for seg assemblykoden over vil dette være henholdsvis register t1 og t2.

RD-felter er adressen til registeret hvor svaret på en eventuell logisk operasjon skal lagres. I vårt tilfelle blir dette register t3.

Funct-feltet er det som sendes til alu-kontrollen, og sier kort og enkelt om aluen skal gjøre en ADD, SUB... (osv).

Jeg velger å ikke ta for meg I-type og J-type instruksjoner, men de er relativt enkle. Du kan lese mer om de om du ønsker.

Hvordan henger alt sammen?
Det hele begynner med at den leser første intruksjon fra minnet, vi anntar den leser følgende instruksjon:
add t2,t2,t1 (Binært: 000000 01010 01001 01010 00000 100000)

Kontrollenheten leser de første 6 bitsene (OP-koden) og ser at dette er en R-type instruksjon. Den setter derfor kontrollsignaler som sier følgende:
- Ikke lese til minne
- Ikke skrive til minne
- Skal lese fra register
- Skal skrive til register
- ALU skal gjøre utregning
(igjen husk at alt er forenklet)

Registeret leser så ut verdiene fra register t1(=01001) og t2(=01010), og sender disse til ALUen.

Kontrolleren til ALU-en leser så func-feltet til den binære kommandoen (som her er 100000) og forstår at dette er en ADD-instruksjon. Den ser og at den har fått beskjed av kontrollenheten til prosessoren at den skal gjøre en utregning, og gjør derfor denne addisjonen og sender svaret tilbake til registeret.

Registeret vil så lagre verdien fra denne utreningen i register t2 (=01010, som er adressen den hentet fra RD-feltet)

Neste instruksjon blir så lastet fra instruksjonsminne, og utført på samme måte.

Dette var veldig kort, og veldig forenklet forklaring. Håper du forstår noe mer enn før i hvertfall. Men vil anbefale deg å ta å lese boken jeg anbefalte, da spørsmålet ditt i hovedsak er besvart med cirka 600 sider i den boken; så blir litt vanskelig å korte det ned til en post på et forum.


Her er et forenklet bilde av hvordan en MIPS-prosessor er bygs opp, kanskje det er til hjelp: Her er det noen deler jeg ikke har tatt for meg, som f.eks. de enhetene øverst på bilde, og PC (program counter). Dette er enhetene som tar seg av hvilken adresse neste instruksjon ligger på. Det er og llagt inn støtte for branching (typisk til løkker)
http://inst.eecs.berkeley.edu/~cs61cl/fa07/diagrams/5.17.png

Du spør spesifikt om hvordan den hånderer if og while løkker, for å forklare dette er det greit å kunne litt assembly, slik at man vet hvordan dette håndteres der med hensyn til "Branching".

En instruksjon som brukes i assembly er i hvertfall bne (branch, if not equal) og be (branch if equal), hvor den sammenligner 2 registere og hopper til en adresse hvis verdien i disse er like.

Dette er da en I-type instruksjon, som er bygget opp på følgende måte:

OP(6 bits), RS(5 bits), RT(5 bits), immidiate(16 bits)

Her sier OP-koden at dette er en I-type branch operasjon. Prosessoren vil da laste inn verdiene i register RS og RT og sammenligne disse. Dette gjøres ved at verdiene RS og RT sendes til ALU-en som gjør en subtraksjon av disse, og ser om svaret fra substraksjonen er 0. Om svaret er 0 (eller ikke 0, om man bruker "BNE") vil den normale programmteleren (som styrer hvilken instruksjon som er den neste til å utføres) overstyres, og den vil i stede lese instruksjonen som ligger i adressen som immediate-feltet i binær koden peker til.

Om noe er uklart, eller noe du vil ha forklart bedre er det bare å spørre.