Laiteläheinen C-kieli, hello.c PUNOMO NETWORKS OY 23.8.2016 pva Oletus Sinulla on GNU/Linux-Mint-koneessa (tai vastaava Windows) NetBeans-IDE konfiguroituna toimimaan SSH-etäkäytössä RaspberryPi:n kanssa. Katso Punomon sivulla NetBeans asennus ja etäkäyttö C-kielen opiskeluun, Linux, tai sama Windowsille. http://punomo.npn.fi/teeitse/punomon-ohjelmointimateriaalit/ Koodi kirjoitetaan NetBeans-ohjelmassa, työnnetään SSH-yhteydellä Raspi-koneeseen, käännetään ja ajetaan siellä. Ajotulos tulee verkon kautta NetBeansin editorin alle omaan ikkunaan. Tästä alkaa Punomon laiteläheinen C-kielen kurssi. Kaikkien ohjelmointikurssien ensimmäinen koodi, tulostaa näyttöön tekstin Hello World. Kerron tässä perusteellisesti miten toimitaan NetBeansissa kun luodaan projekti ja siihen koodia, jotta pääset IDE:n käyttöön nopeasti ja helposti. Kokeile rohkeasti, ohjelma eikä kone siitä hajoa. Ja ainahan voi vilkaista Help-napin taakse. Seuraavilla oppitunneilla kerron vain itse C-kieleen liittyvät asiat ja oletan että NetBeansin käyttö on hanskassa. Jos tarvetta, emailaa. Osoite löytyy Punomon sivuilta. Kenelle? - peruskoulun yläasteelle - lukioon - ammattioppilaitokseen - ammattikorkeakouluun - vakavaan harrastukseen - fiksujen eläkeläisten aivojumppaan Siis kaikille jotka haluavat liittää esineet internettiin IoT, Internet of Things Eli tehdä huomisen tietoyhteiskunnasta totta. Ohjelmoimaan oppii vain itse tekemällä Ohjelmoinnin opiskelu on kuin polkupyörällä ajoa, on hyvä saada ohjeita ja opastusta, on hyvä katsoa miten toiset ajavat erilaisilla pyörillä, mutta oikeasti opit ajamaan vasta kun tartut itse sarviin ja alat polkea. Nyt alamme perehtyä C-kielen perusteisiin siten, että pääset mahdollisimman nopeasti kirjoittamaan omia ohjelmia. Se on tehokkain ja mielenkiintoisin tapa oppia. Tämä nettijulkaisu keskittyy aluksi C-kielen perusasioihin, jotta mahdollisimman nopeasti pääsemme laiteläheisen C-kielen opiskeluun. Kielen hienoudet ja erikoisominaisuudet jätetään pois. Niitä ohjeita on netti pullollaan. 1
Code Ohjelman tekeminen alkaa lähdekoodista, source code. Se kirjoitetaan C-kielen kielioppisääntöjä noudattaen ja tallennetaan tavallisena ASCII-tekstinä tiedostoon. Lähdekoodista GCC-kääntäjäohjelma tekee objektitiedoston, object code, ja linkkeri-ohjelma, linker, yhdistää objektikoodin ja tarvittavat kirjastotiedostot ajettavaksi ohjelmatiedostoksi. Tutustu käännösprosessiin dokumentissa Mitä C-lähdekoodin kääntämisessä tapahtuu.pdf. ASCII-koodi (American Standard Code for Information Interchange ) on Yhdysvalloissa kehitetty ja yhteisesti maailmanlaajuiseen käyttöön sovittu tapa merkitä kirjaimet ja numerot 7- (standardi ASCII) tai 8-bitin (laajennettu ASCII) paketteina. PC-ympäristössä C-kielen opiskelun aloittavan ensimmäinen suuri haaste on ollut saada ohjelma tulostamaan kuvaruudulle teksti "Hello, World". Siitä on muodostunut kaikissa oppikirjoissa esiintyvä perinne. Niin mekin tehdään. C-ohjelman osat Jokaisessa C-kielisessä ohjelmassa esiintyvät samat peruselementit, olipa ohjelma PC:ssa ajettava iso koodi tai sulautetun järjestelmän pienen pieni koodi. Ohjelman rakenne on aina samanlainen, koko vain muuttuu. Tavallisesti ainakin seuraavat osat löytyvät: - kommentit - esikäsittelysäännöt - pääfunktio main() - muuttujat - ohjelmalauseet Töihin Käynnistä NetBeans. Luo projekti klikkaamalla File, New Project, anna projektin nimeksi hello. Luo projektiin c-tiedosto, klikkaa File, New file, anna tiedostolle nimi hello, c-tarkentimen ohjelma laittaa itse. Toinen, nopeampi tapa: New File New Project Katso tarvittaessa lisäohjeita em. pdf-ohjeesta. NetBeansin eräs hyvä puoli on se, että se tuo kaikki projektiin kuuluvat tiedostot (hakemistopuussa) mukavasti esille. Talleta. 2
Avaa Projects välilehti Projektin nimi Lähdekoodin nimi Sitten klikkaa Services välilehti auki. Klikkaa hiiren oikealla C/C++ Build Hosts, Add New Hosts, New Remote Host Setup ja lisää Raspin osoite Hostname-ikkunaan. Tänne oman Raspin osoite Next. Sitten aukeaa Identification Käyttäjän tunnus 3
Kun työ on tehty, Services-välilehden valikosta löytyy oma Raspi. Osoite ei välttämättä ole sama, todennäköisesti se alkaa Sinulla 192.168.x.y. Oman Raspin IP-osoite tulee tähän Raspin GCC-työkalut ARM-prosessorille Varmista että Raspi-etäkone on SSH-yhteydessä. Avaa NetBeansin Tools, Options, valitse C/C++ välilehti. Ellei Raspin IP-osoite ole näkyvissä, vaihda se Edit-napista. 4
Kirjoita ensimmäinen c-koodi, talleta ja sitten analysoidaan sitä. C-kielisten ohjelmien tiedostotarkentimena tulee käyttää *.c. Siitä C-kääntäjä tunnistaa käännettävän koodin. NetBeans tekee sen automaattisesti. Koodi-info Kommentit C-kielessä on kahdenlaista kommenttia, // yhden rivin kommentti /* yhden tai useamman rivin kommentti */ Kommentit ovat vain Sinulle itselle, jotta ymmärtäisit vielä huomennakin mitä ohjelma tekee. Niin ja tietysti toisille ohjelmoijille, heidänkin tulee kyetä tulkitsemaan koodia oikein ja sitä kautta ymmärtämään ohjelman toiminta. Kommentteja kannattaa käyttää sopivassa määrin, ainakin alussa mieluummin liikaa kuin liian vähän. Itsestäänselvyyksiä ei tietenkään kirjata. Kommentit tulee kirjoittaa samaan aikaan kuin itse ohjelmakoodi, jotta kaikki oleellinen tulisi kerrottua silloin kun se vielä on muistissa (oman pääsi muistissa). Heti opiskelun alussa on tärkeää oppia oikeat työmenetelmät. Siispä sovitaan, että toimit näin: Jokainen ohjelmasi sisältää aluksi kommenttirivejä, joissa on vähintään seuraavat tiedot ohjelmasta: - projektin ja tiedoston (siis ohjelman) nimi, - mille raudalle, HW, hardware, koodi on kirjoitettu - millä kääntäjällä/tulkilla lähdekoodi käännetään - päiväys, milloin ohjelma tallennettu/muutettu, - tekijän nimi tai nimilyhenne - lyhyt kuvaus mitä ohjelma tekee 5
Siis näin: /*************************************** Project : hello Code : hello.c HW : Raspberry Pi 3 SW : gcc (Raspbian 4.9.2 10) 4.9.2 Editor : NetBeans 8.1 Date : 23.8.2016 Author : pva Comments : ensimmäinen ohjelma, tulostaa näyttöön tekstin "Hello World" *************************************** Tästä voisi tehdä koodipohjan jolle vain lisätään uudet sisällöt kun aloitetaan koodaamaan uutta ohjelmaa. Näin omaksut heti oikean tavan tehdä ohjelmia ja tulet - muut ohjelmoijat etenkin - arvostamaan sitä myöhemmin, kun harrastuksesi, toivon mukaan, muuttuu ammatiksi. Header Kommenttien alla on rivi: #include <stdio.h> Lisäämällä #include-rivi, kerrotaan (esi)kääntäjälle mikä ohjetiedosto liitetään ohjelmaan mukaan. Tämä tiedosto, stdio.h - standard input output, sisältää käytössämme olevan mikro-ohjaimen käyttöohjeet, eli miten käsitellään main-funktiossa olevaa printf-funktiota ja mistä osoitteesta se löytyy. Header-tiedoston tarkoitus on koota yhteen paikkaan muuttujat ja niiden funktioiden esittelyt jotka ovat muidenkin ohjelmamoduulien käytössä. Funktio ja muuttuja C-kielen peruskäsitteitä ovat funktio ja muuttuja. Muuttujista toisella tunnilla. Funktio sisältää komentolauseita, jotka ovat ohjeita tietokoneelle. Tietokone toimii näiden ohjeiden, käskyjen mukaan. Funktioita tulee olla vähintään yksi, nimittäin pääfunktio main(). Kääntäjäohjelma tunnistaa nimen funktioksi nimeä välittömästi seuraavista kaarisulkeista (). Aaltosulkeet {} rajoittavat itse funktion rungon. { on funktion alkumerkki ja } on funktion loppumerkki. Kaikki käskyt, tiedot, määritykset, yms. kirjoitetaan aaltosulkeiden väliin. Funktion nimirivillä olevien kaarisulkeiden väliin kirjoitetaan funktion parametrit (tässä void, tyhjä, eli ei parametreja). Ne selvitetään myöhemmin. Ohjelman tekeminen alkaa lähdekoodista, source code. Se kirjoitetaan C-kielen kielioppisääntöjä noudattaen ja tallennetaan tavallisena ASCII-tekstinä tiedostoon. Lähdekoodista kääntäjä-ohjelma tekee objektitiedoston, object code, ja linkkeri-ohjelma, linker, yhdistää objektikoodin ja tarvittavat kirjastotiedostot ajettavaksi ohjelmatiedostoksi. Mitä c-käännös-prosessissa tapahtuu kerrotaan omassa pdf-tiedostossa. ASCII-koodi (American Standard Code for Information Interchange ) on Yhdysvalloissa kehitetty ja yhteisesti maailmanlaajuiseen käyttöön sovittu tapa merkitä kirjaimet ja numerot 7- (standardi ASCII) tai 8-bitin (laajennettu ASCII) paketteina. 6
Miksi main-funktion tyyppi on int? Funktion tyyppi kertoo sen palauttaman arvon tyypin. Main-funktio palauttaa arvon käyttöjärjestelmälle, muut fuktiot kutsujalleen. Tavallisesti sellaisen funktion tyypiksi, joka ei palauta arvoa, laitetaan void, tyhjä. Kun käytetään käyttöjärjestelmää, se kutsuu aina main()-funktiota, josta ohjelma alkaa/käynnistyy. Main-funktio palauttaa aina int-tyyppisen datan, muut funktiot voivat palauttaa kaikkea muutakin. Koodi kirjoitetaan GNU/Linux- tai Windows-koneen NetBeans-ohjelmassa, työnnetään SSHyhteydellä Raspi-koneeseen, käännetään ja ajetaan siellä. Ajotulos tulee verkon kautta NetBeansin editorin alle omaan ikkunaan. Ensimmäisen lähdekoodin kääntäminen Kun ohjelman lähdekoodi on valmis, se on käännettävä ARM-mikro-ohjaimen ymmärtämään muotoon. Kutsutaan C-kääntäjää klikkaamalla NetBeansin työkalurivin Built-painonappia, joka on vasara-kuvake. Jos koodi on kirjoitettu noudattaen C-kielen kielioppisääntöjä, NetBeansin alaosaan avautuu kääntämisen etenemisestä ja onnistumisesta/epäonnistumisesta kertovat viestit, notifications. Talleta C-kääntäjä C-käännös ja samantien ohjelman ajo Tärkeintä on ilmoitus BUILD SUCCESSFULL, onnistui eli ei käännösvirheitä. Jos virheitä ilmenee, tarkista lähdekoodin kirjoitusasu. Jos yksikin merkki on väärin, liikaa, puuttuu, tai on väärässä paikassa, niin kääntäjä ei ymmärrä koodia ja käännösprosessi keskeytyy. 7
Ensimmäisen lähdekoodin ajaminen Klikkaa työkalurillä olevaa vihreää nuolta. Jos käännös onnistui, niin ajokin onnistuu ja äskeiseen info-ikkunaan tulee tulostettava teksti. Ajotulos näkyy NetBeansin editorin alla olevassa ikkunassa. Vihreillä nuolilla voit ajaa ohjelman uudelleen. Punaisesta stop. Kun ajat ohjelman, hetken aikaa tulostuksen päällä on info-ikkuna joka kehoittaa kopioimaan käännetyn koodin Raspi-koneelta GNU/Linux-Mint- tai Windows-koneeseen. Klikkaa ja katsotaan mitä tapahtuu. Klikkauksen jälkeen avautuu uusi ikkuna, joka kertoo minne käännetty koodi talletetaan. NetBeansin asennuksen yhteydessä se tekee omaan Mint-koneeseen hakemiston NetBeansProjects, jonne talletetaan lähdekoodit ja niiden oheistiedostot. Nyt sinne tehdään dist-hakemisto alihakemistoineen ja hello-koodi talletetaan sinne. Huomaa, että hello on käännetty ARMprosessorille ja et voi ajaa sitä i386/x64-prosessoreissa. 8
Katsotaan ensin mitä polun päästä löytyy. Sama komentotulkin esittämänä. Siellä se on, kummallakin tavalla esitettynä. Puolipisteiden käytöstä Puolipiste (;) lopettaa c-koodirivin. Puolipiste kertoo kääntäjälle että komento on loppunut ja seuraava alkaa. Lähdekoodista tulee näin luettavampaa. Otetaan käyttöön periaate: Yksi rivi yksi komento. Rivinvaihto keno än eli \n on erikoismerkki rivinvaihtoon. Kokeile komentoja: printf ("RasPi on\n mainio\n tietokone"); printf ("RasPi on\nmainio\ntietokone"); printf ("RasPi\non\nmainio\ntietokone\n"); Tutki miten rivit tulostuvat. Keksi itse lisää. Harjoituksia. Jotta työskentely-ympäristö ja työkalut tulisivat tutuiksi tee esim tahallinen ohjelmointivirhe, vaikka käskysana väärin kirjoitettuna, jotta näet mitä sitten tapahtuu. 9