Palm-koodin segmentointi Garnet OS Development Suitessa

Tämän selostuksen tarkoituksena on näyttää tarvittavat työvaiheet, joilla koodisegmentin kokoon nähden liian isoksi kasvanut ohjelma voidaan segmentoida, siis jakaa useampiin koodisegmentteihin ongelman ratkaisemiseksi. Huomaa, että segmentointi onnistui ensimmäistä kertaa juuri ennen tämän selostuksen kirjoittamista, joten ohjeen toimivuutta ei ole vielä perusteellisesti testattu, mutta ainakin alustavasti se toimii ja segmentointiongelma vaikuttaisi siis ratkenneen.

Onnistuin näillä työvaihella linkittämään ohjelman (Answer ohjelma liian isoksi kasvaneena), joka ei aiammin suostunut linkittymään. Siirsin ja testasin ohjelman Palmissa. Se ilmestyi näkyviin päävalikkoon ja toimi moitteetta, toisin kuin aieammin, jolloin ohjelma ei joko linkittynyt lainkaan tai ei ilmestynyt valikossa näkyviin vaikka se olisikin linkittynyt.

1. Lisää projektiin .def tiedosto

Alla olevassa kuvassa näkyy tästä esimerkki. Esimerkiksi Answer-ohjelmaan on lisätty Answer.def-niminen tiedosto projektin juureen. En tiedä vielä millaiset tämän tiedoston nimeämissäännöt ovat. Pitääkö sen olla esimerkiksi samanniminen kuin projekti tms. Mutta ainakin projektin nimi + .def näyttäisi toimivan. Tiedostossa on ensin yhdellä rivillä ohjelman nimi ja tekijän koodi (siis se koodi joka asetetaan projektia luotaessa). Seuraavalla rivillä luetellaan tarvittavat koodisegmentit. Koska ohjelma on juuri ja juuri liian iso, luomme vain yhden ylimääräisen koodisegmentin. Ilmeisesti turhien koodisegmenttien nimeämistä kannattaa välttää, sillä erään lähteen mukaan sellaisten koodisegmenttien nimeäminen, joita ei käytä voi johtaa ongelmiin. En tiedä mitä ne ovat, mutta niitä lienee parempi välttää...

kuva1

2. Lisää segments.h-otsikkotiedosto

Otsikkotiedoston käyttäminen ei ole välttämätöntä, mutta on varmaan parempi tapa kuin #define:t irrallisina tiedostojen alussa.

kuva2

3. Sisällytä luomasi otsikkotiedosto sinne missä funktioita pitää jakaa eri segmentteihin

Valitsin sattumanvaraisesti AppMain.cpp-tiedoston ja sieltä TestXMLParser-funktion. Tämän funktion siirtämiseksi eri koodisegmenttiin sisällytämme ensin segments.h-otsikkotiedoston AppMain.cpp-tiedoston alkuun.

kuva3

4. Merkitse ne funktiot, jotka pitää jakaa eri segmenttiin kuten alla on näytetty

Laitamme nyt vain yhden funktion toiseen segmenttiin. Se riittää ratkaisemaan koodin koko-ongelman. Jos lisäämme uusia funktioita, eli koodin koko kasvaa, voimme laittaa varmaan myös nämä uudet funktiot (tai sitten jotkin vanhoista) toiseen segmenttiin ja luoda tarvittaessa myös useampia segmenttejä. Muistelen, että kutsujen välillä pitää kuitenkin pyrkiä välttämään liian pitkiä välimatkoja eri koodin osien välillä. Huomaa, että kaikkia funktioita ei onneksi tarvitse jakaa manuaalisesti segmentteihin, kuten jonkin ohjeen mukaan muistaakseni piti tehdä. Riittää siis merkitä vain ne funktiot, jotka eivät tule oletussegmenttiin.

kuva4

5. Lisää projektin asetuksiin kääntäjälle symboli MULTIPLE_CODE_SEGMENTS

Kuten alla on näytetty. Avaa Symbol-näkymä PRC-Tools 68K Compiler:in alta. Paina lisäysnappulaa ja kirjoita MULTIPLE_CODE_SEGMENTS. Hyväksy symbolin lisäys ja paina Apply- ja OK-nappuloita.

kuva5

6. Valmista. Ohjelman pitäisi linkittyä ja toimia normaalisti

Valitse tarvittaessa Clean projektin kääntämiseksi puhtaalta pöydältä. Alla on kuva ohjelman tulosteesta. Se ei liity varsinaisesti tähän selostukseen, mutta huomaa kuitenkin XML-elementit. Eli palmissa voi vastausformaatin kirjoittaa aiemman rivipohjaisen .dat-muodon sijasta tietenkin myös XML:llä.

kuva6