Mikrokontrollerit Kontrollerin sisäisten komponenttien käytöstä Mikrokontrollerit Vielä vähän asiaa sisäisten lohkojen käytöstä Sulautetussa järjestelmässä laitteiston ominaisuudet hallitaan ohjelmistolla. Pino Löytyy lähes kaikista piireistä. Last in, first out (LIFO) Yleensä (ei aina) käskykannassa on PUSH ja POP-käskyt pinon käsittelyyn. Sulautetuissa järjestelmissä rajoituksia pinon käytössä. Pinon koko voi olla hyvin pieni. Esim. PIC17C42:ssa 16-tasoinen pino eikä PUSH/POP-käskyjä. Sitä siis voidaan käyttää vain paluuosoitteiden käsittelyyn. Hardwired stack pinorekisterit vain muutama muistipaikka. Eivät tue sisäkkäisiä aliohjelmia tai parametrien talletusta pinoon. Jos pinomuisti on sijoitettu RAM:iin, sen käyttöä rajoittaa silti RAM-muistin koko. Pino ja muuttujat pidettävä erillään. Pinon käytön erikoispiirteitä sulautetuissa järjestelmissä. Kaikkia rekistereitä tai mitään rekistereitä ei talleteta automaattisesti pinoon aliohjelmaan siirryttäessä. Tietoa voidaan siirtää myös rekistereissä. Jos rekistereiden arvoja on talletettava, ne voidaan tallettaa RAM-muistiin muuttujina. Rekisteripankit (8051:ssä neljä).
Mikrokontrollerit Vielä vähän asiaa sisäisten lohkojen käytöstä RAM Assembler-ohjelmoinnissa monesti muuttujat globaaleja. PC-ympäristöstä tutut menettelytavat muuttujien käytössä eivät välttämättä toimi sulautetuissa järjestelmissä. Paikallisten muutujien käytössä sulautetuissa järjestelmissä oltava tarkkana (pino). Ohjelmoijan on usein kerrottava linkkerille, mistä muistialueet alkavat ja tila pinolle on usein varattava manuaalisesti. Muuttujien alustus tärkeää. Kiinteä vai dynaaminen muistinvaraus. Globaalit muuttuja ovat datasegmentissä. Funktiot koodisegmentissä Paikalliset muuttujat sijoitetaan pinoon. Dynaamisille muuttujille varataan tilaa data-alueen lopusta (heap). Pieni työmuisti pakottaa keksimään ratkaisuita esim. circular buffer Mikrokontrollerit Vielä vähän asiaa sisäisten lohkojen käytöstä I/O Mikro-ohjaimissa erilaisia käytäntöjä porttien ohjauksessa. Esim. AVR:ssä erikoisrekisterit sille onko portti input vai output. Esim. kytkinvärähtelyt on otettava huomioon ulkoisia ohjauksia käsiteltäessä. Kyselläänkö vai keskeytetäänkö? Suoritusnopeus Right answer, late, is the wrong answer Hard deadline ehdoton vaatimus toiminnalle. Esim. UART:sta on luettava edellinen tieto ennen kuin sinne kirjoitetaan uutta tietoa. Soft deadline yksittäiset lipsahdukset vaatimuksista sallittuja kunhan keskimääräinen palveluaika on vaatimusten mukainen. Esim. UART:n lukeminen purkurista sallii pieniä viiveitä silloin tällöin, kunhan keskimäärin lukeminen on nopeampaa kuin kirjoitus.
Mikrokontrollerit Sulautettujen järjestelmien ohjelmistosuunnittelusta Sulautetun järjestelmän kehitysvaiheita Systeemisuunnittelu (system evaluation) Laitesuunnittelu (hardware design) Ohjelmistosuunnittelu (firmware design) Integrointi (integration) Testaus (verification) Vaiheet eivät ole aikajärjesteyksessä vaan esim. laite- ja ohjelmistosuunnittelua tehdään useimmiten samanaikaisesti. Aina ei myöskään voida tehtäviä rajata selvästi. Prosessiin kuuluu yleensä myös vaatimusmäärittelyjen ja dokumentaation tekeminen. Oikean prosessorin valintaa vaatimusmäärittelyjen pohjalta käsiteltiin kurssin alkupuolella. Seuraavassa tarkastellaan lyhyesti ohjelmiston toteutukseen liittyviä asioita.
Ohjelmiston kehitykseen ja toteutukseen tarvitaan: Kehitysympäristö tai ainakin kääntäjä/linkittäjä Ohjelmointilaite Debug-työkalut Kehitysympäristöjä sekä piirivalmistajilta että muilta. Assemblerkehitysympäristöjä saatavissa monesti ilmaiseksi. Yksinkertaiset järjestelmät voidaan testata yksinkertaisesti ohjelmoimalla laite ja tutkimalla toiminta. Monimutkaisemmat vaativat parempia työkaluja. Debuggerin avulla voidaan monitoroida ohjelman toimintaa asettamalla ohjelmankeskeytyksiä (breakpoints) haluttuihin kohtiin, jolloin debuggerin avulla päästään tutkimaan suorittimen tilaa, rekistereitä, muistipaikkojen sisältöä ym. Laiteläheisessä ohjelmoinnissa tunnettava järjestelmän komponentit Muistit ja I/O-porttien osoitteet Käytettävissä oleva muisti Rekisterit bittitasolla Jokaisen portin jokaisen pinnin käyttötarkoitus Oheispiirien käyttötapa Kaikki muukin toimintaan liittyvä Ohjelmistoa on helppo muuttaa. (Jos ohjelmisto on hyödyllinen, sitä on tarve päivittää.) Sulautetuissakin järjestelmissä ohjelmistoa päästään testaamaan kunnolla vasta, kun kaikki muu toimii. Projektien aikataulut tiukkoja onko aikaa huolelliseen testaukseen ja dokumentointiin. Miten testata aukottomasti, että ohjelma toimii aina kaikissa tilanteissa. Vaatimusmäärittelytkin ohjelmiston osalta monesti puutteelliset.
Sulautetun ohjelmiston rakenteesta Ohjelmisto sulautettuihin järjestelmiin voidaan rakentaa monella tavalla. On olemassa joitakin tavallisia rakenteita tai toteutustapoja (arkkitehtuureita), jotka ohjaavat funktioiden, keskeytysten ym. käyttöä. Eri lähteissä arkkitehtuurit jaetaan vähän eri tavoin. Valintaan vaikuttavat mm. vaadittavat vasteajat, keskeytysten määrä ja käsittely. Myös käytettävissä oleva suoritin vaikuttaa ohjelmistoarkkitehtuurin valintaan samoin kuin suorittavien tehtävien määrä. Muita vaikuttavia asioita ovat esim. ohjelma- ja datamuistin määrä. Ohjelmistoarkkitehtuureita / toteutustapoja Silmukka (single polling loop, Round-Robin) Yhdessä päättymättömässä silmukassa pollataan kaikkia sisäisiä ja ulkoisia toimintoja (esim. näppäimistöä). Edellyttää, että kaikki prosessit ovat saatavilla kaiken aikaa. Keskeytyksiä ei välttämättä lainkaan / sopii järjestelmiin, joissa ei ajoitusta. Toiminnot prosessorin sallimalla vauhdilla Ei toimi, mikäli jokin prosesseista vaatii lyhyemmän palveluajan kuin loopin suoritus pahimmassa tapauksessa. Uuden ominaisuuden lisääminen voi olla kohtalokasta koko järjestelmän toimivuuden kannalta. while (1) { process1(); process2(); process3(); }
Ohjelmistoarkkitehtuureita / toteutustapoja Tilakone (state machine) Ohjelma on yhdessä tilassa kerrallaan. Ainoastaan ko. tilaan liittyvät funktiot mukana. Jokaisella tilalla oma koodinsa. Haittana voi olla tarve kopioida samat toiminnat useampaan tilaan. Voi helposti johtaa monimutkaiseen rakenteeseen jos paljon toimintoja ja syötteitä. Ohjelmistoarkkitehtuureita / toteutustapoja Monitilakone/silmukka (multiple state machine/polling loop) Jokaisella prosessilla voi olla omat tilansa. Prosessien ajamisesta huolehditaan silmukassa. Inkrementaalinen tilakone (incremental state machine) Jokaista prosessia suoritetaan muutamia käskyjä joka kierroksella riippumatta siitä mitä tehtävät ovat. Joka prosessi huolehtii sisäisestä ohjelman seurannasta ja jatkaa ohjelman suoritusta keskeytyneestä kohdasta seuraavalla kierroksella. Näyttää, että kaikkia prosesseja ajetaan samaan aikaan, joskin hitaasti.
Mikro-ohjain ymmärtää vain konekieltä. Ohjelmia ei käytännössä kirjoiteta konekielellä, assemblerilla kylläkin. Assemblerin käskyt ja osoitusmuodot ovat prosessorikohtaisia ja kytköksissä arkkitehtuuriin. Sulautetussa järjestelmässä ohjelmiston kehitys tapahtuu muualla kuin lopullisessa käyttöympäristössä. Pienet järjestelmät suunnitellaan yleensä PC:llä olevassa kehitysympäristössä. Ohjelma voidaan kirjoittaa millä tahansa tekstieditorilla. On kuitenkin hyviä kehitysympäristöjä, jotka generoivat ohjelmistoa (alustavat rekistereitä, tekevät keskeytyspalveluohjelman rungon, alustavat tiedonsiirtomekanismit, ). Nämä nopeuttavat ohjelmistonsuunnittelua. Lausekielet Sulautettujen järjestelmien ohjelmointiin käytettyjä lausekieliä C, PLM, Java, BASIC. C saatavissa kaikkein pienimpiä kontrollereita lukuunottamatta lähen kaikkiin suorittimiin. C++ ei yhtä laaja tuki. Prosessorien tehokkuuden kasvaessa Java kasvattaa suosiotaan. + Lausekieltä käytettäessä ei tarvitse tietää prosessorin rekistereitä, muistin osoitusmuotoja tai osata prosesorikohtaista konekielistä käskykantaa. + Lausekielen siirrettävyys on paljon parempi kuin konekielen ja onnistuu periaatteessa kääntäjää vaihtamalla. + Samoin uudelleenkäytettävyys ja ohjelman ylläpito ovat helpompia kuin konekielisen ohjelman. + Lausekielen taitajia enemmän. - Kääntäjissä eroja eivätkä pysty samaan kuin ohjelmoija. - Lausekieliset käännösympäristöt kalliimpia kuin assembler - Kielen normaalit ominaisudet eivät kaikki toimi sulautetussa ympäristössä.
Assembler Assembler-ohjelmointi (konekieli) esimerkiksi kun kontrolleri hyvin rajoitettu muistin tai rekistereiden osalta lyhyt, edullinen ja yksinkertainen toteutus tarpeen keskeytyspalvelun nopea suoritus välttämätöntä arkkitehtuurikohtainen symbolisen Mikäli lähdekielinen ohjelma tehty lausekielellä, asembler välivaihe voi olla näkymätön. Kontrollirakenteet kirjoitetaan hyppyjä tai vastaavaa menetelmää käyttäen. Laskutoimitukset joudutaan käsittelemään osaoperaatioina ja välituloksien tallennuksesta on huolehdittava. Konekielessä ei tietotyyppejä samassa mielessä kuin lausekielissä. Kääntäjät/Linkittäjät Objektikoodi paikasta riippumatonta. Linkittäjä yhdistelee ohjelmasta ja kirjastoista käännetyt objektikoodit valmiiksi tulostiedostoksi. Linkittäjä sijoittaa ohjelmafunktiot, pinon ja data-alueet suoraan tiettyihin osoitteisiin muistiin. Ohjelmoija kertoo eri tarkoituksiin käytettävissä olevat muistialueet.
Optimointi Lausekielisiset kääntäjät tarjoavat usein mahdollisuuden eritasoiseen optimointiin. Esim. optimointi vähentää turhaa rekistereiden ja RAM-muistin välistä liikennöintiä. Usein voidaan optimoida joko nopeuden tai muistinkulutuksen suhteen valinta koskee yleensä koko koodia. Jotkin osoitteet voidaan kuitenkin jättää optimoinnin ulkopuolelle. Mikäli sulautettu järjestelmä toteutetaan lausekielisellä ohjelmointityökalulla, kääntäjän pitäisi tukea myös assembler-funktioiden ja -käskyjen kirjoittamista. Volatile! Sulautetun ohjelmiston kehitysympäristöistä Simulaattori PC:ssä toimiva ohjelma, jolla voidaan tutkia ohjelman toimivuutta CPU:ssa. Ei toimi reaaliajassa eikä sillä voi tutkia kaikkia ongelmia. Tarpeen ainakin, jos sulautetun järjestelmän laite ei vielä valmis. Simulaattorissa pystyy seuraamaan mm. muuttujien, I/O-kanavien ja prosessorin rekistereiden tilaa esimerkiksi askeltamalla ohjelmakoodia käsky kerrallaan tai pysäyttämällä ohjelman suorituksen haluttuun kohtaan. Esim. AVR Studio
Sulautetun ohjelmiston kehitysympäristöistä Emulaattori Emulaattori tarjoaa simulointia monipuolisemman ja luotettavamman testausmenetelmän. Matkii todellista suoritinta. Ohjelma ladataan emulaattorin muistiin tai emulaattorin kautta järjestelmän ohjelmamuistiin. Ohjelman suoritus voidaan pysäyttää asetetuista ehdoista ja päästään tutkimaan rekistereiden ja muistin sisältö. Emulaattori voi tukea lausekielen rakenteita (source-level debug). Prosessorikohtaisia ja kalliita. Simulaattorin ja emulaattorin lisäksi muita testauksen työkaluja mm. logiikka-analysaattori ja oskilloskooppi. Sulautetun ohjelmiston testauksesta Järjestelmän integrointi ja testaus Prototyypin testaus edellyttää yleensä laite- ja ohjelmistosuunnittelijoiden tiivistä yhteistyötä. Laitesuunnittelussa tapahtuneita virheitä voidaan paikata ohjelmistolla. Hajoita ja hallitse! Oheislaitteiden testaukseen tarvitaan monesti testiohjelmistoja. Esim. Prosessorin ja muistien toimintaa voidaan testata yksinkertaisella ohjelmistolla, joka ohjaa piirissä olevia ulkoisia liitäntöjä. Näytön testaus kirjoittamalla näytölle testidataa. Keskeytysten testaus voidaan suorittaa vaikkapa asettamalla ja nollaamalla jokin piirin lähdöistä keskeytysten perusteella ja tutkimalla lähdön tilaa oskilloskoopilla. Sarjaportin toimintaa (nopeudet, pariteetit, ) voidaan testata liittämällä laite tietokoneeseen.