
Vihdoin vanhallakin välähtää. Yleensä pyrin ahtamaan artikkeliin kamalasti tauhkaa, mutta mietin että nytpä olisi hyvä idea kirjoittaa samaan tahtiin, kun opettelen itse kirjoittamaan koodia Androidille.
Taustana on javaa ja kahvia; sinänsä artikkeli ei tule olemaan kovin teknisesti haastava, vaan enemmänkin joriseva ja mobiilimaailmaa kahlaileva. Toivon, että se innostaa porukkaa tutustumaan oman puhelimensa ohjelmoitavuuteen, ja kenties voi olla jollekulle ponnahduslauta ohjelmoinnin jaloon maailmaan.
Kirjoitan myös hieman puhelinteknologiasta ja verkoista, sikäli kun ymmärrän niitä itse. En ole tämän alan ekspertti, vaan enemmän keskittynyt nimenomaan kirjoittamaan koodia, käyttöliittymiä ja selittämään näitä kahta. Mobiilikoodi on ollut oppimislistalla pitkään, mutta joskus homma on aloitettava. Androidin myötä tulee selkeä Java-rajapinta, joka näyttää hyvin puhtaalta ainakin tällaisen keltanokan silmään.
Artikkelisarja on jaoteltu näin:
- osa: “miten ennen kaikki oli paremmin, ja nykyhetken kauhistelu”
- kädet taskusta ja ohjelmointityökalujen asennus koneeseen
- äh, ei se toiminutkaan?!
- No nyt saatiin tulosta!
- Mitä kannattaa tutkia taitojen parantamiseksi?
Vanhana ohjelmoijana varmaan kaihtaa helposti monimutkaisen näköisiä sovelluskehitysalustoja. Sitä on aikoinaan tottunut ensin kirjoittamaan lähdekoodin pienellä tehokkaalla editorilla, ja perään kääntämään sorsan valmiiksi ohjelmaksi valonnopealla Borlandin kääntäjällä.
En koskaan oikein jaksanut perehtyä Symbianiin tai muihin mobiilialustoihin; Symbianin dokumentteja vilkaisin, mutta muutamien tuntien pähkäilyn jälkeen olin edelleen tuskastuttavasti lähtökuopissa ja silmissäni vilisi käsittääkseni noin 7-8 eri kehitystyökalun pakkopulla… joten jätin sen kesken.
Palm-koodaus oli joskus mielessä, mutta aika ajoi ohi. Omistin ylpeänä Psion Revo taskutietokoneen vuoden 2000 kieppeillä, ja näpyttelin sitä aina bussimatkoilla Otaniemen ja Espoon Piilaakson välillä. 🙂 Nuo PDA-laitteethan eivät (yleensä) olleet vakiona verkoissa, tosin osan niistä sai käyttämään erilaisia kommunikointimuotoja jos jaksoi hikoilla ja jumpata tekniikkaa.
Toki 1990-luvun omat projektit tosiaankin olivat aivan erilaisia. Tein suurinpiirtein 400-500 ohjelmaa huvikseni tietokoneille. Alustoina olivat pienet kotitietokoneet ja PC; yleensä kielivalintana Pascal + assembler. Ohjelmat löytyvät vieläkin kovalevyltä, ja niihin on joskus tosi kiehtovaa palata – katsomaan, miten silloin ajatteli, miten koodasi, ja erityisesti myös: miten suuri merkitys oli tiimiytymisellä, ideoiden jakamisella kavereiden kesken ja yhteisillä koodisessioilla.
Olimme tavallaan “agile” jo silloin 1990-luvun alkupuolella, 13-15 -kesäisinä teineinä. Juomat olivat tutut: kahvi, Cokis ja vesi.
Välillä mentiin konekieleen, tai pamauteltiin suoraan muistipaikkoihin bittejä heksaeditorilla. Joskus käyttöjärjestelmä loogisesti näytti ohjelmoijakokelaalle, mitä tapahtuu kun annetaan vääriin kohtiin sähköshokkeja – sehän kaatui suorilta jaloilta. Ei muuta kuin bootti, ja takaisin kokeilemaan.
Androidissa olen huomannut yhden merkittävän piirteen: ohjelmien ajonaikainen koodi+muistinkäyttö on yllättävän pientä. Osa ohjelmista on vain muutaman 10 Kilotavun, joka on todella pientä tämäntyyppisessä maailmassa. Tietenkin isoimmat ovat 10 megatavun luokkaa. Yleensä mobiiliohjelmia on nimenomaan vaivannut se paradoksi, että ne ovat kuin elefantit syrjäkylän antiikkiliikkeessä. Kun rajoitteet ovat olleet pahimmat, koodi on ollut aika bloattia.
Tuonaikaisten PC:eiden käynnistymisaika oli kovalevyjen markkinoilletulon jälkeen erittäin hyvä – sitten myöhemmin graafisten käyttöjärjestelmien kompleksisuuden myötä ajat venyivät; ja kohta ne taas trimmautuvat, kun Googlen käyttöjärjestelmää alkaa olla saatavilla kera SSD-muistin.
Jokaisen mobiilialustan periaatteet ovat oikeastaan aika samanlaiset. Tosin iPhone:n IOS:stä en ole saanut kokemusta. Mutta olettaisin että seuraavanlaista sielläkin on:
- rauta = sensorit (kamera, kiihtyvyys), prosessori, muisti
- mahdollisesti eriytetty kriittisten prosessien käyttöjärjestelmä
- varsinainen käyttäjätason “vapaa” käyttöjärjestelmä, jossa saa melskata ja kirjoitella jätkänshakkiohjelmia
Kuten tietokone, myös puhelin on käytännössä arkkitehtuuriltaan kuin pieni tietokone. Eikä enää niin pienikään. Nykyisissä älypuhelimissa pörrää jo lähelle 1 GHz:n nopeuksiset prosessorit. Androidissani (ZTE Blade Android2.2) on 700 MHz prossu. Se tuntuu toimivan yllättävän hyvin, ja kaikkialla käyttöliittymä on siedettävän jouhea.
Mobiilikäyttöjärjestelmiä on itse asiassa kymmeniä, mutta joudun keskittymään artikkelissa periaatteessa Google Androidiin ja hitusen pystyn avaamaan myös Symbianin historiaa.
Puhelimissa on niinikään PC-maailmaa mallintaen myös esimerkiksi näytönohjain, eli pääprosessorilta otetaan grafiikan luomisen ja päivityksen taakka pois ja annetaan erikoistuneen grafiikkaprosessorin hoitaa homma näpsäkästi.
Klassisesti aivan alkuaikojen puhelimet olivat hyvin suljettuja järjestelmiä, joihin pystyi korkeintaan vääntämään muutaman bitin haluamakseen jollain erikoisohjelmalla (esimerkiksi puhelimen ikonit saattoi piirtää pikseli kerrallaan, tai apuohjelmalla pystyi PC:llä luomaan omia soittoääniä). Joka tapauksessa tällöin oltiin vielä kaukana nykyisestä avoimesta arkkitehtuurista.
Puhelimen suunnittelijan kannalta haasteellista itse asiassa on keskeytykset. Keskeytyksiä tapahtuu, kun puhelimen prosessori saa signaalin ulkoisesta tapahtumasta: sisääntuleva soitto, saapuva tekstiviesti, mahdollisesti myös tukiaseman vaihtuminen toiseen; oleellista on, että käyttöjärjestelmän koodi käsittelee keskeytyksen hyvin nopeasti – tai tarkemmin sanottuna, ottaa sen käsittelyyn. Nimittäin jos tämä koppi jää tekemättä, voi esimerkiksi puhelu jäädä kuulematta, tai muuta – eihän se kuolemanvakavaa ole, mutta vastannee nyt kuitenkin suurinpiirtein samaa kuin catwalk-mallin kompastelu maahan.
Perinteisesti keskeytysten käsittelyssä on kaksi strategiaa: se voidaan kokonaan nakittaa ulkopuoliselle raudalle (prosessorille), tai keskeytykset otetaan prioriteettijonoon ja niitä pyöritetään resurssien ja tarpeiden mukaan yhdellä prosessorilla. Joka tapauksessa myös useamman prosessorin mallissa pääprosessorin pitää jollain tapaa tietää mitä ulkomaailmassa tapahtuu, joten kommunikointi on tarpeen.
Keskeytysten yhteydessä voit törmätä termiin IRQ – interrupt request. Nämä ovat “nimitauluja”, itse asiassa vektoreita eli laskeutumisosoitteita. Osoitteen päästä löytyy sopiva rutiini, joka käsittelee kunkin keskeytyksen. En ala sekoittaa tässä yhteydessä kertomalla keskeytysten ketjutuksesta; se on tarpeetonta. Idea siis on: IRQ on osoite koodiin, joka suoritetaan kun kyseisen keskeytyksen tyyppinen tapahtuma laukeaa.
Tukiasemat ovat mobiilikielellä MSS eli Mobile switching station. Sinänsä niissä ei ole mitään mystistä, verrattuna muuhun radiotekniikkaan.
Karkeistaen voidaan sanoa, että MSS on pidemmän kantaman langaton verkko, jonka ylläpitopuolella on hieman järeämpää teknologiaa kuin kodin langattomissa verkoissa.
MSS pitää rekisteriä puhelimien sijainnista, laskutuksista ja muusta tällaisesta operaattorin kannalta olennaisesta. Tukiasemiin liittyy myös mobiilimaailman salaisuus: vain tukiaseman ja puhelimen välinen tietoliikenne on yleensä langatonta; sen jälkeen data viedään ihan normaalisti nopeissa kuituyhteyksissä sinne, missä toisen (vastapuolen) puhelin sijaitsee – ja taas radioteitse puhelimeen. Eli puhelinteknologia yhdistää tietoliikenteessään suvereenisti langatonta ja perinteistä tekniikkaa.
Leave a Reply