TINIs Programvare, HelloWeb, BuildDependency og Ant

Disse sidene er en del av dokumentasjonen som Ola Lie utarbeidet da han foreleste faget IP- og webteknologi ved Høgskolen i Østfold i 2005.Websidene ble revidert i 2007.

TINIs Programvare

Forrige gang introduserte PC programvaren som benyttes for å utvikle applikasjoner for TINI. Nå skal vi se på programvaren som ligger i ROM og RAM på selve mikrokontrollerkortet.

tini I flash ROM finner vi TINI OS og Java API. Innholdet i flash ROM kan overskrives og forsvinner ikke, selv uten strøm og batteri. Adresseområdene varier på ulike TINI kort. På vår plattform starter ROM på adresse 400000h. TINI har ingen harddisk. Sammenligner vi TINI med en PC, må vi benytte RAM både som hurtiglager og som filsystem. TINIs RAM beholder innholdet så lenge vi har strøm på batteriet. Vår RAM starter på adresse 000000h.

Når vi starter TINI kan vi velge om vi vil starte en boot loader eller komme rett inn i vår primære Java applikasjon. Dersom vi ønsker å laste ned firmware, starter vi JavaKit og trykker på RESET knappen. Vi kommer da inn i Auto Boot Loader som ligger i ROM på mikrokontrolleren DS80C400 i adresseområde FF0000h. Tilgjengelige kommandoer er vist nedenfor:

  COMMAND   FUNCTION
  B   Bank select
  C   CRC-16 of memory range
  D   Dump Intel hex data from selected bank
  E   Exit the loader and try to execute code
  F   Fill selected bank memory with hex data
  G   Go: Start executing code at offset 0 in the current bank
  H, ?   Help: Display ROM version and current bank
  L   Load Intel hex into memory
  N   NetBoot
  V   Verify memory against incoming hex
  X   Execute code at a given offset in the current bank
  Z   Zap: Erase/clear the current bank

Du kan lese mer om oppstartssekvensen på side 69 i databladet til ds40c800. Ved normal oppstart, når vi slår på strømmen, sjekkes først heap’en og filsystemet. Deretter initieres driverne og så startes Garbage Collector prosessen. Til slutt startes vår primære Java applikasjon.

Slush

Så lenge vi holder på med utvikling, er det greit å bruke kommando skallet, slush, som primær Java applikasjon. (Senere, når vi skal sette et system i drift, kan vi erstatte slush med vår applikasjon som primær Java applikasjon.) Etter oppstart er det 2 prosesser som kjøres: Java GC og init (slush). Verifiser med kommandoen ps. Lær deg slush kommandoene ved første å skrive dem ut med kommandoen help. Se deretter forklaringen på kommandoen ved å skrive help <kommandonavn> (f.eks. help netstat).

tini

API, JVM og TINI OS

tiniVi skal nå se nærmere på TINI OS og Java API (TINI Runtime Environment):

  • API (Application Programming Interface) inneholder de fleste klassene i kjerne pakkene i Sun’s JDK (java.lang, java.io, java.net og java.util) og egne TINI spesifikke klasser i pakken com.dalsemi.
  • TINI’s Java Virtual Machine (JVM) som utfører Java bytecode støtter mye av funksjonaliteten som finnes i JVM implementeringer
  • Infrastrukturen i TINI OS blir gjort tilgjengelig til API gjennom native methods. De aller fleste utviklerne får gjort det de skal i Java. Dersom man må programmere på lavere nivå, gjør man det ved bruk av native methods grensesnittet.
  • Process & Thread Schedulers sørger for tildeling av CPU tid til de ulike prosessene og trådene som kjøres (round robin).
  • Memory Management System er delt i 3:
  1. Heap Manager: Den første delen av RAM er avsatt til systemet. Resten kalles for heap. Heap Manager tildeler minneområder fra heap’en til Java og system prosesser (F.eks. når vi oppretter et nytt objekt med operasjonen new).
  2. Garbage Collector (gc) prosessen igangsettes ved oppstart. Den frigir reserverte minneområder eksempelvis når Java prosesser avsluttes.
  3. File System Manager håndterer filsystemet og får tildelt minneområder fra samme (heap’en) som benyttes av Java objekter. Minneområder som er allokert til filsystemet er spesielt merket slik at de ikke blir krevd tilbake av Garbage Collector.
  • I/O Subsystem er delt i 2:
  1. TCP/IP Stack håndterer kommunikasjonen over Ethernet/Internet
  2. I/O Manager tar seg av de serielle bussene (Serial, CAN, 1-Wire, I2C)

HelloWeb

Vi skal nå installere en enkel Webtjener på TINI som beskrevet på side 33 i Getting started with TINI. På TINI skal vi lage vår egen lille Webtjener ved bruk av java og klassebiblioteket com.dalsemi . Funksjonaliteten til klassen HTTPServer er beskrevet API dokumentasjon som installeres lokalt til mappen

  •  \tinix.xx\docs\javadocs\modules\com\dalsemi\tininet\http\HTTPServer.html

Vi spesifiser blant annet rot katalogen for Websidene (setHTTPRoot) og hvilket dokument som skal være hjemmside (setIndexPage). HTTP bruker standard port 80. Det angir vi enten når vi lager objektet, new HTTPServer(80) eller med setPortNumber(80).

TINIs HTTPServer har også muligheten til å logge enkle data ved å benytte setLogging og setLogFilename. Vi får kun med oss IP adressen til klienten samt websiden som blir forespurt. Kildekoden til HelloWeb.java ser slik ut:

tini

Programmet kompileres med kommandoen (på en linje):

javac -target 1.1 -source 1.3 -bootclasspath %tini_home%\bin\tiniclasses.jar -classpath %tini_home%\bin\modules.jar;. HelloWeb.java

Konvertering med BuildDependency

Når vi skal ha med klasser fra klassebiblioteket som ikke ligger på TINI, kan vi gjøre dette med -f bryteren til TINIConvertor. Klasser er ofte avhengige av andre klasser som også må bygges inn i applikasjonen, og man mister lett oversikten. Derfor er det bedre å bruke BuildDependency. I dette tilfellet blir HTTPSERVER brukt som oppslag i owapi_dep.txt hvor det står hvilke klasser som må være med. Disse hentes fra modules.jar. Resten slippes igjennom til TINIConvertor som tar seg av de andre parameterne ( -f, -o og –d). Programmet konverteres med kommandoen (på en linje):

java -cp %tini_home%\bin\tini.jar BuildDependency
-f HelloWeb.class –o HelloWeb.tini
-d %tini_home%\bin\tini.db
-p %tini_home%\bin\modules.jar
-x %tini_home%\bin\owapi_dep.txt
-add HTTPSERVER

tiniDa er vi nesten i mål. Overfør HelloWeb.tini og websiden index.html (eller en du lager selv) til TINI med ftp. Telnet til TINI og opprett katalogene /html og /log (md html og md log) og flytt index.html fra rot til /html (mv index.html /html). Bruk cd html og cd .. til å bevege deg mellom rot og html katalogen. Se på filer og kataloger med dir eller ls -l. Start webtjeneren med kommandoen java HelloWeb.tini &. Avslutt med å åpne en nettleser å skrive inn IP adressen til TINI (her 192.168.1.10). Stopp webtjeneren med først å se hvilket prosessnummer den har med kommandoen ps. Dersom prosessnummeret er 3, stopper du HelloWeb.tini med kill 3. Se på log filen ved å gå til log katalogen (cd log) og gi kommandoen cat web.log.

Ant og TiniAnt

Det blir lange og kronglete kompilering- og konverteringskommandoer for TINI filer. Dessuten må vi overføre filene til TINI etter at vi har klargjort dem på PCen. Dette kan vi automatisere med ant som er integrert i eclipse.

Dersom at alt skal virke fra eclipse, må vi først installere Tiniant som beskrevet på siden  Ant og TiniAnt. Dessuten er ftp oppgaven i ant avhengige av eksterne biblioteksfiler, commons-net-1.4.1.jar, som vi pakker ut i mappen \eclipse\plugins\org.apache.ant_1.6.5\lib. Da er vi klare:

  1. tiniVelg c:\tip som workspace når du starter eclipse
  2. Velg Window → Open Perspective → Java (og eventuelt Window → Reset Perspective)
  3. File → New → Project og dobbeltklikk Java Project
  4. Kall prosjektet for HelloWeb og velg Create separate source and output folders
  5. Høyreklikk på src mappen i Package Explorer og importer HelloWeb.java
  6. Project → Properties → Libraries → Add External JARs... C:\tini1.17\bin\modules.jar
  7. Høyreklikk på HelloWeb mappen i Package Explorer og importer index.html og build.xml
  8. Window → Preferences → Ant → Runtime, klikk Classpath fanen, klikk Ant Home Entries og klikk Add External JARs... og legg til \eclipse\plugins\org.apache.ant_1.6.5\lib\commons-net-1.4.1.jar
  9. Høyre klikk build.xml i Package Explorer utsynet og velg Run As → 1. Ant Build
  10. Dersom alt har gått bra, vil du se følgende meldinger i Console utsynet:

tini

Dersom du nå gjør endringer i kildekoden, kan du bare kjøre build.xml på nytt. Når du skal lage et nytt prosjekt, kan du kopiere build.xml filen og gjøre enkle endringer.