FULL-C: general functions: Porovnání verzí

Řádek 13: Řádek 13:
 
         void SDS_heap_stats(unsigned int *currentAllocatedBytes,  
 
         void SDS_heap_stats(unsigned int *currentAllocatedBytes,  
 
unsigned int *totalFreeBytes, unsigned int *biggestFreeBlockAvailable);
 
unsigned int *totalFreeBytes, unsigned int *biggestFreeBlockAvailable);
 +
</pre>
 +
 +
 +
== Důležité systémové indexy ==
  
        void SDS_disable_onewire(void);
+
40
        void SDS_rescan_onewire(unsigned int BUSnr);
+
86
</pre>
+
87
 +
132
 +
133
 +
134
 +
135
 +
136
 +
137
 +
183
 +
184
 +
185
  
  
Řádek 133: Řádek 146:
 
}
 
}
 
</pre>
 
</pre>
 
 
== SDS_disable_onewire: Princip ==
 
 
Tato funkce je určena pro uživatele modulů SDS-STSW, které nemají osazený chip 1-Wire Master. Jedná se o některé uživatele (OEM integrátoři) tohoto modulu, kteří v zájmu snížení ceny požadali o vynechání HW podpory pro 1-Wire sběrnici (toto snížení ceny se promítne ale pouze od XYZ odebraných kusů).
 
 
Funkci '''SDS_disable_onewire()''' je v takovém případě potřeba zavolat hned na začátku FULL-C programu - tím se vyřadí automatické spuštění 1-Wire sběrnice, které se samozřejmě nemůže na omezeném HW (kde chybí 1-Wire Master chip) povést. Dojde tedy k šesti pokusům o navázání komunikace, a všechny logicky selžou - a pro zajištění stabilního provozu, je vhodné tomuto celému procesu jednoduše předejít (touto funkcí).
 
 
''Poznámka:'' podobná funkce je k dispozici i pro SD kartu, tedy funkce SDS_disable_sdc(), viz příslušný návod.
 
 
 
== SDS_rescan_onewire: Naplánování prozkoumání (rescan) OneWire sběrnice ==
 
 
Dostupné ve firmware od 06/2022.
 
 
Provede zcela stejnou akci, jako je uživatelem stisknuté tlačítko na webovém rozhraní - tedy rescan vybrané sběrnice OneWire.
 
 
Spuštění rescanu je časováno, tedy dojde k němu s pevným zpožděním od zavolání této funkce.
 
 
* sběrnice A : BUSnr = 0
 
* sběrnice B (pozor není na SDS-STSW a odvozených): BUSnr = 1
 
 
Průběh je potřeba sledovat čtením patřičných indexů (2000 až 3000) pro jednotlivé pozice OneWire zařízení. Každé nalezené OneWire zařízení musí mít platný ROMcode - jinak je ROMcode nulový (= zařízení na dané pozici nenalezeno).
 
 
Zavolání funkce (nebo identicky, spuštění rescanu z webového rozhraní), vynuluje obsah index (busA) 2498 nebo (busB) 2996. V okamžiku dokončení rescanu je do tohoto odpovídajícího indexu zapsán výsledek. Váš program tak může čekat, dokud se výsledek v daném indexu neobjeví (nebo dokud nedojde k timeoutu, což si ale musíte ošetřit ve svém programu sami).
 
 
 
Hodnoty 2498 respektive 2996:
 
* -1 = chyba, rescan se neprovedl
 
*  0 = neprobíhá rescan
 
*  1 = čekáme na spuštění rescan (časová prodleva)
 
*  2 = rescan právě probíhá
 
*  4 = rescan úspěšně dokončen ale nic nenaleznul
 
*  8 = rescan úspěšně dokončen a bylo nalezeno alespoň 1 zařízení
 
 
 
Počet nalezených OneWire zařízení viz indexy (busA) 2499 a (busB) 2997.
 
 
Rescan lze spustit pouze pokud je sběrnice OneWire povolena, a pouze pokud už systém obsluhy OneWire naběhnul (index 2998 na hodnotě 8).
 

Verze z 31. 12. 2022, 12:55

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.

Nezařazené funkce FULL-C

Zde je seznam různých funkcí, které FULL-C poskytuje a které nejsou blíže popsány na specifické tématické stránce:

         void SDS_reset_program(unsigned int key);
         void SDS_set_wdg(unsigned int newTimeOut);
         void SDS_kick_wdg(unsigned int key);

         void SDS_heap_stats(unsigned int *currentAllocatedBytes, 
unsigned int *totalFreeBytes, unsigned int *biggestFreeBlockAvailable);


Důležité systémové indexy

40 86 87 132 133 134 135 136 137 183 184 185


SDS_reset_program: okamžité nové spuštění FC programu

Zavoláním této funkce, se správně vyplněným parametrem key, dojde k okamžitému znovu-spuštění aktuálního FULL-C programu. Tedy prakticky totéž, jako by došlo k resetu zařízení (ale to se nestane, SDS pokračuje v práci a nic se s ním při zavolání této funkce nestane; dojde pouze a jenom k ukončení a okamžitému novému spuštění nahraného FC programu).

Podmínkou je předání hodnoty key jako čísla 1.

 // 
 SDS_reset_program(1);  // reset programu se provede jen a pouze, pokud je parametr == 1
 
 // nebo takto:
 
 unsigned int k;
 k = 1234;
 SDS_reset_program(k); // protoze "k" neni 1, program bude pokracovat (nestane se restart programu)
 
 k = 1;
 SDS_reset_program(k); // a ted uz se program spusti odznova, protoze klic je 1 


SDS_set_wdg: spuštění dohledu správněhu běhu FC programu

Funkce nastaví a okamžitě spustí Watchdog pro FULL-C program - cílem je hlídat "nezaseknutí" vašeho FULL-C programu.

Stanovíte si, jak často se váš FULL-C program musí "hlásit" že je v pořádku (nezaseknutý), a pokud se váš program do té doby neohlásí (např. zůstane "zaseknutý" v nějaké smyčce), tak SDS okamžitě provede jeho ukončení a následně spustí FC program znovu.

Tato funkce tedy spustí odpočet, a pokud se tento dopočítá (z vámi nastavenou hodnotu) na nulu, dojde k popsanému restartu FC programu.

Parametr newTimeOut nastavuje cílovou hodnotu odpočtu, a je uveden v sekundách. Příklad: SDS_set_wdg(10) spustí hlídání FC programu a pokud do 10 sekund není zavolána funkce SDS_kick_wdg, tak dojde k znovu-spuštění FC programu.

Jakmile je jednou hlídač spuštěn, nelze jej deaktivovat - to se stane pouze při fyzickém restartu zařízení SDS, při nahrání nového FC programu, nebo při jeho novém spuštění. Při každém spuštění FC programu (nezávisle na důvodu, jestli to bylo nahráním nového programu, nebo jeho restartem), tak je hlídač vypnut - a FC program jej musí nastavit a spustit zavoláním funkce SDS_set_wdg().

FC program si může zjistit, že jeho aktuální spuštění bylo vyvoláno právě z tohoto důvodu (zaseknutí) a podle toho se "zařídit" (např. poslat zprávu, přejít do nouzového režimu, atd. podle toho jak si to sami vymyslíte pro svou aplikaci).


SDS_kick_wdg: průběžná aktualizace dohledu běhu FC programu

Funkce se volá opakovaně a musí se vždy stihnout zavolat (od svého posledního zavolání) v rámci nastaveného intervalu (viz funkce SDS_set_wdg).

Zavolání SDS_kick_wdg dojde k nastavení odpočtu hlídače běhu FC programu, a odpočet tedy začne znovu klesat (může klesat až do nuly, kdy dojde k restartu programu - není-li odpočet včas znovu nastaven nahoru).

Pokud tedy včas nezavoláte tuto funkci, dojde k restartování FC programu. Toto je záměr, kdy se vám např. program zasekne, tak s tím je potřeba něco udělat - a tento hlídač se o to postará.

Je na vás, správně rozmístit volání SDS_kick_wdg do vašeho FC programu - není to jednoduché, a může se stát, že přehlédnete místo, kam to ještě bylo potřeba vložit. Důsledné testování vašeho FC programu je tedy na místě !

Parametr key při volání SDS_kick_wdg() musí mít přesně stejnou číselnou hodnotu, jakou jste předali v parametru newTimeOut při prvním volání funkce SDS_set_wdg(). Pokud zavoláte funkci SDS_kick_wdg() s jinou hodnotou, je to jako by jste tuto funkci nezavolali - a hlídací odpočet dále pokračuje k nule.

Příklad obsluhy FC-watchdogu

void main(void)
{
  // start programu
  SDS_set_wdg(16);   // nastav watchdog na 16 sekund
 
  // . . .
 
  for (;;)
  {

    // . . .

    if (vse_je_ok)
    {
      SDS_kick_wdg(16); // znovunastavení hlídače, od teď máme zase až 16 sekund . . .
    }

    // . . .

  }

SDS_heap_stats: Princip

Celý FULL-C program, včetně všech proměnných, je umístěn v jednom 64kB nebo 128kB nebo 512kB bloku paměti RAM (viz stránka s popisem detailu využití paměti RAM v SDS). Všechna paměť, kterou program z těchto celkových kB RAM nevyužije, je k dispozici programu pomocí funkce malloc().

Některé další funkce (zejména funkce pro práci se sítí, jako je například snmp_send_trap() ), vyžadují chvilkově část této volné paměti pro svou činnost. Pokud tato paměť není k dispozici (buď je do zařízení nahrán tak velký program, že ji vyčerpá už při svém úvodním spuštění) (nebo program použil malloc() natolik, že volný heap vyčerpal), tak se tyto FULL-C funkce nepovede provést (bude vrácen příslušný chybový kód = nedostatek paměti).

Pro aktuální zjištění situace (tj. kolik je volné paměti a jaký největší blok paměti (v kuse) lze alokovat), je zde k dispozici funkce SDS_heap_stats().


SDS_heap_stats: Příklad

Příklad vypíše stav paměti heap, potom alokuje 2kB paměti, a potom znovu vypíše stav, potom alokovanou paměť uvolní a naposledy vypíše stav. Sledujte text který tento program napíše do konzole.

void main(void)
{
 unsigned int currentAllocatedBytes, totalFreeBytes, biggestFreeBlockAvailable;
 void * ptr;

 printf("START\n");

 SDS_heap_stats(&currentAllocatedBytes, &totalFreeBytes, &biggestFreeBlockAvailable);
 printf("currentAllocatedBytes: %uB, totalFreeBytes: %uB, biggestFreeBlockAvailable:%uB \n\n",
        currentAllocatedBytes, totalFreeBytes, biggestFreeBlockAvailable);

 printf("ALLOC 2048 BYTES\n");
 ptr = malloc(2048);

 SDS_heap_stats(&currentAllocatedBytes, &totalFreeBytes, &biggestFreeBlockAvailable);
 printf("currentAllocatedBytes: %uB, totalFreeBytes: %uB, biggestFreeBlockAvailable:%uB \n\n",
        currentAllocatedBytes, totalFreeBytes, biggestFreeBlockAvailable);

 printf("FREE PTR\n");
 free(ptr); ptr = 0;

 SDS_heap_stats(&currentAllocatedBytes, &totalFreeBytes, &biggestFreeBlockAvailable);
 printf("currentAllocatedBytes: %uB, totalFreeBytes: %uB, biggestFreeBlockAvailable:%uB \n\n",
        currentAllocatedBytes, totalFreeBytes, biggestFreeBlockAvailable);

}