1

Téma: Nekomunikující SDS BIG

Zdravím, přestal mi během testování fungovat LAN interface na SDS BIG s posledním firmware. Testoval jsem intenzivně předělávaný program, a omylem jsem nealokoval pro sdilenou paměť T22 dostatečně velké pole, pouze 7B ale zapsal jsem tam 13B. Buď tímto nebo už při uploadu programu se mi SDS BIG kousnul, a není vidět že by žil LAN interface, na PC se neukáže žádná aktivita (zelená ani žlutá LED na LAN konektoru).
Poradíte je nějaká šance co s tím? Je nějaká možnost tvrdého resetu, přehrání firmware apod? Nebo jen intenzivní přehrávání programu zblblo flash že ani nenaběhne do nějakého základního bootloader režimu?


Doplnění jak jsem to vyřešil:
Bylo to tím programem, stačilo resetovat zkratováním RSTD a rychle přehrát demo programem než se to vzpamatovalo.

Naposledy upravil: aleho (2017-02-13 05:00:52)

2

Re: Nekomunikující SDS BIG

Díky za návod.
I já jsem se dostal do stejných problémů - SDS nekomunikovalo.
Nejprve jsem zkoušel přeflashovat firmware (t.j. že se RSTD zkratuje při vypnutém napájení, SDS se zapne, a po pár sekundách se zkrat odstraní) což se i podařilo a firmware se nahrál OK.
Nicméně problém to nevyřešilo a SDS dále nekomunikovalo.

Pak jsem vyzkoušel zkratovat RSTD na pár sekund za běhu a ihned po odstranění zkratu na defaultní adresu 192.168.1.250 (port: 8081, heslo: test) nahrát bezchybný program.
A to zabralo.

Naposledy upravil: drcvach (2017-02-23 10:07:21)

3

Re: Nekomunikující SDS BIG

Při startu se zapojeným RSTD se program záměrně nespustí, právě přesně z důvodů možnosti odstranit nebo přehrát chybný program.

Problémy které jsou zde popisovány budou nejspíše proto, že je v SDS nahrán FULL-C program který způsobí nějaké zaseknutí zařízení (které jinak samo o sobě funguje OK, ale byl do něj nahrán zvláštní program) - řešení je snadné, viz text výše.

Samozřejmě doporučím použití nejnovějšího FULLC.EXE pro překlad a nahrávání programu, a současné nejnovější firmware pro SDS (BIG / STSW) samotné.
Postupem času došlo k významnému zvýšení odolnosti a stability právě v ohledu FULL-C programů.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

4

Re: Nekomunikující SDS BIG

Zdravím všechny, nedaří se mi resetovat SDS-BIG-64 (firmware 8.8.2017).
Po nahrání chybného FULL-C programu přestalo zařízení komunikovat po síti, ale ani po resetu popsaným způsobem (několikrát zopakované zkratování RSTD s různými prodlevami) se činnost neobnovila - na připojeném PC/routeru se jeví jako nepřipojený ethernet kabel, přičemž na RJ45 konektoru SDS pravidelně poblikává oranžová LEDka.
Tj. po resetu nebyla šance přehrát nový FULL-C program ani FW kvůli nedostupnému ethernet rozhraní.
Máte prosím nějaký tip, co ještě vyzkoušet ?

5

Re: Nekomunikující SDS BIG

Pošlete mi ten chybný SDS-C program, ať si to mohu zreplikovat, najít a opravit chybu v SDS.

Pokud tam problikne ta LED, pořád "dokola" způsobem jakým popisujete, tak to znamená že se SDS neustále resetuje. Opravdu RSTD nepomůže (zkratovat před zapnutím a držet, pak zapnout a držet - což zřejmě už správně děláte) ? jestli je to tak, tak tam máme chybu a ta se musí opravit. Hned si to dnes vyzkouším.

Jinak - "poslední" řešení je poslat SDS na bezplatný servis výrobci, což asi bude nakonec v tomto případě potřeba.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

6

Re: Nekomunikující SDS BIG

Ok, díky, poslal jsem přímou zprávou....

7

Re: Nekomunikující SDS BIG

Program mám, bude se identifikovat co je za problém, a případně se vydá nový FW.
Díky za informace.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !

8

Re: Nekomunikující SDS BIG

Rychle jsem ten program prošel. Ještě nevím čím ten popsaný problém je způsoben, ale určitě tam vidím následující zásadní
chyby:

.
.
.
// return time formated into string
char* getTime() {
    unsigned int d, m, h, n, s;
    char t[12];
    d = SDS_get_u(5);
    m = SDS_get_u(6);
    h = SDS_get_u(8);
    n = SDS_get_u(9);
    s = SDS_get_u(10);
    sprintf( t, "%02u.%02u. %02u:%02u:%02u ", d, m, h, n, s);
    return t;
}

1. funkce vrací (return) proměnnou, která existuje jen na zásobníku funkce samotné (tzn. "t" přestane existovat jakmile se funkce ukončí).
2. velikost pole "t" je mnohem menší (jen 12 míst, viz původní kód), než množství textu který sprintf() zapíše
3. je použit sprintf() namísto bezpečného snprintf() - pokud by se použil snprintf, tak by to nepadalo (ale ano text by byl oříznutý, ale za to nemůže ta funkce, ale definice pole "t" která je moc "malá").
Pro příklad - opravený kus programu:

#define TEMP_BUF_SIZE (32)
char tempBuf[TEMP_BUF_SIZE];

// return time formated into string
char* getTime() 
{
    unsigned int d, m, h, n, s;

    d = SDS_get_u(5);
    m = SDS_get_u(6);
    h = SDS_get_u(8);
    n = SDS_get_u(9);
    s = SDS_get_u(10);
    snprintf( tempBuf, TEMP_BUF_SIZE, "%02u.%02u. %02u:%02u:%02u ", d, m, h, n, s);
    return tempBuf;
}

Opravy - používá se globalní (namísto lokální) proměnná "tempBuf", je dostatečně velká (v příkladu 32 bajtů, tj. až 31 znaků a 0x00 pro ukončení textu) a nakonec, používá se bezpečná funkce snprintf() tak jak to má být.

Doufám že tyto poznámky pomohou při dalším psaní programu. Podobný přístup se dá aplikovat na různé jiné místa . . . tzv. "defenzivní programování".


Ihned vydáváme BETA FW (který pak bude oficiální po testech), který si bude umět poradit s touto programátorskou chybou (a dalšími odvozenými chybami) - prosím vyzkoušejte, co to u vás udělá.

Pochlubte se - popište jak využíváte své zařízení SDS zde ! Můžete si bezplatně přidat svou reklamu !