FULL-C details

Z onlinetechnology.cz

Přejít na: navigace, hledání
Tato stránka popisuje programovací jazyk FULL-C, který je dostupný na vybraných zařízeních SDS. Některá zařízení používají SDS-C, pro který máme návody jinde na této WiKi.

Zde jsou popsány hlubší technologické detaily popisující princip FULL-C. Zajímat budou zejména ty, kteří pracují na složitých programech.

Obsah


Jak je to uskutečněno

Program je uživatelem zadán jako jeden jediný textový soubor - zdrojový kód v jazyce FULL-C. Tento zdrojový kód (text) je zpracován v naší Windows aplikaci (FULLC.exe, k dispozici ke stažení na této WiKi) do formy výsledného souboru, který primárně obsahuje tzv. bytecode. Tento soubor je následně přes síť nahrán do konkrétního zařízení SDS, kde je trvale uložen (až do nahrání jiného souboru) a je zařízením SDS spouštěn.

Komprese

Program je přenášen z FULLC.exe do SDS přes počítačovou síť. Aby se nemuselo přenášet tolik dat, je bytecode komprimován. Typická úspora je 25% původního objemu.

S touto informací je potřeba plánovat při navrhování rozložení paměti - aby se tam vše vešlo. To že komprimovaný program (výstup FULLC.exe) se do paměti SDS na první pohled "vleze", ještě neznamená, že se program i podaří spustit (stále se může "vlézt", ale nezbyde místo na zásobník nebo haldu - a to je konec).


ZÁKLADNÍ OMEZENÍ:

Zařízení SDS je k dispozici ve dvou základních variantách: varianta "64" má k dispozici 64kB paměti pro celkové potřeby programu, a varianta "128" má k dispozici 2x64kB (tj. 128kB) paměti pro celkové potřeby programu.

Do celé této paměti se musí vlézt nejen surový bytecode ale i všechny provozní záležítostí (zásobník - stack, proměnné, halda - heap).

Skladba paměti - varianta "64":

(START I-64kB BLOKU)

          0 + zásobník (stack)
              ...
            + řetězce programu (string blob)
              ...
            + instrukce programu (bytecode)
              ...
            + nevyužitelná rezerva systému (zhruba 260 bajtů)
              ...
            + proměnné programu (variables)
              ...
            + halda (heap)
              ...
       64kB + konec 

(KONEC I-64kB BLOKU)

Další paměť (více než 1x 64kB) už není ve variantě "64" k dispozici - vše se tedy musí vlézt do jednoho 64kB velkého bloku.


Skladba paměti - varianta "128":

(START I-64kB BLOKU)

          0 + zásobník (stack)
              ...
            + řetězce programu (string blob)
              ...
            + nevyužitelná rezerva systému (zhruba 260 bajtů)
              ...
            + proměnné programu (variables)
              ...
            + první část haldy (heap-1)
              ...
       64kB + konec 

(KONEC I-64kB BLOKU)

(START II-64kB BLOKU)

          0 + instrukce programu (bytecode)
              ...
            + druhá část haldy (heap-2), jen pokud nezabere program celý II-64kB blok
              ...
       64kB + konec

(KONEC II-64kB BLOKU)

Jak lze vidět, varianta "128" nabízí dva bloky po 64kB. Tyto bloky na sebe sice lineárně nenavazují (tj. součtem je to sice 128kB, ale ne v celku), nicméně přináší významnou úlevu předchozímu omezení původní varianty "64".

Pro použití varianty "128" je ovšem potřeba mít správný hardware (SDS), tzn. SDS výrobní varianty "64" nelze programově změnit na variantu "128" - to lze jedině použitím vhodného SDS hardware.


Další informace:

Velikost programu (bytecode + stringblob) a proměnných (variables) je pevná, a je přímo dána vámi tj. programátorem (podle toho, jaký napíšete program, tak bude tato oblast velká).

Zbytek je použit pro haldu (heap), což je různě veliký paměťový prostor který má program k dispozici (funkce: malloc,realloc,free), pokud jej tedy potřebuje. Pokud bude váš program moc velký, pak se může stát že halda nemusí existovat - a systém nebude schopen takový program vůbec spustit ! Vždy je potřeba mít haldo o velikosti alespoň hodnoty 1/8 velikosti programu.

Zásobník (stack) je vždy umístěn na začátku paměťového prostoru, a jeho velikost je opět jednorázově určena programátorem (podle odhadu nebo aktuální měření). Pokud je zásobník příliš malý, může být program předčasně ukončen (řešením je zvětšení velikosti zásobníku (na úkor velikosti heapu) a nové nahraní programu do zařízení). Toto je zřejmě nejčastější problém u většiny FULL-C programů - špatně nastavená velikost zásobníku.

Informace o aktuálním vyžití celého paměťového prostoru je k dispozici ve webovém rozhraní SDS (Menu, FULL-C). Odsud lze také přečíst skutečné využití zásobníku (nejvyšší dosažená velikost).


Heap

Typický FULL-C program v zařízení SDS nemá potřebu používat haldu (heap) - typicky všechny proměnné (i velká pole) lze bez problému staticky deklarovat.

Pokud však potřebujete dynamickou alokaci paměti, tak je k dispozici ten zbytek paměťového prostoru, který zůstane "volný" po nahrání programu (a vyhrazení zásobníku).

Informace o velikosti volného heapu a fragmentaci lze opět nalézt ve webovém rozhrazní SDS.


Opakování varování

Velikost programu je omezena takto:

  • Vše se musí vlézt do 64kB (bytecode, proměnné, zásobník) popřípadě do 2x 64kB (128kB s danými omezeními).
  • Zásobník (stack) musí mít dostatečnou velikost pro provoz programu (všechny vnořené volání funkcí, rekurze, atd.).
  • Halda (heap) musí být k dispozici o dostatečné velikosti, jinak se jakýkoliv program nespustí.

Pokud by váš přeložený program byl moc velký, a to tak že se spolu s ním do paměti nevlezou další potřebné věci (zásobník atd.), nebudete moct program na zařízení SDS spustit.

Vždy můžete kontrolovat stav programu (a využití paměti) na stránce "FULL-C" ve webové administraci zařízení SDS.


Jak programovat

FULL-C program musí vždy mít definovanou funkci main(), která je první spuštěnou funkcí v rámci spuštění programu.

 void main(void)
 {
   ;
 }

Je úkolem programátora, aby funkce main() nebyla opuštěna (potom je program "ukončen" protože nemá kam dál pokračovat) = v takovém případě je program ukončen, a znovu bude spuštěn až po restartu SDS (nebo když by byl nahrán nový program, tak je pak spuštěn ten).

FULL-C program tedy vždy začíná jako první provádět instrukce ve funkci main().


V základu lze činnosti provádět na základě těchto vstupů:

  • čas (např. každou vteřinu)
  • hardware (např. čtení vstupů)
  • hodnoty sdílených proměnných (např. změnou proměnné z uživatelské webové stránky)

Výstupy programu mohou být:

  • ovládání hardware (např. spínání relé)
  • změna hodnot sdílených proměnných (např. pro dynamické zobrazení na uživatelské webové stránce)
  • odesílání stavů přes síť (např. HTTP-GET nebo SNMP-TRAP)


Pro všechny tyto vypsané činnosti je potřeba znát funkce a příkazy, které programu umožní právě takovéto činnosti vykonavát.

Základní úvod je zde.

Osobní nástroje
Translate