Laiteläheinen C-kieli osa 1 pva 12.7.2016 Osion sisältö Ohjelmoimaan oppii vain itse tekemällä Ensimmäinen projekti ja ensimmäinen ohjelma hello.c Oletus Sinulla on käytössäsi 1. GNU/Linux (Mint) pöytäkone tai kannettava, jossa oletuksena GCC kääntäjä valmiina, Windows ohjeet tulossa 2. NetBeans 8.1 IDE-C/C++ asennettuna ja toimintakuntoon konfiguroituna 3. Raspberry Pi 3, konfiguroituna 4. LAN, tietokoneet on kytketty omaan paikallisverkkoon 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. Seuraavassa osassa (osa 2) 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 vain C-kielen perusasioihin, laiteläheisiin perusasioihin. Kielen hienoudet ja ominaisuudet, jotka on tarkoitettu isojen koneiden isojen ohjelmien kirjoittamiseen 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 linkkeriohjelma, linker, yhdistää objektikoodin ja tarvittavat kirjastotiedostot ajettavaksi ohjelmatiedostoksi. Tutustu (edes alustavasti, myöhemmin perusteellisemmin) 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. Siis 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 Ensimmäinen ohjelma hello.c /*********************************************** Project : eka File : hello.c Hardware : Raspberry Pi3 Software: gcc (Raspbian 4.9.2-10) 4.9.2 IDE : NetBeans 8.1 Date : 12.7.2016 Author : pva Comments : tulostaa näytölle tekstiä ************************************************/ #include <stdio.h> int main(void) { /* tulostetaan tekstiä näytölle */ printf("hello Raspi and World!\n"); return 0; } 2
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, hardware, koodi on kirjoitettu - millä C-kääntäjällä lähdekoodi on käännetty - päiväys, milloin ohjelma tallennettu/muutettu, - tekijän nimi tai nimilyhenne - lyhyt kuvaus mitä ohjelma tekee Näin omaksut heti oikean tavan tehdä ohjelmia ja tulet - muut ohjelmoijat etenkin - arvostamaan sitä myöhemmin, kun harrastuksesi, toivon mukaan, muuttuu ammatiksi. Ensimmäiset rivit ohjelmassamme sisältävät huomautuksia, kommentteja. Huomautukset 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). Kommentteja voidaan määrittää kahdella eri tavalla: // kommentti - kaksi kauttaviivaa kertoo c-kääntäjälle, että koko rivi tulee ohittaa, siis ei huomioida. Tämä tapa tulee C++-ohjelmasta, mutta se toimii myös C-kääntäjä-ympäristössä (C99). Käytä tätä yhden rivin kommentteihin. /* kommentti */ - on C-kielen alkuperäinen (ISO C90 = ANSI C 89) merkintä. Käytä tätä tapaa, jos kommentti on pidempi kuin yksi rivi. Esikäsittelysäännöt, direktiivit, directives Lisäämällä #include-rivi, kerrotaan esikääntäjälle (ei siis varsinaiselle kääntäjälle) mikä ohjetiedosto liitetään ohjelmaan mukaan. Tämä tiedosto, stdio.h (Standard Input/Output) sisältää normioidun osan kääntäjäpaketista, tässä tapauksessa ohjeet miten printf-funktiossa tulostetaan merkit näytölle (yleisesti tiedosto sisältää ohjeet näppäimistön ja näytön ohjaamisesta, input/output). Näin koodista tulee yksinkertaista. Kirjastotiedosto on koodivarasto, joka helpottaa meidän työtämme ja jota ilman ohjelma ei toimi. Näitä hiidereitä kuuluu ANSI-C-normin kirjastoon kymmenittäin. Risuaita #-käskyt eivät ole mukana kääntäjälle menevässä koodissa, sillä en eivät ole ohjelmakoodia, vaan ohjetekstiä esikääntäjälle. Hieman yksinkertaistaen: #include on leikkaa ja liimaa -toiminto. Se hakee tiedoston sisällön ja upottaa sen siihen kohtaan, jossa #include-rivi koodissa on. 3
Kulmat, brockets, < > kertovat, että tiedosto on talletettu oletuksena /usr/includehakemistoon muiden headereitten joukkoon. Jos tiedosto olisi talletettu samaan kansioon kuin koodi, se tulee ympäröidä with double quotes. Sellainenkin malli tulee vielä. Header-tiedoston tarkoitus on koota yhteen paikkaan muuttujat ja niiden funktioiden esittelyt jotka ovat muidenkin ohjelmamoduulien käytössä. Kun ohjelma on pieni, niitä ei tarvita, siis kirjastotiedostoja lukuunottamatta. Kun ohjelmasi kasvavat monia moduuleita käsittäviksi, silloin niitten merkitys tulee tärkeäksi. Matkan varrella headereista lisää. *.h, oikeaoppisessa header-tiedostossa ei ole ajokelpoista koodia. C-kielen ohjelmissa headereissa - määritetään vakioita - määritetään makroja - esitellään ohjelmassa käytettävät funktiot, c-tiedostot, yms. Funktio ja muuttuja C-kielen peruskäsitteitä ovat funktio ja muuttuja. Muuttujiin tallennetaan käsiteltäviä tietoja. Funktio sisältää komentolauseita, jotka ovat ohjeita tietokoneelle. Tietokone toimii näiden ohjeiden, käskyjen mukaan. Kun käytetään käyttöjärjestelmää, se kutsuu aina main()-funktiota, josta ohjelma alkaa/käynnistyy. Kääntäjäohjelma tunnistaa nimen funktioksi nimeä välittömästi seuraavista kaarisulkeista (). Funktioita tulee olla vähintään yksi, nimittäin pääfunktio main(). Miksi main-funktion tyyppi on int? Funktion tyyppi kertoo sen palauttaman arvon tyypin, kuten opit perusteellisesti myöhemmin. Tavallisesti sellaisen funktion tyypiksi, joka ei palauta arvoa, laitetaan void, tyhjä. Kääntäjä olettaa main-funktion tyypin olevan int, koska se palauttaa tietoa käyttöjärjestelmälle. Funktion nimirivillä olevien kaarisulkeiden väliin kirjoitetaan funktion parametrit, tässä vain määritys void, tyhjä, eli ei parametreja. Aaltosulkeet {} rajoittavat itse funktion rungon. { on funktion koodilohkon alkumerkki ja } on loppumerkki. Kaikki käskyt, tiedot, määritykset, yms. kirjoitetaan aaltosulkeiden väliin. printf(); funktion kutsu, kaarisulkeiden välissä on lainausmerkkien ympäröimänä tulostettava teksti. Funktio on määritelty stdio.h headerissa. Ohjelma kertoo loppuessaan onnistumisestaan. Siksi tyyppinsä mukaisesti mainfunktio palauttaa kokonaisluvun (int). Yleensä 0 = onnistui, jos luku > 0 = epäonnistui Kun olet pidemmällä avr-gcc-kääntimen opinnoissa, voit käydä tutkimassa asiaan tarkemmin dokumentissa C-lähdekoodin kääntäminen.pdf. 4
Töihin NetBeansin käyttöohje:http://punomo.npn.fi/teeitse/netbeans-asennus-jakayttoonotto/ ja sieltä avautuvasta pdf-tiedostosta kohta: Ensimmäinen projekti. Avaa se aina ohjelmien kehityksessä, kunnes homma alkaa käydä ilman ohjetta. Käynnistä NetBeans. Ensin pitää luoda projekti ja kirjoittaa sekä tallettaa ensimmäinen C-kielinen ohjelma. Annetaan projektille nimeksi eka. NetBeansin eräs hyvä puoli on se, että se tuo kaikki projektiin kuuluvat tiedostot (hakemistopuussa) mukavasti esille. Projektin nimi Lähdekoodin nimi Sitten kirjoitetaan koodi editori-ikkunassa Source. Talleta. 5
NetBeansin Files-välilehti Huomaa, että eka-projektikansio sisältöineen on pöytäkoneessa jossa NetBeans toimii. Sama asia kaapattuna Mintkoneen tiedostojärjestelmästä. Sitten varmistetaan, että Raspin c- kääntäjän työkaluketju on käytettävissä. Tämä siksi, että käännös ei tapahtu pöytäkoneessa kuten tavallisesti, vaan Raspi-koneessa, joka on omassa LANpaikallisverkossa. 6
IDE-ikkunan ulkoasua voi muutella halutuksi. Jos virheilmoituksia on paljon, niin niiden korjaamisen ajaksi kannattaa alimmalla oleva info-fikkuna suurentaa. Tai jos koodia kirjoitellaan, silloin saattaa olla mukavaa, jos editori-ikkuna on iso. 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. 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äännin ei ymmärrä koodia ja käännösprosessi keskeytyy. 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. Kerrataan vielä: Koodi kirjoitetaan ja talletetaan GNU/Linux-Mint-koneessa. Käännöstä varten lähdekoodi kopioidaan verkon kautta Raspiin ja käännetään siellä, koska Raspissa on ARM-prosessori. (Ristikäännös kerrotaan toisaalla). Ajo tapahtuu tottakai myös Raspissa ja ohjelman tulostus siirretään verkon kautta NetBeansin oikealla alaosassa olevaan info-ikkunaan. 7